@stacksjs/cloud 0.72.57 → 0.72.61

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +3 -3
  2. package/package.json +11 -11
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  // @bun
2
- import{config as I}from"@stacksjs/config";import{InfrastructureGenerator as f}from"@stacksjs/ts-cloud";class h{generator;cloudConfig;props;constructor(H,z){this.cloudConfig=H,this.props=z;let Q=(z.appEnv==="local"?"development":z.appEnv)||"production";this.generator=new f({config:this.cloudConfig,environment:Q})}generate(){return this.generator.generate().toJSON()}shouldDeployApi(){return I.cloud.api?.deploy??!1}}import{AWSClient as R,AWSCloudFormationClient as j,CloudWatchLogsClient as b,EC2Client as q,IAMClient as S,LambdaClient as N,Route53DomainsClient as g,S3Client as v,SSMClient as y}from"@stacksjs/ts-cloud";import{config as x}from"@stacksjs/config";import{err as $,handleError as w,ok as K}from"@stacksjs/error-handling";import{log as V}from"@stacksjs/logging";import{path as E}from"@stacksjs/path";import{slug as d}from"@stacksjs/strings";var k=x.app.env==="local"?"dev":x.app.env,T=`stacks-cloud-${k}`;async function D(H,z={}){let Q=new R,Z={Action:H,Version:"2016-11-15",...z};return await Q.request({service:"ec2",region:"us-east-1",method:"POST",path:"/",queryParams:Z})}async function l(H,z,Q){return await new R().request({service:"logs",region:H,method:"POST",path:"/",headers:{"Content-Type":"application/x-amz-json-1.1","X-Amz-Target":`Logs_20140328.${z}`},body:JSON.stringify(Q)})}async function u(H,z,Q){return await new R().request({service:"elasticfilesystem",region:"us-east-1",method:z,path:Q})}async function m(H){let z=new q("us-east-1"),{SecurityGroups:Q}=await z.describeSecurityGroups({Filters:[{Name:"group-name",Values:[H]}]});if(!Q)return $(`Security group ${H} not found`);if(Q[0])return K(Q[0].GroupId);return $(`Security group ${H} not found`)}function Xz(H,z){let Q=new g,Z=z.contactType.toUpperCase()||"PERSON",X=(Y)=>Y.toString().includes("+")?Y.toString():`+${Y.toString()}`;try{return K(Q.registerDomain({DomainName:H,DurationInYears:z.years||1,AutoRenew:z.autoRenew||!0,AdminContact:{FirstName:z.adminFirstName,LastName:z.adminLastName,ContactType:Z,OrganizationName:z.adminOrganization,AddressLine1:z.adminAddressLine1,AddressLine2:z.adminAddressLine2,City:z.adminCity,State:z.adminState,CountryCode:z.adminCountry,ZipCode:z.adminZip.toString(),PhoneNumber:X(z.adminPhone),Email:z.adminEmail},RegistrantContact:{FirstName:z.registrantFirstName,LastName:z.registrantLastName,ContactType:Z,OrganizationName:z.registrantOrganization,AddressLine1:z.registrantAddressLine1,AddressLine2:z.registrantAddressLine2,City:z.registrantCity,State:z.registrantState,CountryCode:z.registrantCountry,ZipCode:z.registrantZip.toString(),PhoneNumber:X(z.registrantPhone),Email:z.registrantEmail},TechContact:{FirstName:z.techFirstName,LastName:z.techLastName,ContactType:Z,OrganizationName:z.techOrganization,AddressLine1:z.techAddressLine1,AddressLine2:z.techAddressLine2,City:z.techCity,State:z.techState,CountryCode:z.techCountry,ZipCode:z.techZip.toString(),PhoneNumber:X(z.techPhone),Email:z.techEmail},PrivacyProtectAdminContact:z.privacyAdmin||z.privacy||!0,PrivacyProtectRegistrantContact:z.privacyRegistrant||z.privacy||!0,PrivacyProtectTechContact:z.privacyTech||z.privacy||!0}))}catch(Y){return $(Y)}}async function B(H){if(!H)H=`${T}/JumpBox`;let Q=await new q("us-east-1").describeInstances({Filters:[{Name:"tag:Name",Values:[H]}]});if(Q.Reservations?.[0]?.Instances?.[0])return Q.Reservations[0].Instances[0].InstanceId;return}async function c(H,z){if(!z)z=T;if(!H)return $(`Instance ${H} not found`);return await new q("us-east-1").terminateInstances([H]),K(`Instance ${H} is being terminated`)}async function Yz(H){if(!H)H=T;let z=await B();if(!z)return $("Jump-box not found");return V.info(`Deleting jump-box ${z}...`),await c(z,H)}async function Zz(){let H=new S("us-east-1"),z=await H.listUsers(),Q=d(x.team.name),Z=z.Users?.filter((Y)=>{let _=Y.UserName?.toLowerCase();return _!=="stacks"&&_!==Q.toLowerCase()&&_?.includes(Q.toLowerCase())})||[];if(!Z||Z.length===0)return K(`No Stacks IAM users found for team ${Q}`);let X=Z.map(async(Y)=>{let _=Y.UserName||"";V.info(`Deleting IAM user: ${_}`);let U=await H.listAttachedUserPolicies({UserName:_});await Promise.all(U.AttachedPolicies?.map((L)=>{let A=L;return H.detachUserPolicy({UserName:_,PolicyArn:A.PolicyArn||""})})||[]);let J=await H.listAccessKeys({UserName:_});return await Promise.all(J.AccessKeyMetadata?.map((L)=>{let A=L;return H.deleteAccessKey({UserName:_,AccessKeyId:A.AccessKeyId||""})})||[]),H.deleteUser({UserName:_})});try{await Promise.all(X)}catch(Y){return console.error(Y),$(w("Error deleting Stacks IAM users").message)}return K(`Stacks IAM users deleted for team ${Q}`)}async function _z(){try{let H=new v("us-east-1"),Q=(await H.listBuckets()).Buckets?.filter((X)=>X.Name?.includes("stacks"));if(!Q)return $("No stacks buckets found");let Z=Q.map(async(X)=>{let Y=X.Name||"";V.info(`Deleting bucket ${Y}...`);let W,_=!0;while(_){let U=await H.listObjects({bucket:Y,continuationToken:W});if(U.objects&&U.objects.length>0)V.info(`Deleting ${U.objects.length} objects from bucket ${Y}...`),await Promise.all(U.objects.map((J)=>{let L=J;return H.deleteObject(Y,L.Key||"")})).catch((J)=>{throw V.error(`Failed to delete objects from bucket ${Y}:`,J),J});_=!!U.nextContinuationToken,W=U.nextContinuationToken}V.info(`Finished deleting objects from bucket ${Y}`),V.info(`Deleting bucket ${Y} versions...`);try{let U,J,L=!0;while(L){let O=await H.listObjectVersions({bucket:Y,keyMarker:U,versionIdMarker:J});if(O.versions&&O.versions.length>0)await Promise.all(O.versions.map((F)=>{let M=F;return H.deleteObject(Y,M.Key||"")})).catch((F)=>w(F)),V.info(`Deleted ${O.versions.length} versions from bucket ${Y}`);if(O.deleteMarkers&&O.deleteMarkers.length>0)await Promise.all(O.deleteMarkers.map((F)=>{let M=F;return H.deleteObject(Y,M.Key||"")})).catch((F)=>w(F)),V.info(`Deleted ${O.deleteMarkers.length} delete markers from bucket ${Y}`);L=!!O.nextKeyMarker,U=O.nextKeyMarker,J=O.nextVersionIdMarker}V.info(`Finished deleting all versions from bucket ${Y}`);let A=await H.listMultipartUploads(Y);if(A&&A.length>0)V.info("Aborting bucket multipart uploads..."),await Promise.all(A.map((O)=>{let F=O;return H.abortMultipartUpload(Y,F.Key||"",F.UploadId||"")})).catch((O)=>w(O)),V.info(`Finished aborting multipart uploads from bucket ${Y}`);await H.deleteBucket(Y).catch((O)=>w(O)),V.info(`Bucket ${Y} deleted`)}catch(U){V.info(`Error listing bucket ${Y} versions`,U)}});return await Promise.all(Z).catch((X)=>{return console.error(X),$(w("Error deleting stacks buckets"))}),K("Stacks buckets deleted")}catch(H){return $(w("Error deleting stacks buckets",H))}}async function $z(){let H=new N("us-east-1"),Q=(await H.listFunctions()).Functions?.filter((X)=>{return X.FunctionName?.includes("stacks")})||[];if(!Q||Q.length===0)return K("No stacks functions found");let Z=Q.map((X)=>{let Y=X;return H.deleteFunction(Y.FunctionName||"")});try{await Promise.all(Z)}catch(X){let Y=X;if(Y.message.includes("it is a replicated function"))return V.info("Function is replicated, skipping..."),K("CloudFront is still deleting the some functions. Try again later.");return $(w("Error deleting stacks functions",Y).message)}return K("Stacks functions deleted")}async function Kz(){try{let H=await D("DescribeRegions"),Q=H.regionInfo?.item??H.Regions??H.regionSet??[],Z=[];if(Array.isArray(Q))for(let X of Q){let Y=X.regionName??X.RegionName;if(Y)Z.push(Y)}for(let X of Z){let W=await new b(X).describeLogGroups();if(W?.logGroups)for(let _ of W.logGroups){let U=x.app.name?.toLocaleLowerCase()||"stacks";if(_.logGroupName?.includes(U))await l(X,"DeleteLogGroup",{logGroupName:_.logGroupName})}}return K("Log groups deleted in all regions")}catch(H){return $(w("Error deleting log groups",H))}}async function Uz(){let H=new y("us-east-1"),z=await H.describeParameters();if(!z.Parameters)return K("No parameters found");let Q=x.app.name?.toLocaleLowerCase()||"stacks",Z=z.Parameters.filter((Y)=>{return Y.Name?.includes(Q)})||[];if(!Z||Z.length===0)return K("No stacks parameters found");let X=Z.map((Y)=>{let W=Y;return H.deleteParameter({Name:W.Name||""})});try{await Promise.all(X)}catch(Y){return $(w("Error deleting parameter store",Y).message)}return K("Parameter store deleted")}async function Oz(){let H=new q("us-east-1"),z=x.app.name?`${x.app.name.toLowerCase()}-`:"stacks-";try{let{Vpcs:Q}=await H.describeVpcs();if(!Q||Q.length===0)return K("No VPCs found");let Z=Q.filter((X)=>{return X.Tags?.some((_)=>_.Key==="Name"&&_.Value===z)});if(Z.length===0)return K(`No VPCs found matching the pattern: ${z}`);for(let X of Z)if(X.VpcId)await D("DeleteVpc",{VpcId:X.VpcId}),V.info(`Deleted VPC: ${X.VpcId} (${z})`);return K(`Deleted ${Z.length} VPCs matching the pattern: ${z}`)}catch(Q){return $(w(`Error deleting VPCs: ${Q}`))}}async function Vz(){try{return await Bun.$`rm -rf ${E.cloudPath("cdk.out/")} ${E.cloudPath("cdk.context.json")}`.text(),K("CDK remnants deleted")}catch(H){return $(w("Error deleting CDK remnants",H))}}async function Jz(){let H=new q("us-east-1"),z=x.app.name?`${x.app.name.toLowerCase()}-`:"stacks-";try{let{Subnets:Q}=await H.describeSubnets();if(!Q||Q.length===0)return K("No subnets found");let Z=Q.filter((X)=>{return X.Tags?.some((_)=>_.Key==="Name"&&_.Value?.startsWith(z))});if(Z.length===0)return K(`No subnets found matching the pattern: ${z}`);for(let X of Z)if(X.SubnetId){let _=(await D("DescribeNetworkInterfaces",{"Filter.1.Name":"subnet-id","Filter.1.Value.1":X.SubnetId})).networkInterfaceSet?.item??[];for(let U of Array.isArray(_)?_:[]){let J=U.networkInterfaceId;if(J){let L=U.attachment;if(L?.instanceId)await H.terminateInstances([L.instanceId]),V.info(`Terminated instance: ${L.instanceId}`),await new Promise((A)=>setTimeout(A,60000));if(L?.attachmentId)await D("DetachNetworkInterface",{AttachmentId:L.attachmentId,Force:"true"}),V.info(`Detached network interface: ${J}`),await new Promise((A)=>setTimeout(A,1e4));await D("DeleteNetworkInterface",{NetworkInterfaceId:J}),V.info(`Deleted network interface: ${J}`)}}await D("DeleteSubnet",{SubnetId:X.SubnetId}),V.info(`Deleted subnet: ${X.SubnetId} (${X.Tags?.find((U)=>U.Key==="Name")?.Value})`)}return K(`Deleted ${Z.length} subnets matching the pattern: ${z}`)}catch(Q){return $(w(`Error deleting subnets: ${Q}`))}}async function Lz(){let H=new v("us-east-1");try{let z=await H.listBuckets();return K(z.Buckets?.some((Q)=>Q.Name?.includes(x.app.name?.toLocaleLowerCase()||"stacks"))||!1)}catch(z){return console.error(z),$(w("Error checking if the app has been deployed"))}}async function p(){let Z=(await new S("us-east-1").listInstanceProfiles()).InstanceProfiles?.find((X)=>{return X.InstanceProfileName?.includes("JumpBox")})?.InstanceProfileName;if(!Z)return $("Jump-box IAM instance profile not found");return K(Z)}async function Wz(H){if(!H)H=T;if(await B())return $("The jump-box you are trying to add already exists. Please remove it & wait until it finished terminating.");let z=new q("us-east-1"),Q=await i();if(Q.isErr)return $(Q.error);if(!Q.value)return $("Security group not found when adding jump-box");let Z=await m(Q.value);if(Z.isErr)return $(Z.error);let X=Z.value;if(!X)return $("Security group not found when adding jump-box");let W=(await u("DescribeFileSystems","GET","/2015-02-01/file-systems")).FileSystems??[],_=`stacks-${x.app.env}-efs`,U=W.find((C)=>C.Name===_),J=U?.FileSystemId;if(!U||!J)return $(`EFS file system ${_} not found`);let L=`
2
+ import{config as D}from"@stacksjs/config";import{InfrastructureGenerator as F}from"@stacksjs/ts-cloud";class O{generator;cloudConfig;props;constructor(t,e){this.cloudConfig=t,this.props=e;let n=(e.appEnv==="local"?"development":e.appEnv)||"production";this.generator=new F({config:this.cloudConfig,environment:n})}generate(){return this.generator.generate().toJSON()}shouldDeployApi(){return D.cloud.api?.deploy??!1}}import{AWSClient as I,AWSCloudFormationClient as A,CloudWatchLogsClient as M,EC2Client as h,IAMClient as L,LambdaClient as j,Route53DomainsClient as B,S3Client as v,SSMClient as x}from"@stacksjs/ts-cloud";import{config as y}from"@stacksjs/config";import{err as o,handleError as p,ok as c}from"@stacksjs/error-handling";import{log as m}from"@stacksjs/logging";import{path as E}from"@stacksjs/path";import{slug as V}from"@stacksjs/strings";var U=y.app.env==="local"?"dev":y.app.env,b=`stacks-cloud-${U}`;async function P(t,e={}){let n=new I,a={Action:t,Version:"2016-11-15",...e};return await n.request({service:"ec2",region:"us-east-1",method:"POST",path:"/",queryParams:a})}async function G(t,e,n){return await new I().request({service:"logs",region:t,method:"POST",path:"/",headers:{"Content-Type":"application/x-amz-json-1.1","X-Amz-Target":`Logs_20140328.${e}`},body:JSON.stringify(n)})}async function K(t,e,n){return await new I().request({service:"elasticfilesystem",region:"us-east-1",method:e,path:n})}async function z(t){let e=new h("us-east-1"),{SecurityGroups:n}=await e.describeSecurityGroups({Filters:[{Name:"group-name",Values:[t]}]});if(!n)return o(`Security group ${t} not found`);if(n[0])return c(n[0].GroupId);return o(`Security group ${t} not found`)}function se(t,e){let n=new B,a=e.contactType.toUpperCase()||"PERSON",r=(s)=>s.toString().includes("+")?s.toString():`+${s.toString()}`;try{return c(n.registerDomain({DomainName:t,DurationInYears:e.years||1,AutoRenew:e.autoRenew||!0,AdminContact:{FirstName:e.adminFirstName,LastName:e.adminLastName,ContactType:a,OrganizationName:e.adminOrganization,AddressLine1:e.adminAddressLine1,AddressLine2:e.adminAddressLine2,City:e.adminCity,State:e.adminState,CountryCode:e.adminCountry,ZipCode:e.adminZip.toString(),PhoneNumber:r(e.adminPhone),Email:e.adminEmail},RegistrantContact:{FirstName:e.registrantFirstName,LastName:e.registrantLastName,ContactType:a,OrganizationName:e.registrantOrganization,AddressLine1:e.registrantAddressLine1,AddressLine2:e.registrantAddressLine2,City:e.registrantCity,State:e.registrantState,CountryCode:e.registrantCountry,ZipCode:e.registrantZip.toString(),PhoneNumber:r(e.registrantPhone),Email:e.registrantEmail},TechContact:{FirstName:e.techFirstName,LastName:e.techLastName,ContactType:a,OrganizationName:e.techOrganization,AddressLine1:e.techAddressLine1,AddressLine2:e.techAddressLine2,City:e.techCity,State:e.techState,CountryCode:e.techCountry,ZipCode:e.techZip.toString(),PhoneNumber:r(e.techPhone),Email:e.techEmail},PrivacyProtectAdminContact:e.privacyAdmin||e.privacy||!0,PrivacyProtectRegistrantContact:e.privacyRegistrant||e.privacy||!0,PrivacyProtectTechContact:e.privacyTech||e.privacy||!0}))}catch(s){return o(s)}}async function R(t){if(!t)t=`${b}/JumpBox`;let n=await new h("us-east-1").describeInstances({Filters:[{Name:"tag:Name",Values:[t]}]});if(n.Reservations?.[0]?.Instances?.[0])return n.Reservations[0].Instances[0].InstanceId;return}async function J(t,e){if(!e)e=b;if(!t)return o(`Instance ${t} not found`);return await new h("us-east-1").terminateInstances([t]),c(`Instance ${t} is being terminated`)}async function ae(t){if(!t)t=b;let e=await R();if(!e)return o("Jump-box not found");return m.info(`Deleting jump-box ${e}...`),await J(e,t)}async function ie(){let t=new L("us-east-1"),e=await t.listUsers(),n=V(y.team.name),a=e.Users?.filter((s)=>{let i=s.UserName?.toLowerCase();return i!=="stacks"&&i!==n.toLowerCase()&&i?.includes(n.toLowerCase())})||[];if(!a||a.length===0)return c(`No Stacks IAM users found for team ${n}`);let r=a.map(async(s)=>{let i=s.UserName||"";m.info(`Deleting IAM user: ${i}`);let u=await t.listAttachedUserPolicies({UserName:i});await Promise.all(u.AttachedPolicies?.map((g)=>{let w=g;return t.detachUserPolicy({UserName:i,PolicyArn:w.PolicyArn||""})})||[]);let l=await t.listAccessKeys({UserName:i});return await Promise.all(l.AccessKeyMetadata?.map((g)=>{let w=g;return t.deleteAccessKey({UserName:i,AccessKeyId:w.AccessKeyId||""})})||[]),t.deleteUser({UserName:i})});try{await Promise.all(r)}catch(s){return console.error(s),o(p("Error deleting Stacks IAM users").message)}return c(`Stacks IAM users deleted for team ${n}`)}async function oe(){try{let t=new v("us-east-1"),n=(await t.listBuckets()).Buckets?.filter((r)=>r.Name?.includes("stacks"));if(!n)return o("No stacks buckets found");let a=n.map(async(r)=>{let s=r.Name||"";m.info(`Deleting bucket ${s}...`);let f,i=!0;while(i){let u=await t.listObjects({bucket:s,continuationToken:f});if(u.objects&&u.objects.length>0)m.info(`Deleting ${u.objects.length} objects from bucket ${s}...`),await Promise.all(u.objects.map((l)=>{let g=l;return t.deleteObject(s,g.Key||"")})).catch((l)=>{throw m.error(`Failed to delete objects from bucket ${s}:`,l),l});i=!!u.nextContinuationToken,f=u.nextContinuationToken}m.info(`Finished deleting objects from bucket ${s}`),m.info(`Deleting bucket ${s} versions...`);try{let u,l,g=!0;while(g){let d=await t.listObjectVersions({bucket:s,keyMarker:u,versionIdMarker:l});if(d.versions&&d.versions.length>0)await Promise.all(d.versions.map((k)=>{let C=k;return t.deleteObject(s,C.Key||"")})).catch((k)=>p(k)),m.info(`Deleted ${d.versions.length} versions from bucket ${s}`);if(d.deleteMarkers&&d.deleteMarkers.length>0)await Promise.all(d.deleteMarkers.map((k)=>{let C=k;return t.deleteObject(s,C.Key||"")})).catch((k)=>p(k)),m.info(`Deleted ${d.deleteMarkers.length} delete markers from bucket ${s}`);g=!!d.nextKeyMarker,u=d.nextKeyMarker,l=d.nextVersionIdMarker}m.info(`Finished deleting all versions from bucket ${s}`);let w=await t.listMultipartUploads(s);if(w&&w.length>0)m.info("Aborting bucket multipart uploads..."),await Promise.all(w.map((d)=>{let k=d;return t.abortMultipartUpload(s,k.Key||"",k.UploadId||"")})).catch((d)=>p(d)),m.info(`Finished aborting multipart uploads from bucket ${s}`);await t.deleteBucket(s).catch((d)=>p(d)),m.info(`Bucket ${s} deleted`)}catch(u){m.info(`Error listing bucket ${s} versions`,u)}});return await Promise.all(a).catch((r)=>(console.error(r),o(p("Error deleting stacks buckets")))),c("Stacks buckets deleted")}catch(t){return o(p("Error deleting stacks buckets",t))}}async function ce(){let t=new j("us-east-1"),n=(await t.listFunctions()).Functions?.filter((r)=>r.FunctionName?.includes("stacks"))||[];if(!n||n.length===0)return c("No stacks functions found");let a=n.map((r)=>{let s=r;return t.deleteFunction(s.FunctionName||"")});try{await Promise.all(a)}catch(r){let s=r;if(s.message.includes("it is a replicated function"))return m.info("Function is replicated, skipping..."),c("CloudFront is still deleting the some functions. Try again later.");return o(p("Error deleting stacks functions",s).message)}return c("Stacks functions deleted")}async function ue(){try{let t=await P("DescribeRegions"),n=t.regionInfo?.item??t.Regions??t.regionSet??[],a=[];if(Array.isArray(n))for(let r of n){let s=r.regionName??r.RegionName;if(s)a.push(s)}for(let r of a){let f=await new M(r).describeLogGroups();if(f?.logGroups)for(let i of f.logGroups){let u=y.app.name?.toLocaleLowerCase()||"stacks";if(i.logGroupName?.includes(u))await G(r,"DeleteLogGroup",{logGroupName:i.logGroupName})}}return c("Log groups deleted in all regions")}catch(t){return o(p("Error deleting log groups",t))}}async function de(){let t=new x("us-east-1"),e=await t.describeParameters();if(!e.Parameters)return c("No parameters found");let n=y.app.name?.toLocaleLowerCase()||"stacks",a=e.Parameters.filter((s)=>s.Name?.includes(n))||[];if(!a||a.length===0)return c("No stacks parameters found");let r=a.map((s)=>{let f=s;return t.deleteParameter({Name:f.Name||""})});try{await Promise.all(r)}catch(s){return o(p("Error deleting parameter store",s).message)}return c("Parameter store deleted")}async function me(){let t=new h("us-east-1"),e=y.app.name?`${y.app.name.toLowerCase()}-`:"stacks-";try{let{Vpcs:n}=await t.describeVpcs();if(!n||n.length===0)return c("No VPCs found");let a=n.filter((r)=>r.Tags?.some((i)=>i.Key==="Name"&&i.Value===e));if(a.length===0)return c(`No VPCs found matching the pattern: ${e}`);for(let r of a)if(r.VpcId)await P("DeleteVpc",{VpcId:r.VpcId}),m.info(`Deleted VPC: ${r.VpcId} (${e})`);return c(`Deleted ${a.length} VPCs matching the pattern: ${e}`)}catch(n){return o(p(`Error deleting VPCs: ${n}`))}}async function le(){try{return await Bun.$`rm -rf ${E.cloudPath("cdk.out/")} ${E.cloudPath("cdk.context.json")}`.text(),c("CDK remnants deleted")}catch(t){return o(p("Error deleting CDK remnants",t))}}async function ge(){let t=new h("us-east-1"),e=y.app.name?`${y.app.name.toLowerCase()}-`:"stacks-";try{let{Subnets:n}=await t.describeSubnets();if(!n||n.length===0)return c("No subnets found");let a=n.filter((r)=>r.Tags?.some((i)=>i.Key==="Name"&&i.Value?.startsWith(e)));if(a.length===0)return c(`No subnets found matching the pattern: ${e}`);for(let r of a)if(r.SubnetId){let i=(await P("DescribeNetworkInterfaces",{"Filter.1.Name":"subnet-id","Filter.1.Value.1":r.SubnetId})).networkInterfaceSet?.item??[];for(let u of Array.isArray(i)?i:[]){let l=u.networkInterfaceId;if(l){let g=u.attachment;if(g?.instanceId)await t.terminateInstances([g.instanceId]),m.info(`Terminated instance: ${g.instanceId}`),await new Promise((w)=>setTimeout(w,60000));if(g?.attachmentId)await P("DetachNetworkInterface",{AttachmentId:g.attachmentId,Force:"true"}),m.info(`Detached network interface: ${l}`),await new Promise((w)=>setTimeout(w,1e4));await P("DeleteNetworkInterface",{NetworkInterfaceId:l}),m.info(`Deleted network interface: ${l}`)}}await P("DeleteSubnet",{SubnetId:r.SubnetId}),m.info(`Deleted subnet: ${r.SubnetId} (${r.Tags?.find((u)=>u.Key==="Name")?.Value})`)}return c(`Deleted ${a.length} subnets matching the pattern: ${e}`)}catch(n){return o(p(`Error deleting subnets: ${n}`))}}async function fe(){let t=new v("us-east-1");try{let e=await t.listBuckets();return c(e.Buckets?.some((n)=>n.Name?.includes(y.app.name?.toLocaleLowerCase()||"stacks"))||!1)}catch(e){return console.error(e),o(p("Error checking if the app has been deployed"))}}async function _(){let a=(await new L("us-east-1").listInstanceProfiles()).InstanceProfiles?.find((r)=>r.InstanceProfileName?.includes("JumpBox"))?.InstanceProfileName;if(!a)return o("Jump-box IAM instance profile not found");return c(a)}async function pe(t){if(!t)t=b;if(await R())return o("The jump-box you are trying to add already exists. Please remove it & wait until it finished terminating.");let e=new h("us-east-1"),n=await Z();if(n.isErr)return o(n.error);if(!n.value)return o("Security group not found when adding jump-box");let a=await z(n.value);if(a.isErr)return o(a.error);let r=a.value;if(!r)return o("Security group not found when adding jump-box");let f=(await K("DescribeFileSystems","GET","/2015-02-01/file-systems")).FileSystems??[],i=`stacks-${y.app.env}-efs`,u=f.find((T)=>T.Name===i),l=u?.FileSystemId;if(!u||!l)return o(`EFS file system ${i} not found`);let g=`
3
3
  #!/bin/bash
4
4
  yum update -y
5
5
  yum install -y amazon-efs-utils
6
6
  yum install -y git
7
7
  yum install -y https://s3.us-east-1.amazonaws.com/amazon-ssm-us-east-1/latest/linux_amd64/amazon-ssm-agent.rpm
8
8
  mkdir /mnt/efs
9
- mount -t efs ${J}:/ /mnt/efs
9
+ mount -t efs ${l}:/ /mnt/efs
10
10
  git clone https://github.com/stacksjs/stacks.git /mnt/efs
11
- `,A=btoa(L),O=await p();if(O.isErr)return $(O.error);let F=O.value;if(!F)return $("Jump-box IAM instance profile not found");let G=(await D("RunInstances",{ImageId:"ami-03a6eaae9938c858c",InstanceType:"t2.micro",MaxCount:"1",MinCount:"1","SecurityGroupId.1":X,SubnetId:"subnet-004c5f196358b00f0","TagSpecification.1.ResourceType":"instance","TagSpecification.1.Tag.1.Key":"Name","TagSpecification.1.Tag.1.Value":`${T}-jump-box`,UserData:A,"IamInstanceProfile.Name":F})).instancesSet?.item??[],P=Array.isArray(G)?G[0]:void 0;return P?K(`Jump-box created with id ${P.instanceId}`):$("Jump-box creation failed")}async function i(){let H=await B();if(!H)return $("Jump-box not found");let Q=await new q("us-east-1").describeInstances({InstanceIds:[H]});if(Q.Reservations?.[0]?.Instances?.[0]){let X=Q.Reservations[0].Instances[0].SecurityGroups;if(X?.[0])return K(X[0].GroupName)}return $("Security group not found")}async function wz(H){let Q=await new q("us-east-1").describeInstances({InstanceIds:[H]});if(Q.Reservations?.[0]?.Instances?.[0]){let X=Q.Reservations[0].Instances[0].SecurityGroups;if(X?.[0])return X[0].GroupId}return}async function Az(){let H=T;return!(await new j("us-east-1").listStacks(["CREATE_COMPLETE","UPDATE_COMPLETE"])).StackSummaries?.some((X)=>{return X.StackName===H})}async function Fz(){return!(await new j("us-east-1").listStacks(["CREATE_FAILED","UPDATE_FAILED","ROLLBACK_COMPLETE","UPDATE_ROLLBACK_COMPLETE"])).StackSummaries?.some((Z)=>{return Z.StackName===T})}async function xz(){let z=new y("us-east-1");try{let Q=await z.getParameter({Name:"/stacks/timestamp"}),Z=Q.Parameter?Q.Parameter.Value:void 0;if(!Z)throw Error("Timestamp parameter not found");return Z}catch(Q){let Z=new Date().getTime().toString();return V.debug(`Creating timestamp parameter /stacks/timestamp with value ${Z}`,Q),await z.putParameter({Name:"/stacks/timestamp",Value:Z,Type:"String"}),Z}}async function qz(){return""}export{Xz as purchaseDomain,Az as isFirstDeployment,Fz as isFailedState,Lz as hasBeenDeployed,m as getSecurityGroupId,wz as getSecurityGroupFromInstanceId,xz as getOrCreateTimestamp,i as getJumpBoxSecurityGroupName,p as getJumpBoxInstanceProfileName,B as getJumpBoxInstanceId,qz as getCloudFrontDistributionId,Oz as deleteVpcs,Jz as deleteSubnets,$z as deleteStacksFunctions,_z as deleteStacksBuckets,Uz as deleteParameterStore,Kz as deleteLogGroups,Yz as deleteJumpBox,Zz as deleteIamUsers,c as deleteEc2Instance,Vz as deleteCdkRemnants,Wz as addJumpBox,h as Cloud};
11
+ `,w=btoa(g),d=await _();if(d.isErr)return o(d.error);let k=d.value;if(!k)return o("Jump-box IAM instance profile not found");let S=(await P("RunInstances",{ImageId:"ami-03a6eaae9938c858c",InstanceType:"t2.micro",MaxCount:"1",MinCount:"1","SecurityGroupId.1":r,SubnetId:"subnet-004c5f196358b00f0","TagSpecification.1.ResourceType":"instance","TagSpecification.1.Tag.1.Key":"Name","TagSpecification.1.Tag.1.Value":`${b}-jump-box`,UserData:w,"IamInstanceProfile.Name":k})).instancesSet?.item??[],N=Array.isArray(S)?S[0]:void 0;return N?c(`Jump-box created with id ${N.instanceId}`):o("Jump-box creation failed")}async function Z(){let t=await R();if(!t)return o("Jump-box not found");let n=await new h("us-east-1").describeInstances({InstanceIds:[t]});if(n.Reservations?.[0]?.Instances?.[0]){let r=n.Reservations[0].Instances[0].SecurityGroups;if(r?.[0])return c(r[0].GroupName)}return o("Security group not found")}async function we(t){let n=await new h("us-east-1").describeInstances({InstanceIds:[t]});if(n.Reservations?.[0]?.Instances?.[0]){let r=n.Reservations[0].Instances[0].SecurityGroups;if(r?.[0])return r[0].GroupId}return}async function ke(){let t=b;return!(await new A("us-east-1").listStacks(["CREATE_COMPLETE","UPDATE_COMPLETE"])).StackSummaries?.some((r)=>r.StackName===t)}async function ye(){return!(await new A("us-east-1").listStacks(["CREATE_FAILED","UPDATE_FAILED","ROLLBACK_COMPLETE","UPDATE_ROLLBACK_COMPLETE"])).StackSummaries?.some((a)=>a.StackName===b)}async function he(){let e=new x("us-east-1");try{let n=await e.getParameter({Name:"/stacks/timestamp"}),a=n.Parameter?n.Parameter.Value:void 0;if(!a)throw Error("Timestamp parameter not found");return a}catch(n){let a=new Date().getTime().toString();return m.debug(`Creating timestamp parameter /stacks/timestamp with value ${a}`,n),await e.putParameter({Name:"/stacks/timestamp",Value:a,Type:"String"}),a}}async function Pe(){return""}export{O as Cloud,pe as addJumpBox,le as deleteCdkRemnants,J as deleteEc2Instance,ie as deleteIamUsers,ae as deleteJumpBox,ue as deleteLogGroups,de as deleteParameterStore,oe as deleteStacksBuckets,ce as deleteStacksFunctions,ge as deleteSubnets,me as deleteVpcs,Pe as getCloudFrontDistributionId,R as getJumpBoxInstanceId,_ as getJumpBoxInstanceProfileName,Z as getJumpBoxSecurityGroupName,he as getOrCreateTimestamp,we as getSecurityGroupFromInstanceId,z as getSecurityGroupId,fe as hasBeenDeployed,ye as isFailedState,ke as isFirstDeployment,se as purchaseDomain};
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@stacksjs/cloud",
3
3
  "type": "module",
4
4
  "sideEffects": false,
5
- "version": "0.72.57",
5
+ "version": "0.72.61",
6
6
  "description": "The Stacks cloud/serverless integration & implementation.",
7
7
  "author": "Chris Breuer",
8
8
  "contributors": [
@@ -63,16 +63,16 @@
63
63
  "@stacksjs/ts-xml": "^0.1.0"
64
64
  },
65
65
  "devDependencies": {
66
- "@stacksjs/cli": "0.72.57",
67
- "@stacksjs/config": "0.72.57",
66
+ "@stacksjs/cli": "0.72.61",
67
+ "@stacksjs/config": "0.72.61",
68
68
  "better-dx": "^0.2.24",
69
- "@stacksjs/dns": "0.72.57",
70
- "@stacksjs/env": "0.72.57",
71
- "@stacksjs/logging": "0.72.57",
72
- "@stacksjs/path": "0.72.57",
73
- "@stacksjs/router": "0.72.57",
74
- "@stacksjs/storage": "0.72.57",
75
- "@stacksjs/utils": "0.72.57",
76
- "@stacksjs/validation": "0.72.57"
69
+ "@stacksjs/dns": "0.72.61",
70
+ "@stacksjs/env": "0.72.61",
71
+ "@stacksjs/logging": "0.72.61",
72
+ "@stacksjs/path": "0.72.61",
73
+ "@stacksjs/router": "0.72.61",
74
+ "@stacksjs/storage": "0.72.61",
75
+ "@stacksjs/utils": "0.72.61",
76
+ "@stacksjs/validation": "0.72.61"
77
77
  }
78
78
  }