@fjall/deploy-core 2.34.0 → 3.1.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/.minified +1 -1
- package/dist/src/aws/SimpleAwsProvider.js +1 -1
- package/dist/src/aws/cloudtrail/orgTrailDelivery.js +1 -1
- package/dist/src/aws/organisations/accountGlobals.js +1 -1
- package/dist/src/aws/organisations/accounts.js +1 -1
- package/dist/src/aws/organisations/backup.js +2 -2
- package/dist/src/aws/organisations/costAllocation.js +1 -1
- package/dist/src/aws/organisations/delegatedAdmin.js +2 -2
- package/dist/src/aws/organisations/identityCentre.js +1 -1
- package/dist/src/aws/organisations/identityCentreSnapshot.js +1 -1
- package/dist/src/aws/organisations/importedAccounts.js +1 -1
- package/dist/src/aws/organisations/ipam.js +1 -1
- package/dist/src/aws/organisations/oidcProvider.js +1 -1
- package/dist/src/aws/organisations/organisation.js +1 -1
- package/dist/src/aws/organisations/organisationalUnits.js +1 -1
- package/dist/src/aws/organisations/pagination.js +1 -1
- package/dist/src/aws/organisations/policies.js +1 -1
- package/dist/src/aws/organisations/ram.js +1 -1
- package/dist/src/aws/organisations/rootAccess.js +3 -3
- package/dist/src/aws/organisations/serviceAccess.js +1 -1
- package/dist/src/aws/organisations/trustedAccess.js +1 -1
- package/dist/src/aws/organisations/types.js +1 -1
- package/dist/src/aws/regions/regionOptStatus.js +1 -1
- package/dist/src/aws/sts/assumeRoot.js +1 -1
- package/dist/src/aws/targetReadiness.d.ts +7 -4
- package/dist/src/aws/targetReadiness.js +1 -1
- package/dist/src/aws/targetSetAdvisory.js +1 -1
- package/dist/src/aws/utils/arnParser.js +1 -1
- package/dist/src/aws/utils/awsErrorHandler.js +1 -1
- package/dist/src/aws/utils/cloudformationEventHelpers.js +1 -1
- package/dist/src/aws/utils/cloudformationEvents.js +1 -1
- package/dist/src/index.d.ts +4 -2
- package/dist/src/index.js +1 -1
- package/dist/src/orchestration/activeDeploymentGuard.js +5 -5
- package/dist/src/orchestration/application/applicationDeploy.js +1 -1
- package/dist/src/orchestration/application/applicationDeployHelpers.js +3 -3
- package/dist/src/orchestration/application/applicationDestroy.js +1 -1
- package/dist/src/orchestration/application/approvalGate.js +1 -1
- package/dist/src/orchestration/application/artefactCollection.js +1 -1
- package/dist/src/orchestration/application/buildArgResolver.js +1 -1
- package/dist/src/orchestration/application/buildGroupValidator.js +1 -1
- package/dist/src/orchestration/application/buildSecretResolver.js +1 -1
- package/dist/src/orchestration/application/buildSecretSession.js +1 -1
- package/dist/src/orchestration/application/codeOnlyDeploy.js +1 -1
- package/dist/src/orchestration/application/databaseEndpointReconcile.js +1 -1
- package/dist/src/orchestration/application/deploySessionPolicy.js +1 -1
- package/dist/src/orchestration/application/destroyPreFlight.js +1 -1
- package/dist/src/orchestration/application/destructionGate.js +3 -3
- package/dist/src/orchestration/application/detectionPipeline.js +1 -1
- package/dist/src/orchestration/application/dockerBuildHelper.js +1 -1
- package/dist/src/orchestration/application/ecrCacheRepository.js +1 -1
- package/dist/src/orchestration/application/lambdaCodeOnlyRollout.js +1 -1
- package/dist/src/orchestration/application/leaseGate.js +1 -1
- package/dist/src/orchestration/application/openNextBuild.js +3 -3
- package/dist/src/orchestration/application/plan/approvalToken.js +1 -1
- package/dist/src/orchestration/application/plan/assemblyDigest.js +2 -2
- package/dist/src/orchestration/application/plan/buildDeployPlan.js +1 -1
- package/dist/src/orchestration/application/plan/changeSetEscalation.js +1 -1
- package/dist/src/orchestration/application/plan/classify.js +1 -1
- package/dist/src/orchestration/application/plan/computeDeployPlan.js +1 -1
- package/dist/src/orchestration/application/plan/loadDeployPlan.js +1 -1
- package/dist/src/orchestration/application/plan/pinnedNames.js +1 -1
- package/dist/src/orchestration/application/plan/registryOverlay.js +1 -1
- package/dist/src/orchestration/application/plan/renderDeployPlan.js +1 -1
- package/dist/src/orchestration/application/serviceImageTagsRollback.js +1 -1
- package/dist/src/orchestration/application/taskDefinitionRoll.js +1 -1
- package/dist/src/orchestration/application/welcomeImageHelper.js +1 -1
- package/dist/src/orchestration/builders/dockerBuilder.js +1 -1
- package/dist/src/orchestration/builders/frameworkRegistry.js +1 -1
- package/dist/src/orchestration/builders/openNextBuilder.js +1 -1
- package/dist/src/orchestration/builders/staticSiteBuilder.js +2 -2
- package/dist/src/orchestration/contextHelpers.js +1 -1
- package/dist/src/orchestration/deploy.js +1 -1
- package/dist/src/orchestration/destroy.js +1 -1
- package/dist/src/orchestration/domain/caaPreflight.d.ts +56 -0
- package/dist/src/orchestration/domain/caaPreflight.js +1 -0
- package/dist/src/orchestration/domain/delegatedDomainDeploy.d.ts +79 -0
- package/dist/src/orchestration/domain/delegatedDomainDeploy.js +1 -0
- package/dist/src/orchestration/domain/delegationDestroyMirror.d.ts +141 -0
- package/dist/src/orchestration/domain/delegationDestroyMirror.js +1 -0
- package/dist/src/orchestration/domain/index.d.ts +10 -0
- package/dist/src/orchestration/domain/index.js +1 -0
- package/dist/src/orchestration/domain/nsPropagationGate.d.ts +59 -0
- package/dist/src/orchestration/domain/nsPropagationGate.js +1 -0
- package/dist/src/orchestration/domain/types.d.ts +75 -0
- package/dist/src/orchestration/domain/types.js +1 -0
- package/dist/src/orchestration/domainInterface.d.ts +10 -0
- package/dist/src/orchestration/drift/classifyDriftFailure.js +1 -1
- package/dist/src/orchestration/drift/detectStackDrift.js +1 -1
- package/dist/src/orchestration/drift/driftPreFlight.js +5 -5
- package/dist/src/orchestration/drift/driftProbe.d.ts +12 -6
- package/dist/src/orchestration/drift/driftProbe.js +1 -1
- package/dist/src/orchestration/drift/driftSuspectJournal.js +1 -1
- package/dist/src/orchestration/drift/preFlightGate.d.ts +10 -2
- package/dist/src/orchestration/drift/preFlightGate.js +2 -2
- package/dist/src/orchestration/drift/route53Names.d.ts +35 -0
- package/dist/src/orchestration/drift/route53Names.js +1 -0
- package/dist/src/orchestration/drift/route53RecordPreflight.d.ts +105 -0
- package/dist/src/orchestration/drift/route53RecordPreflight.js +2 -0
- package/dist/src/orchestration/index.d.ts +3 -1
- package/dist/src/orchestration/index.js +1 -1
- package/dist/src/orchestration/manifestSecretParser.js +1 -1
- package/dist/src/orchestration/organisation/accountsConfig.js +1 -1
- package/dist/src/orchestration/organisation/cascadeDestroyHelpers.js +1 -1
- package/dist/src/orchestration/organisation/cascadeHelpers.d.ts +18 -1
- package/dist/src/orchestration/organisation/cascadeHelpers.js +1 -1
- package/dist/src/orchestration/organisation/cascadeSummary.js +1 -1
- package/dist/src/orchestration/organisation/organisationDeploy.js +1 -1
- package/dist/src/orchestration/organisation/organisationDestroy.js +2 -2
- package/dist/src/orchestration/organisation/organisationSetup.js +1 -1
- package/dist/src/orchestration/organisation/reconcileProviderAccounts.js +1 -1
- package/dist/src/orchestration/organisationDeploy/cascadeExecution.js +1 -1
- package/dist/src/orchestration/organisationDeploy/infraSteps.js +1 -1
- package/dist/src/orchestration/organisationDeploy/orgCascadeDeploy.js +3 -3
- package/dist/src/orchestration/organisationDeploy/orgContext.js +1 -1
- package/dist/src/orchestration/organisationDeploy/resolveCascadeAccounts.js +1 -1
- package/dist/src/orchestration/organisationDeploy/singleComponentDeploy.js +1 -1
- package/dist/src/orchestration/organisationDeploy/trailReconciliation.js +1 -1
- package/dist/src/orchestration/probes/deleteBlockProbes.js +1 -1
- package/dist/src/orchestration/remediation/driftRepairGate.js +1 -1
- package/dist/src/orchestration/remediation/forensicsCapture.js +1 -1
- package/dist/src/orchestration/remediation/forgetResource.js +1 -1
- package/dist/src/orchestration/remediation/pinRemediation.js +1 -1
- package/dist/src/orchestration/remediation/postFailureRepairOffer.js +8 -8
- package/dist/src/orchestration/remediation/recreatePreFlight.js +1 -1
- package/dist/src/orchestration/remediation/recreateResource.js +1 -1
- package/dist/src/orchestration/remediation/remediationJournal.js +2 -2
- package/dist/src/orchestration/remediation/removalUpdate.js +1 -1
- package/dist/src/orchestration/remediation/retainFlip.js +1 -1
- package/dist/src/orchestration/resolveOperation.js +1 -1
- package/dist/src/orchestration/restart/restartApplication.js +1 -1
- package/dist/src/orchestration/restart/secretsDrift.js +1 -1
- package/dist/src/orchestration/secretArnResolver.js +1 -1
- package/dist/src/orchestration/serviceFactory.js +1 -1
- package/dist/src/orchestration/spawnHelpers.js +1 -1
- package/dist/src/orchestration/stackCleanup/bucketOps.js +1 -1
- package/dist/src/orchestration/stackCleanup/failedStack.js +1 -1
- package/dist/src/orchestration/stackCleanup/logging.js +1 -1
- package/dist/src/orchestration/stackCleanup/messages.js +1 -1
- package/dist/src/orchestration/stackCleanup/orphanSweep.js +1 -1
- package/dist/src/orchestration/stackCleanup/preEmpty.js +1 -1
- package/dist/src/orchestration/stackCleanup/stackResources.js +1 -1
- package/dist/src/orchestration/stepLifecycle.js +1 -1
- package/dist/src/orchestration/trailMigration/memberTrailCleanup.js +1 -1
- package/dist/src/orchestration/trailMigration/trailMigration.js +1 -1
- package/dist/src/orchestration/unlock/bucketPolicyTriage.js +1 -1
- package/dist/src/orchestration/unlock/restoreAndReconcileQuarantinedBucket.js +1 -1
- package/dist/src/orchestration/unlock/restoreBucketPolicy.js +1 -1
- package/dist/src/orchestration/unlock/scpRemediation.js +1 -1
- package/dist/src/orchestration/unlock/toResourcePolicyStatements.js +1 -1
- package/dist/src/orchestration/unlock/unlockBucket.js +1 -1
- package/dist/src/orchestration/unlock/unlockQueue.js +1 -1
- package/dist/src/services/application/ApplicationStackService.d.ts +7 -0
- package/dist/src/services/application/ApplicationStackService.js +1 -1
- package/dist/src/services/application/applicationStackHelpers.js +3 -3
- package/dist/src/services/infrastructure/CdkArgumentBuilder.js +1 -1
- package/dist/src/services/infrastructure/CdkCommandRunner.js +2 -2
- package/dist/src/services/infrastructure/CdkErrorFormatter.js +10 -10
- package/dist/src/services/infrastructure/CdkEventMonitoring.js +1 -1
- package/dist/src/services/infrastructure/CdkOutputAnalyser.js +2 -2
- package/dist/src/services/infrastructure/CdkOutputParser.js +2 -2
- package/dist/src/services/infrastructure/CdkProcessManager.js +3 -3
- package/dist/src/services/infrastructure/CdkService.d.ts +1 -1
- package/dist/src/services/infrastructure/CdkService.js +2 -2
- package/dist/src/services/infrastructure/CdkServiceTypes.d.ts +39 -0
- package/dist/src/services/infrastructure/CfnRegistryService.js +1 -1
- package/dist/src/services/infrastructure/CloudFormationService.js +1 -1
- package/dist/src/services/infrastructure/EcrImageInspectorService.js +1 -1
- package/dist/src/services/infrastructure/EcsService.js +1 -1
- package/dist/src/services/infrastructure/EcsServiceResolver.js +1 -1
- package/dist/src/services/infrastructure/LambdaService.js +1 -1
- package/dist/src/services/infrastructure/SsmParameterMetadataService.js +1 -1
- package/dist/src/services/infrastructure/cancelInFlightStack.js +3 -3
- package/dist/src/services/infrastructure/cdkServiceHelpers.js +1 -1
- package/dist/src/services/infrastructure/changeSetProbe.js +1 -1
- package/dist/src/services/infrastructure/constructMapEnrichment.js +1 -1
- package/dist/src/services/supporting/CdkContextBuilder.d.ts +1 -0
- package/dist/src/services/supporting/CdkContextBuilder.js +1 -1
- package/dist/src/services/supporting/TemplateHashService.js +1 -1
- package/dist/src/services/supporting/helpers.js +1 -1
- package/dist/src/steps/stepRegistry.js +1 -1
- package/dist/src/types/ProgressEvent.js +1 -1
- package/dist/src/types/application/ApplicationServiceTypes.js +1 -1
- package/dist/src/types/callbacks.js +1 -1
- package/dist/src/types/config/FjallState.js +1 -1
- package/dist/src/types/constants.js +1 -1
- package/dist/src/types/deployEmitter.js +1 -1
- package/dist/src/types/deployEvent.d.ts +1 -0
- package/dist/src/types/deployEvent.js +1 -1
- package/dist/src/types/deployEventParse.js +1 -1
- package/dist/src/types/deployment/DeploymentServiceTypes.js +1 -1
- package/dist/src/types/deployment/DeploymentTypes.d.ts +1 -0
- package/dist/src/types/deploymentEventSchema.d.ts +1 -0
- package/dist/src/types/deploymentEventSchema.js +1 -1
- package/dist/src/types/detection/patternDetection.js +1 -1
- package/dist/src/types/detection/patternTypes.d.ts +9 -0
- package/dist/src/types/drift.js +1 -1
- package/dist/src/types/errors/CdkError.js +1 -1
- package/dist/src/types/errors/ServiceError.js +1 -1
- package/dist/src/types/operations.d.ts +26 -2
- package/dist/src/types/operations.js +1 -1
- package/dist/src/types/params.d.ts +20 -0
- package/dist/src/types/remediation.js +1 -1
- package/dist/src/types/stepDefinitions.d.ts +3 -0
- package/dist/src/types/stepDefinitions.js +1 -1
- package/dist/src/util/dockerfileDetection.js +1 -1
- package/dist/src/util/sequencedCallbacks.js +1 -1
- package/dist/src/util/sleepAbortable.js +1 -1
- package/package.json +5 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
import{success as
|
|
1
|
+
var y=Object.defineProperty;var f=(i,o)=>y(i,"name",{value:o,configurable:!0});import{success as a}from"@fjall/generator";import{logger as d}from"@fjall/util/logger";import{getErrorMessage as g,maskSensitiveOutput as m}from"@fjall/util";import{extractEcsServiceParts as S,buildArn as x}from"../../aws/utils/arnParser.js";function h(i,o){const u=i.toLowerCase(),r=o.toLowerCase();if(r.length===0)return!1;const l=f(e=>!/[a-zA-Z0-9]/.test(e),"isSeparator"),n=f(e=>/[A-Z]/.test(e),"isUpper");let s=u.indexOf(r);for(;s!==-1;){const e=i[s]??"",t=s>0?i[s-1]??"":"",c=s===0||n(e)||l(t),v=s+r.length,p=i[v],b=p===void 0||n(p)||l(p);if(c&&b)return!0;s=u.indexOf(r,s+1)}return!1}f(h,"matchesAppNameToken");class R{static{f(this,"EcsServiceResolver")}cfService;constructor(o){this.cfService=o}async getDeployableClusterAndServicesByManifest(o,u){try{const r=[];for(const t of o.clusters){r.push(`${t.name}DeployableCluster`);for(const c of t.services)r.push(`${t.name}${c.name}DeployableService`)}if(r.length===0)return a({serviceArns:[]});const l=await this.cfService.getExportsByNames(r,u);if(!l.success)return d.debug("EcsServiceResolver","Failed to get CloudFormation exports by name",{error:l.error.message}),a({serviceArns:[]});const n=l.data;let s;for(const t of o.clusters){const c=n.get(`${t.name}DeployableCluster`);if(c){s=c;break}}const e=[];for(const t of o.clusters)for(const c of t.services){const v=n.get(`${t.name}${c.name}DeployableService`);v&&e.push(v)}return d.debug("EcsServiceResolver",`Manifest-based discovery: found ${e.length} service(s), cluster=${s||"not found"}`),a({clusterArn:s,serviceArns:e})}catch(r){return d.warn("EcsServiceResolver","Manifest-based discovery failed",{error:m(g(r))}),a({serviceArns:[]})}}async getDeployableClusterAndServices(o,u){try{const r=await this.cfService.listExports(void 0,u);if(!r.success)return d.debug("EcsServiceResolver","Failed to list CloudFormation exports",{error:r.error.message}),a({serviceArns:[]});const n=r.data.filter(e=>{const t=e.Name??"";return h(t,o)&&t.toLowerCase().endsWith("deployableservice")}).map(e=>e.Value).filter(e=>e!==void 0);let s;if(n.length>0){const e=S(n[0]);e&&(s=x("ecs",e.region,e.accountId,`cluster/${e.clusterName}`))}return s||(s=r.data.find(t=>{const c=t.Name??"";return h(c,o)&&c.toLowerCase().endsWith("deployablecluster")})?.Value),d.debug("EcsServiceResolver",`Found ${n.length} deployable service(s) for app "${o}" in cluster ${s||"unknown"}`),a({clusterArn:s,serviceArns:n})}catch(r){return d.warn("EcsServiceResolver","Failed to get deployable services",{error:m(g(r))}),a({serviceArns:[]})}}}export{R as EcsServiceResolver,h as matchesAppNameToken};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{GetFunctionConfigurationCommand as
|
|
1
|
+
var _=Object.defineProperty;var p=(c,e)=>_(c,"name",{value:e,configurable:!0});import{GetFunctionConfigurationCommand as C,LambdaClient as $,PublishVersionCommand as g,UpdateFunctionCodeCommand as A}from"@aws-sdk/client-lambda";import{success as f,failure as a}from"@fjall/generator";import{BaseServiceError as L}from"../../types/errors/ServiceError.js";import{logger as m}from"@fjall/util/logger";import{maskSensitiveOutput as b}from"@fjall/util";import{getAwsErrorDetails as w}from"../../aws/utils/awsErrorHandler.js";import{composeSdkAbortSignal as h,isAborted as F,isAccessDenied as P}from"../../aws/organisations/types.js";const v=6e5,T=5e3;function E(c,e){return e===void 0?new Promise(r=>setTimeout(r,c)):e.aborted?Promise.resolve():new Promise(r=>{const o=setTimeout(()=>{e.removeEventListener("abort",t),r()},c),t=p(()=>{clearTimeout(o),r()},"onAbort");e.addEventListener("abort",t,{once:!0})})}p(E,"sleepAbortable");class d extends L{static{p(this,"LambdaError")}functionName;operation;constructor(e,r,o,t){super(`LAMBDA_${o.toUpperCase()}_FAILED`,e,t,!1),this.functionName=r,this.operation=o}}class O{static{p(this,"LambdaService")}aws;constructor(e){this.aws=e}getClient(){return this.aws.getClient($)}async publishVersion(e,r){try{const t=await this.getClient().send(new g({FunctionName:e}),{abortSignal:h(r)});return!t.FunctionArn||!t.Version?a(new d("PublishVersion returned no function ARN or version",e,"publish_version",t)):(m.debug("LambdaService",`Published version ${t.Version} for ${e}`),f({functionArn:t.FunctionArn,version:t.Version}))}catch(o){const{message:t,name:s,httpCode:n}=w(o),i=b(t);m.error("LambdaService",`PublishVersion failed for ${e}: ${s} - ${i}`,{functionName:e,httpCode:n,error:o});let u=`Failed to publish Lambda version for '${e}': ${i}`;return n&&(u+=` (HTTP ${n})`),a(new d(u,e,"publish_version",{error:o,httpCode:n,errorName:s}))}}async updateFunctionCode(e,r,o){try{const t=this.getClient(),s=await t.send(new A({FunctionName:e,ImageUri:r,Publish:!0}),{abortSignal:h(o)});if(!s.FunctionArn||!s.Version)return a(new d("UpdateFunctionCode returned no function ARN or version",e,"update_function_code",s));const n=await this.waitForUpdateCompletion(t,e,o);return n.success?(m.debug("LambdaService",`Updated ${e} to ${r}, published version ${s.Version}`),f({functionArn:s.FunctionArn,version:s.Version,...n.data.unverifiedReason!==void 0?{unverifiedReason:n.data.unverifiedReason}:{}})):a(n.error)}catch(t){const{message:s,name:n,httpCode:i}=w(t),u=b(s);m.error("LambdaService",`UpdateFunctionCode failed for ${e}: ${n} - ${u}`,{functionName:e,imageUri:r,httpCode:i,error:t});let l=`Failed to update Lambda function code for '${e}': ${u}`;return i&&(l+=` (HTTP ${i})`),a(new d(l,e,"update_function_code",{error:t,httpCode:i,errorName:n}))}}async waitForUpdateCompletion(e,r,o){const t=Date.now();for(;Date.now()-t<v;){if(F(o))return a(new d(`Cancelled while waiting for the code update of '${r}' to complete \u2014 the update was accepted and may still land`,r,"update_function_code"));let s,n;try{const i=await e.send(new C({FunctionName:r}),{abortSignal:h(o)});s=i.LastUpdateStatus,n=i.LastUpdateStatusReason}catch(i){const{message:u,name:l}=w(i);return P(l)?f({unverifiedReason:"lambda:GetFunctionConfiguration is denied for this role, so completion of the update could not be verified"}):a(new d(`Failed to verify the code update of '${r}' completed: ${b(u)}`,r,"update_function_code",{errorName:l}))}if(s==="Successful")return f({});if(s==="Failed")return a(new d(`Code update of '${r}' was accepted but failed to apply: ${b(n??"no reason reported")}. The function is still running its previous code.`,r,"update_function_code",{statusReason:n}));await E(T,o)}return a(new d(`Code update of '${r}' did not complete within ${v/1e3}s \u2014 it may still be in progress. Check the Lambda console before retrying.`,r,"update_function_code"))}}export{d as LambdaError,O as LambdaService};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{SSMClient as
|
|
1
|
+
var p=Object.defineProperty;var c=(n,e)=>p(n,"name",{value:e,configurable:!0});import{SSMClient as S,DescribeParametersCommand as P}from"@aws-sdk/client-ssm";import{success as f,failure as b}from"@fjall/generator";import{getErrorMessage as h,maskSensitiveOutput as M}from"@fjall/util";import{composeSdkAbortSignal as k,isAborted as u}from"../../aws/organisations/types.js";const o=50;class g{static{c(this,"SsmParameterMetadataService")}awsProvider;constructor(e){this.awsProvider=e}async describeParametersByName(e,i){if(e.length===0)return f([]);try{const a=this.awsProvider.getClient(S),d=[];for(let t=0;t<e.length&&!u(i);t+=o){const l=e.slice(t,t+o);let s;do{if(u(i))break;const m=await a.send(new P({ParameterFilters:[{Key:"Name",Option:"Equals",Values:l}],MaxResults:o,...s!==void 0?{NextToken:s}:{}}),{abortSignal:k(i)});for(const r of m.Parameters??[])r.Name!==void 0&&d.push({name:r.Name,...r.Version!==void 0?{version:Number(r.Version)}:{},...r.LastModifiedDate!==void 0?{lastModifiedDate:r.LastModifiedDate}:{}});s=m.NextToken}while(s!==void 0)}return f(d)}catch(a){return b(new Error(`SSM DescribeParameters failed: ${M(h(a))}`))}}}export{g as SsmParameterMetadataService};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{CloudFormationClient as
|
|
2
|
-
`),await a.send(new
|
|
3
|
-
`),
|
|
1
|
+
var f=Object.defineProperty;var d=(n,e)=>f(n,"name",{value:e,configurable:!0});import{CloudFormationClient as C,DescribeStacksCommand as m,CancelUpdateStackCommand as g}from"@aws-sdk/client-cloudformation";import{NodeHttpHandler as E}from"@smithy/node-http-handler";import{logger as t}from"@fjall/util/logger";import{getErrorMessage as u,maskSensitiveOutput as S}from"@fjall/util";import{composeSdkAbortSignal as p}from"../../aws/organisations/types.js";import{STACK_NOT_FOUND_PATTERN as _}from"../../types/constants.js";const o="CancelInFlightStack",i=15e3;async function h(n,e,c,s){try{const a=new C({region:e,...c!==void 0?{credentials:c}:{},requestHandler:new E({requestTimeout:i})});let r;try{r=(await a.send(new m({StackName:n}),{abortSignal:p(void 0,i)})).Stacks?.[0]?.StackStatus}catch(l){return l instanceof Error&&l.message?.includes(_)?(t.debug(o,`Stack ${n} does not exist \u2014 nothing to cancel`),"no-op"):(t.warn(o,`Could not read stack status to cancel: ${S(u(l))}`,{stackName:n,region:e}),"no-op")}return r==="UPDATE_IN_PROGRESS"?(s?.(`Cancelling deployment \u2014 CloudFormation is rolling back ${n}\u2026
|
|
2
|
+
`),await a.send(new g({StackName:n}),{abortSignal:p(void 0,i)}),t.warn(o,`Requested rollback of ${n}`,{region:e}),"cancelled-update"):r==="CREATE_IN_PROGRESS"?(s?.(`Deployment cancelled. The initial stack ${n} is still being created in AWS; it will roll back if it fails, or run \`fjall destroy\` to remove it.
|
|
3
|
+
`),t.warn(o,`${n} is CREATE_IN_PROGRESS \u2014 CancelUpdateStack not applicable; leaving for CFN rollback / stack-cleanup`,{region:e}),"create-in-progress"):(t.debug(o,`Stack ${n} status ${r??"unknown"} is not an in-flight update \u2014 no cancel issued`),r===void 0?"no-op":"not-cancellable")}catch(a){return t.warn(o,`CancelUpdateStack attempt failed: ${S(u(a))}`,{stackName:n,region:e}),"no-op"}}d(h,"cancelInFlightStack");export{h as cancelInFlightStack};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getApplicationStackName as l,getOrganisationStackName as u,isApplicationStack as
|
|
1
|
+
var d=Object.defineProperty;var o=(a,e)=>d(a,"name",{value:e,configurable:!0});import{getApplicationStackName as l,getOrganisationStackName as u,isApplicationStack as c}from"../../types/operations.js";const t=5e3;function g(a,e){if(a&&!a.includes("*"))return a;if(a){const n=a.match(/\*?(\w+)\*?/);if(n?.[1]){const r=n[1],i=e.target;return c(r)?l(i,r):`${i}${r}`}return a}}o(g,"resolveStackName");function m(a){const e=a.deployType;return e==="organisation"||e==="platform"||e==="account"?u(e):`${a.target}Network`}o(m,"getFallbackStackName");function s(a,e,n){return{accountId:e,region:n,environment:a.environment,managedAccount:a.isManagedAccount,accountName:a.accountName,orgId:a.orgId,rootId:a.rootId,managementAccountId:a.managementAccountId,devOuId:a.devOuId,ipamPoolId:a.ipamPoolId,fjallOrgId:a.fjallOrgId,fjallOidcConfigured:a.fjallOidcConfigured?"true":void 0,fjallAccountGlobalsConfigured:a.fjallAccountGlobalsConfigured?"true":void 0,fjallAccountTrailState:a.fjallAccountTrailState,orgConfig:a.orgConfig,fjallAdoptBackupVault:a.fjallAdoptBackupVault?"true":void 0,resolvedSecretArns:a.resolvedSecretArns,managedDomainBindings:a.managedDomainBindings}}o(s,"buildDeploymentCdkContext");export{t as STACK_DETECTION_FALLBACK_MS,s as buildDeploymentCdkContext,m as getFallbackStackName,g as resolveStackName};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{randomUUID as
|
|
1
|
+
var N=Object.defineProperty;var S=(w,t)=>N(w,"name",{value:t,configurable:!0});import{randomUUID as $}from"node:crypto";import{CloudFormationClient as I,CreateChangeSetCommand as R,DeleteChangeSetCommand as L,DescribeChangeSetCommand as _,ListChangeSetsCommand as P}from"@aws-sdk/client-cloudformation";import{DeleteObjectCommand as B,PutObjectCommand as D,S3Client as y}from"@aws-sdk/client-s3";import{success as E,failure as c}from"@fjall/generator";import{getErrorMessage as u,maskSensitiveOutput as p}from"@fjall/util";import{logger as m}from"@fjall/util/logger";import{composeSdkAbortSignal as d,isAborted as h}from"../../aws/organisations/types.js";import{sleepAbortable as x}from"../../util/sleepAbortable.js";const f="ChangeSetProbe",M="fjall-preflight-",F=51200;function k(w,t){return`cdk-hnb659fds-assets-${w}-${t}`}S(k,"bootstrapAssetsBucketName");const O=3600*1e3,U=2e3,j=9e4,v=/didn't contain changes|No updates are to be performed/i,G=new Set(["CREATE_COMPLETE","FAILED"]);class Q{static{S(this,"ChangeSetProbe")}aws;pollIntervalMs;pollTimeoutMs;now;constructor(t,e){this.aws=t,this.pollIntervalMs=e?.pollIntervalMs??U,this.pollTimeoutMs=e?.pollTimeoutMs??j,this.now=e?.now??(()=>Date.now())}async probeStackReplacements(t){const{stackName:e,abortSignal:o}=t;if(h(o))return c(new Error(`Change-set probe aborted before starting for ${e}`));await this.sweepLeakedChangeSets(e,o);const n=`${M}${$()}`,s=this.aws.getClient(I);let r;try{const a=JSON.stringify(t.template);let l;if(Buffer.byteLength(a,"utf8")>F){const i=await this.uploadTemplate(n,a,o);if(!i.success)return i;r=i.data.key,l={TemplateURL:i.data.url}}else l={TemplateBody:a};return await s.send(new R({StackName:e,ChangeSetName:n,ChangeSetType:"UPDATE",IncludeNestedStacks:!0,Capabilities:["CAPABILITY_IAM","CAPABILITY_NAMED_IAM","CAPABILITY_AUTO_EXPAND"],Description:"fjall preflight replacement probe \u2014 review-only, never executed",...l}),{abortSignal:d(o)}),await this.collectVerdicts(s,e,n,o)}catch(a){return c(new Error(`Change-set probe failed for ${e}: ${p(u(a))}`))}finally{await s.send(new L({StackName:e,ChangeSetName:n}),{abortSignal:d()}).catch(a=>{m.warn(f,"Failed to delete preflight change set",{stackName:e,changeSetName:n,error:p(u(a))})}),r!==void 0&&await this.deleteUploadedTemplate(r)}}async collectVerdicts(t,e,o,n){const s=this.now();let r,a;for(;!h(n);){const g=await t.send(new _({StackName:e,ChangeSetName:o}),{abortSignal:d(n)});if(r=g.Status,a=g.StatusReason,r!==void 0&&G.has(r))break;if(this.now()-s>=this.pollTimeoutMs)return c(new Error(`Change-set probe timed out after ${this.pollTimeoutMs}ms for ${e} (last status: ${r??"unknown"})`));await x(this.pollIntervalMs,n)}if(h(n))return c(new Error(`Change-set probe aborted while polling ${e}`));if(r==="FAILED")return a!==void 0&&v.test(a)?E({replacementByLogicalId:new Map,noChanges:!0}):c(new Error(`Change-set probe failed for ${e}: ${p(a??"no status reason reported")}`));const l=new Map;let i;do{if(h(n))return c(new Error(`Change-set probe aborted while reading ${e}`));if(i!==void 0&&this.now()-s>=this.pollTimeoutMs)return c(new Error(`Change-set probe timed out after ${this.pollTimeoutMs}ms while reading ${e} resource changes`));const g=await t.send(new _({StackName:e,ChangeSetName:o,...i!==void 0?{NextToken:i}:{}}),{abortSignal:d(n)});for(const b of g.Changes??[]){if(b.Type!=="Resource")continue;const T=b.ResourceChange,A=T?.LogicalResourceId;if(T===void 0||A===void 0)continue;const C=T.Replacement;(C==="True"||C==="False"||C==="Conditional")&&l.set(A,C)}i=g.NextToken}while(i!==void 0);return E({replacementByLogicalId:l,noChanges:!1})}async sweepLeakedChangeSets(t,e){const o=this.aws.getClient(I);try{let n;do{if(h(e))break;const s=await o.send(new P({StackName:t,...n!==void 0?{NextToken:n}:{}}),{abortSignal:d(e)});for(const r of s.Summaries??[]){if(h(e))break;const a=r.ChangeSetName;if(a===void 0||!a.startsWith(M))continue;const l=r.CreationTime?.getTime();l===void 0||this.now()-l<O||(m.warn(f,"Sweeping leaked preflight change set",{stackName:t,changeSetName:a}),await o.send(new L({StackName:t,ChangeSetName:a}),{abortSignal:d(e)}).catch(i=>{m.warn(f,"Failed to sweep leaked change set",{stackName:t,changeSetName:a,error:p(u(i))})}))}n=s.NextToken}while(n!==void 0)}catch(n){m.debug(f,"Leak sweep failed \u2014 continuing to probe",{stackName:t,error:p(u(n))})}}async uploadTemplate(t,e,o){const n=this.aws.getRegion(),s=k(this.aws.getAccountId(),n),r=`fjall-preflight/${t}.template.json`;try{return await this.aws.getClient(y).send(new D({Bucket:s,Key:r,Body:e,ContentType:"application/json"}),{abortSignal:d(o)}),E({key:r,url:`https://${s}.s3.${n}.amazonaws.com/${r}`})}catch(a){return c(new Error(`Change-set probe could not stage the template in ${s}: ${p(u(a))}`))}}async deleteUploadedTemplate(t){const e=k(this.aws.getAccountId(),this.aws.getRegion());try{await this.aws.getClient(y).send(new B({Bucket:e,Key:t}),{abortSignal:d()})}catch(o){m.warn(f,"Failed to delete staged preflight template",{bucket:e,key:t,error:p(u(o))})}}}export{Q as ChangeSetProbe,F as MAX_INLINE_TEMPLATE_BYTES,M as PREFLIGHT_CHANGE_SET_PREFIX,k as bootstrapAssetsBucketName};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{existsSync as
|
|
1
|
+
var s=Object.defineProperty;var i=(t,e)=>s(t,"name",{value:e,configurable:!0});import{existsSync as p,readFileSync as a}from"fs";import{join as f}from"path";import{logger as u}from"@fjall/util/logger";import{enrichFromConstructMap as d,recordToConstructMap as m,FJALL_MANIFEST_FILENAME as h}from"@fjall/util/constructMap";import{getErrorMessage as l}from"@fjall/util";function A(t,e){if(!e)return;const n=f(t,h);let o;try{if(p(n)){const r=JSON.parse(a(n,"utf-8")),c=typeof r=="object"&&r!==null?r.resourceMap:void 0;g(c)&&(o=m(c)),o&&o.size>0&&u.debug("CdkService",`Loaded construct map with ${o.size} entries`)}}catch(r){u.debug("CdkService",`Could not read construct map: ${l(r)}`)}return!o||o.size===0?e:r=>{const c=d(r.logicalId,r.resourceType,o);e({...r,...c.group!==void 0?{group:c.group}:{},...c.constructPath!==void 0?{constructPath:c.constructPath}:{}})}}i(A,"wrapWithConstructMapEnrichment");function g(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;const e=Object.values(t);if(e.length===0)return!0;const n=e[0];return typeof n=="object"&&n!==null&&"constructPath"in n&&"group"in n&&"resourceType"in n}i(g,"isResourceMapRecord");export{A as wrapWithConstructMapEnrichment};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{DEFAULT_REGION as
|
|
1
|
+
var r=Object.defineProperty;var l=(o,e)=>r(o,"name",{value:e,configurable:!0});import{DEFAULT_REGION as t}from"@fjall/generator";class g{static{l(this,"CdkContextBuilder")}static buildDeploymentContext(e,a,d){return{deployType:e.deployType,target:e.target,path:e.path,...e.assemblyDir!==void 0?{assemblyDir:e.assemblyDir}:{},...e.environment!==void 0?{environment:e.environment}:{},options:a,stackOutputs:e.stackOutputs||{},callerIdentity:e.callerIdentity,region:e.region||d?.primaryRegion||t,isManagedAccount:e.isManagedAccount,accountName:e.accountName,logPath:e.logPath,orgId:e.orgId,rootId:e.rootId,managementAccountId:e.managementAccountId,devOuId:e.devOuId,ipamPoolId:e.ipamPoolId,fjallOrgId:e.fjallOrgId,fjallOidcConfigured:e.fjallOidcConfigured,fjallAccountGlobalsConfigured:e.fjallAccountGlobalsConfigured,fjallAccountTrailState:e.fjallAccountTrailState,orgConfig:e.orgConfig,managedDomainBindings:e.managedDomainBindings}}static updateContext(e,a){return{...e,...a}}}export{g as CdkContextBuilder};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createHash as
|
|
1
|
+
var T=Object.defineProperty;var d=(f,e)=>T(f,"name",{value:e,configurable:!0});import{createHash as _}from"crypto";import{readFile as E,readdir as F}from"fs/promises";import{join as w,basename as k}from"path";import{fileExists as A}from"@fjall/util/fsHelpers";import{success as h,failure as i}from"@fjall/generator";import{BaseServiceError as $}from"../../types/errors/ServiceError.js";import{readStateFile as g,writeStateFile as N,readStateFileAt as y,writeStateFileAt as x,createEmptyState as S,updateTemplateHash as H,getStateFilePath as C}from"../../types/config/FjallState.js";class l extends ${static{d(this,"TemplateHashError")}errorType;constructor(e,t,r,a=!1){super(`TEMPLATE_HASH_${t.toUpperCase()}`,e,r,a),this.errorType=t}}const m=".template.json";class R{static{d(this,"TemplateHashService")}async computeTemplateHash(e){try{const t=await E(e,"utf-8"),r=JSON.stringify(JSON.parse(t)),a=_("sha256").update(r).digest("hex");return h(a)}catch(t){return i(new l(`Failed to hash template: ${e}`,"hash_failed",{path:e,error:t}))}}async getTemplateHashes(e){if(!await A(e))return i(new l(`CDK output directory not found: ${e}`,"cdk_out_not_found",{path:e}));try{const r=(await F(e)).filter(s=>s.endsWith(m)),a=new Map;for(const s of r){const n=k(s,m),o=w(e,s),c=await this.computeTemplateHash(o);if(!c.success)return i(c.error);a.set(n,c.data)}return h(a)}catch(t){return i(new l(`Failed to read CDK output directory: ${e}`,"read_failed",{path:e,error:t}))}}async compareWithState(e,t){const r=await g(t),a=new Map;let s=0,n=0;for(const[o,c]of e){const u=r?.templateHashes[o],p=!u||u.hash!==c;a.set(o,p),p?s++:n++}if(r?.templateHashes)for(const o of Object.keys(r.templateHashes))e.has(o)||(a.set(o,!0),s++);return h({stackChanges:a,currentHashes:e,changedCount:s,unchangedCount:n})}async updateStateAfterDeploy(e,t,r){try{let a=await g(e)??S();for(const[s,n]of t){const o=r?.get(s);a=H(a,s,n,o)}return await N(e,a),h(void 0)}catch(a){return i(new l(`Failed to write state file: ${C(e)}`,"state_write_failed",{appPath:e,error:a}))}}async compareCascadeStack(e,t,r){const a=w(e,`${t}${m}`),s=await this.computeTemplateHash(a);if(!s.success)return{changed:!0,currentHash:void 0};const n=s.data,c=(await y(r))?.templateHashes[t];return{changed:!c||c.hash!==n,currentHash:n}}async persistCascadeStack(e,t,r,a){try{const s=await y(e)??S(),n=H(s,t,r,a);return await x(e,n),h(void 0)}catch(s){return i(new l(`Failed to write cascade state file: ${e}`,"state_write_failed",{stateFilePath:e,error:s}))}}getStateFilePath(e){return C(e)}stackHasChanges(e,t){return e.stackChanges.get(t)??!0}getChangedStacks(e){return Array.from(e.stackChanges.entries()).filter(([,t])=>t).map(([t])=>t)}getUnchangedStacks(e){return Array.from(e.stackChanges.entries()).filter(([,t])=>!t).map(([t])=>t)}}export{l as TemplateHashError,R as TemplateHashService};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
var r=Object.defineProperty;var n=(i,t)=>r(i,"name",{value:t,configurable:!0});function s(i,t,e="info"){i?.onProgress?.({type:e,message:t})}n(s,"emitProgress");const a=Object.freeze({BUILD:"Building Next.js application",SYNTH:"Synthesising infrastructure",HASH:"Comparing template hashes",DOCKER:"Validating Docker configuration",SECRETS:"Validating SSM secrets"});function o(i,t){const e=i.toLowerCase();return e.includes("creating next.js build")||e.includes("creating an optimised production build")?"Creating production build...":e.includes("compiling")?"Compiling...":e.includes("linting")?"Linting...":e.includes("checking validity of types")?"Type checking...":e.includes("collecting page data")?"Collecting page data...":e.includes("generating static pages")?"Generating static pages...":e.includes("finalizing page optimization")?"Optimising pages...":e.includes("open-next build complete")||e.includes("build completed")?"Build complete":e.includes("bundling")?"Bundling functions...":e.includes("copying assets")?"Copying assets...":t}n(o,"parseBuildPhase");function c(i){if(i)return{requiresDatabase:i.requiresDatabase??!1,databaseEnvVar:i.databaseEnvVar??"DATABASE_URL"}}n(c,"buildStepContextBuildConfig");function l(i){const t={};for(const e of i)e.OutputKey&&e.OutputValue!==void 0&&(t[e.OutputKey]=e.OutputValue);return t}n(l,"convertCloudFormationOutputsToRecord");export{a as PROGRESS_MESSAGES,c as buildStepContextBuildConfig,l as convertCloudFormationOutputsToRecord,s as emitProgress,o as parseBuildPhase};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{APPLICATION_STACKS as n,APPLICATION_DEPLOY_ORDER as
|
|
1
|
+
var l=Object.defineProperty;var S=(c,r)=>l(c,"name",{value:r,configurable:!0});import{APPLICATION_STACKS as n,APPLICATION_DEPLOY_ORDER as C,getApplicationStepName as t,getApplicationStepId as a}from"../types/index.js";import{STEP_IDS as e,STEP_NAMES as s,INFRA_STEP_NAME as E}from"../types/index.js";const O={Network:e.NETWORK_DESTROY,Storage:e.STORAGE_DESTROY,Messaging:e.MESSAGING_DESTROY,Database:e.DATABASE_DESTROY,Compute:e.COMPUTE_DESTROY,UsEast1Certificates:e.US_EAST_1_CERTIFICATES_DESTROY,Cdn:e.CDN_DESTROY};function D(c){return O[c]??`${c.toLowerCase()}-destroy`}S(D,"getDestroyStepId");class y{static{S(this,"StepRegistry")}static DEPLOYMENT_STEPS=new Map([["application-deploy",[{id:e.AUTH,name:s.AUTH},{id:e.DETECT_CONFIG,name:s.PREPARE_DEPLOY},{id:e.TARGET_READINESS,name:s.TARGET_READINESS,conditions:{requiresInfra:!0}},{id:e.BOOTSTRAP,name:s.BOOTSTRAP,conditions:{requiresInfra:!0}},{id:a(n.NETWORK,"deploy"),name:t(n.NETWORK,"deploy"),conditions:{requiresInfra:!0,requiresNetwork:!0}},{id:a(n.STORAGE,"deploy"),name:t(n.STORAGE,"deploy"),conditions:{requiresInfra:!0,requiresStorage:!0}},{id:a(n.MESSAGING,"deploy"),name:t(n.MESSAGING,"deploy"),conditions:{requiresInfra:!0,requiresMessaging:!0}},{id:a(n.DATABASE,"deploy"),name:t(n.DATABASE,"deploy"),conditions:{requiresInfra:!0,requiresDatabase:!0}},{id:e.DOCKER_OPERATIONS,name:"Docker operations",conditions:{requiresDocker:!0,requiresCompute:!0,skipForInfraOnly:!0}},{id:e.TAG_ECR_IMAGES,name:"Tagging container images",conditions:{requiresImageTagging:!0,requiresCompute:!0,skipForInfraOnly:!0}},{id:a(n.COMPUTE,"deploy"),name:t(n.COMPUTE,"deploy"),conditions:{requiresInfra:!0,requiresCompute:!0}},{id:a(n.US_EAST_1_CERTIFICATES,"deploy"),name:t(n.US_EAST_1_CERTIFICATES,"deploy"),conditions:{requiresInfra:!0,requiresUsEast1Certificates:!0}},{id:a(n.CDN,"deploy"),name:t(n.CDN,"deploy"),conditions:{requiresInfra:!0,requiresCdn:!0}}]],["application-destroy",[{id:e.AUTH,name:s.AUTH},{id:e.DETECT_CONFIG,name:s.CHECK_INFRA_STATE},{id:a(n.CDN,"destroy"),name:t(n.CDN,"destroy"),conditions:{requiresCdn:!0}},{id:a(n.US_EAST_1_CERTIFICATES,"destroy"),name:t(n.US_EAST_1_CERTIFICATES,"destroy"),conditions:{requiresUsEast1Certificates:!0}},{id:a(n.COMPUTE,"destroy"),name:t(n.COMPUTE,"destroy")},{id:a(n.DATABASE,"destroy"),name:t(n.DATABASE,"destroy")},{id:a(n.MESSAGING,"destroy"),name:t(n.MESSAGING,"destroy"),conditions:{requiresMessaging:!0}},{id:a(n.STORAGE,"destroy"),name:t(n.STORAGE,"destroy"),conditions:{requiresStorage:!0}},{id:a(n.NETWORK,"destroy"),name:t(n.NETWORK,"destroy")}]],["organisation-deploy",[{id:e.AUTH,name:s.AUTH},{id:e.ORG_SETUP,name:s.ORG_SETUP},{id:e.PREPARE_ENVIRONMENT,name:E.PREPARE},{id:e.ORG_DEPLOY,name:s.ORG_DEPLOY,conditions:{requiresOrgChanges:!0}},{id:e.CASCADE_PLATFORM,name:s.CASCADE_PLATFORM,conditions:{requiresPlatformAccount:!0}},{id:e.CASCADE_ACCOUNTS,name:s.CASCADE_ACCOUNTS,conditions:{requiresMemberAccounts:!0}}]],["organisation-destroy",[{id:e.AUTH,name:s.AUTH},{id:e.CFN_CHECK,name:s.CHECK_INFRA_STATE},{id:e.CASCADE_ACCOUNTS,name:"Destroying account infrastructure",conditions:{requiresMemberAccounts:!0}},{id:e.CASCADE_PLATFORM,name:"Destroying platform infrastructure",conditions:{requiresPlatformAccount:!0}},{id:e.DESTROY,name:"Destroying organisation infrastructure"}]],["platform-deploy",[{id:e.AUTH,name:s.AUTH},{id:e.CONNECT,name:E.CONNECT},{id:e.PREPARE_ENVIRONMENT,name:E.PREPARE},{id:e.DEPLOY,name:E.DEPLOY},{id:e.MONITORING,name:E.MONITORING}]],["platform-destroy",[{id:e.AUTH,name:s.AUTH},{id:e.CFN_CHECK,name:"Checking infrastructure state"},{id:e.ORG_DESTROY,name:"Destroying platform infrastructure"}]],["account-deploy",[{id:e.AUTH,name:s.AUTH},{id:e.CONNECT,name:E.CONNECT},{id:e.PREPARE_ENVIRONMENT,name:E.PREPARE},{id:e.DEPLOY,name:E.DEPLOY},{id:e.MONITORING,name:E.MONITORING}]],["account-destroy",[{id:e.AUTH,name:s.AUTH},{id:e.CFN_CHECK,name:"Checking infrastructure state"},{id:e.ORG_DESTROY,name:"Destroying account infrastructure"}]]]);static getSteps(r){if(r.deploymentType==="application"&&r.operation==="deploy"&&r.deployOnly)return[{id:e.AUTH,name:s.AUTH},{id:e.DOCKER_OPERATIONS,name:"Build and push Docker container"},{id:a(n.COMPUTE,"deploy"),name:t(n.COMPUTE,"deploy")}];const o=`${r.deploymentType}-${r.operation}`;return(this.DEPLOYMENT_STEPS.get(o)??[]).filter(i=>{if(r.deploymentType==="application"){const A=r.builderName==="opennext";if(i.conditions?.requiresInfra&&r.deployOnly)return!1;if(r.resources){const d=r.resources;if(i.conditions?.requiresNetwork&&!d.hasNetwork||i.conditions?.requiresCompute&&!d.hasCompute||i.conditions?.requiresDatabase&&!d.hasDatabase||i.conditions?.requiresStorage&&!d.hasStorage||i.conditions?.requiresMessaging&&!d.hasMessaging||i.conditions?.requiresCdn&&!d.hasCdn||i.conditions?.requiresUsEast1Certificates&&d.hasUsEast1Certificates!==!0)return!1}else if(r.operation==="deploy"&&!A){if(i.conditions?.requiresNetwork||i.conditions?.requiresCompute||i.conditions?.requiresDatabase||i.conditions?.requiresStorage||i.conditions?.requiresMessaging||i.conditions?.requiresCdn||i.conditions?.requiresUsEast1Certificates)return!1}else if(r.operation==="deploy"&&i.conditions?.requiresUsEast1Certificates)return!1;if(i.conditions?.requiresDocker||i.id===e.DOCKER_OPERATIONS)return A||r.infraOnly||r.resources&&!r.resources.hasCompute?!1:r.deployOnly?r.hasDockerfile===!0:r.hasDockerfile===!0||r.hasDockerfile===!1&&!r.isManagedAccount;if(i.conditions?.requiresImageTagging)return r.infraOnly||A||r.resources&&!r.resources.hasCompute?!1:r.hasDockerfile===!1}return!(i.conditions?.requiresMemberAccounts&&!r.hasMemberAccounts||i.conditions?.requiresPlatformAccount&&!r.hasPlatformAccount||i.conditions?.requiresOrgChanges&&r.hasOrgChanges!==!0||i.conditions?.requiresPlatformChanges&&r.hasPlatformChanges!==!0||i.conditions?.requiresAccountChanges&&r.hasAccountChanges!==!0||i.conditions?.requiresDomainConfiguration&&!r.hasDomainConfiguration||i.conditions?.requiresDomainChanges&&r.hasDomainChanges!==!0)}).map(i=>i.id===e.DOCKER_OPERATIONS?{...i,name:r.hasDockerfile?"Building and pushing Docker image":"Initialising container repository"}:i)}static getStepNames(r){return this.getSteps(r).map(o=>o.name)}static getStepIndex(r,o){return this.getSteps(o).findIndex(T=>T.id===r)}static getStepById(r,o="application"){const u=`${o}-deploy`,i=(this.DEPLOYMENT_STEPS.get(u)||[]).find(f=>f.id===r);if(i)return i;const A=`${o}-destroy`;return(this.DEPLOYMENT_STEPS.get(A)||[]).find(f=>f.id===r)}static isStepIncluded(r,o){return this.getSteps(o).some(T=>T.id===r)}static createContext(r,o,u){return{deploymentType:r,operation:o,deployOnly:u?.deployOnly??!1,infraOnly:u?.infraOnly??!1,isManagedAccount:u?.isManagedAccount??!1,hasDockerfile:u?.hasDockerfile??!1,pattern:u?.pattern??null,builderName:u?.builderName,resources:u?.resources}}static getDeploymentTypes(){return["application","organisation","platform","account"]}static getStackNames(r){switch(r){case"application":return[...C];case"organisation":return["Organisation"];case"platform":return["Platform"];case"account":return["Account"];default:return[]}}static getInfraStepIds(){return[e.CFN_CHECK,e.TARGET_READINESS,e.BOOTSTRAP,e.DIFF,e.NETWORK,e.STORAGE,e.MESSAGING,e.DATABASE,e.COMPUTE,e.US_EAST_1_CERTIFICATES,e.CDN]}static getDockerStepIds(){return[e.ECR_INIT,e.DOCKER_DEPLOY]}}export{y as StepRegistry,D as getDestroyStepId};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
class
|
|
1
|
+
var n=Object.defineProperty;var a=(e,s)=>n(e,"name",{value:s,configurable:!0});class c{static{a(this,"ProgressReporter")}callbacks;stepIndex=0;totalSteps;constructor(s){this.callbacks=s}setTotalSteps(s){this.totalSteps=s}step(s,t){const{metadata:r,stepIndex:o,totalSteps:l}=t??{};this.callbacks?.onProgress?.({type:"step",message:s,metadata:{...r,stepIndex:o??this.stepIndex++,totalSteps:l??this.totalSteps}})}info(s,t){this.callbacks?.onProgress?.({type:"info",message:s,metadata:t})}spinner(s,t){this.callbacks?.onProgress?.({type:"spinner",message:s,metadata:t})}warning(s,t){this.callbacks?.onProgress?.({type:"warning",message:s,metadata:t})}debug(s,t){this.callbacks?.onProgress?.({type:"debug",message:s,metadata:t})}error(s,t){this.callbacks?.onProgress?.({type:"error",message:s,metadata:t})}}export{c as ProgressReporter};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{BaseServiceError as
|
|
1
|
+
var o=Object.defineProperty;var p=(a,r)=>o(a,"name",{value:r,configurable:!0});import{BaseServiceError as i}from"../errors/ServiceError.js";import{getErrorMessage as m,maskSensitiveOutput as n}from"@fjall/util";function f(a,r,e,s,t){const c=n(m(t));return new u(`${a}: ${c}`,{errorType:r,appName:e,operation:s,details:t,...t instanceof Error&&{cause:t}})}p(f,"wrapApplicationError");class u extends i{static{p(this,"ApplicationError")}errorType;appName;operation;stackType;constructor(r,e){super(`APPLICATION_${e.errorType.toUpperCase()}`,r,e.details,e.recoverable??!1,e.cause),this.errorType=e.errorType,this.appName=e.appName,this.operation=e.operation,this.stackType=e.stackType}}export{u as ApplicationError,f as wrapApplicationError};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
var i=Object.defineProperty;var n=(e,t)=>i(e,"name",{value:t,configurable:!0});function r(e){return e!==void 0&&"bucketName"in e}n(r,"isQuarantineDetail");function a(e){return e!==void 0&&"retainedBuckets"in e}n(a,"isRetainedBucketsDetail");export{r as isQuarantineDetail,a as isRetainedBucketsDetail};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{z as a}from"zod";import{randomBytes as
|
|
1
|
+
var f=Object.defineProperty;var n=(t,e)=>f(t,"name",{value:e,configurable:!0});import{z as a}from"zod";import{randomBytes as d}from"crypto";import{readFile as m,writeFile as S,unlink as c,rename as g,mkdir as h}from"fs/promises";import{dirname as y,join as p}from"path";import{fileExists as F}from"@fjall/util/fsHelpers";import{logger as i}from"@fjall/util/logger";import{getErrorMessage as l,maskSensitiveOutput as w}from"@fjall/util";const x=a.object({hash:a.string(),deployedAt:a.string(),stackStatus:a.string().optional()}).strict(),j=a.object({version:a.literal(1),lastDeployedAt:a.string().optional(),templateHashes:a.record(a.string(),x),metadata:a.record(a.string(),a.unknown()).optional()}).strict(),E=".fjall-state.json";function s(t){return p(t,E)}n(s,"getStateFilePath");function A(t){return t.replace(/-/g,"")}n(A,"regionSuffix");function J(t,e,r){return p(t,`.fjall-state.cascade-${e}-${A(r)}.json`)}n(J,"getCascadeStateFilePath");async function H(t){if(!await F(t))return null;try{const e=await m(t,"utf-8"),r=JSON.parse(e),o=j.safeParse(r);return o.success?o.data:null}catch(e){return i.debug("FjallState","Failed to read state file",{path:t,error:l(e)}),null}}n(H,"readStateFileAt");async function O(t,e){const r=`${t}.${Date.now()}-${d(4).toString("hex")}.tmp`;await h(y(t),{recursive:!0});try{await S(r,JSON.stringify(e,null,2),"utf-8"),await g(r,t)}catch(o){try{await c(r)}catch(u){i.debug("FjallState","Temp file cleanup failed (non-fatal)",{path:r,error:l(u)})}throw o}}n(O,"writeStateFileAt");async function M(t){return H(s(t))}n(M,"readStateFile");async function _(t,e){return O(s(t),e)}n(_,"writeStateFile");function z(){return{version:1,templateHashes:{}}}n(z,"createEmptyState");async function B(t){const e=s(t);try{await c(e)}catch(r){(typeof r=="object"&&r!==null&&"code"in r?r.code:void 0)!=="ENOENT"&&i.warn("FjallState","Failed to delete state file",{path:e,error:w(l(r))})}}n(B,"deleteStateFile");function C(t,e,r,o){return{...t,lastDeployedAt:new Date().toISOString(),templateHashes:{...t.templateHashes,[e]:{hash:r,deployedAt:new Date().toISOString(),...o!==void 0&&{stackStatus:o}}}}}n(C,"updateTemplateHash");export{j as FjallStateFileSchema,z as createEmptyState,B as deleteStateFile,J as getCascadeStateFilePath,s as getStateFilePath,M as readStateFile,H as readStateFileAt,A as regionSuffix,C as updateTemplateHash,_ as writeStateFile,O as writeStateFileAt};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
var E=Object.defineProperty;var e=(t,A)=>E(t,"name",{value:A,configurable:!0});const o="does not exist",_="is in a failed state",n="No stacks match the name(s)",a="infrastructure.ts",T=new Set(["ROLLBACK_FAILED","ROLLBACK_COMPLETE","DELETE_FAILED"]);function r(t){return T.has(t)}e(r,"isCleanableState");export{n as CDK_NO_STACKS_MATCH,a as INFRASTRUCTURE_FILENAME,T as SAFE_CLEANUP_STATES,_ as STACK_FAILED_STATE_PATTERN,o as STACK_NOT_FOUND_PATTERN,r as isCleanableState};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{maskSensitiveOutput as
|
|
1
|
+
var y=Object.defineProperty;var l=(a,d)=>y(a,"name",{value:d,configurable:!0});import{maskSensitiveOutput as K}from"@fjall/util";import{DEPLOY_EVENT_CONTRACT as h,DEPLOY_EVENT_ERROR_MESSAGE_MAX as c,DEPLOY_EVENT_MESSAGE_MAX as g,DEPLOY_EVENT_OUTPUT_MAX as f,DEPLOY_EVENT_STATUS_REASON_MAX as p,DEPLOY_EVENT_TRAIL_DETAIL_MAX as A,DEPLOY_EVENT_URL_MAX as k}from"./deployEvent.js";function t(a,d){const u=K(a);return u.length>d?u.slice(0,d):u}l(t,"maskAndCap");function C(a){const d={};for(const[u,m]of Object.entries(a))d[u]=t(m,p);return d}l(C,"maskOutputValues");function N(a){const{deploymentId:d,onEvent:u}=a,m=a.now??(()=>new Date().toISOString());let v=a.startSeq??0;function n(){return{contract:h,deploymentId:d,seq:v++,time:m()}}l(n,"envelope");function s(e){return u(e),e}return l(s,"dispatch"),{stepStarted(e){const r={...n(),progressKind:"step.started",...e};return s(r)},stepCompleted(e){const r={...n(),progressKind:"step.completed",step:e.step,status:e.status,...e.progress!==void 0&&{progress:e.progress},...e.errorMessage!==void 0&&{errorMessage:t(e.errorMessage,c)}};return s(r)},log(e){const r={...n(),progressKind:"log",level:e.level,message:t(e.message,g)};return s(r)},output(e){const r={...n(),progressKind:"output",chunk:t(e.chunk,f)};return s(r)},resource(e){const r={...n(),progressKind:"resource",resource:{...e.resource,...e.resource.statusReason!==void 0&&{statusReason:t(e.resource.statusReason,p)}},...e.scope!==void 0&&{scope:e.scope}};return s(r)},parallelPhase(e){const r={...n(),progressKind:"phase.parallel",status:e.status,stacks:e.stacks,...e.description!==void 0&&{description:e.description},...e.results!==void 0&&{results:e.results.map(i=>({stack:i.stack,success:i.success,...i.error!==void 0&&{error:t(i.error,c)}}))}};return s(r)},buildStarted(e){const r={...n(),progressKind:"build.started",...e};return s(r)},buildProgress(e){const r={...n(),progressKind:"build.progress",builder:e.builder,message:t(e.message,g),...e.serviceName!==void 0&&{serviceName:e.serviceName},...e.percentage!==void 0&&{percentage:e.percentage},...e.layerId!==void 0&&{layerId:e.layerId},...e.status!==void 0&&{status:e.status}};return s(r)},buildCompleted(e){const r={...n(),progressKind:"build.completed",builder:e.builder,success:e.success,...e.serviceName!==void 0&&{serviceName:e.serviceName},...e.imageTag!==void 0&&{imageTag:e.imageTag},...e.imageDigest!==void 0&&{imageDigest:e.imageDigest},...e.imageUri!==void 0&&{imageUri:e.imageUri},...e.ecrRepositoryArn!==void 0&&{ecrRepositoryArn:e.ecrRepositoryArn},...e.durationMs!==void 0&&{durationMs:e.durationMs},...e.error!==void 0&&{error:t(e.error,c)}};return s(r)},taskDefRegistered(e){const r={...n(),progressKind:"taskdef.registered",...e};return s(r)},ecsUpdate(e){const r={...n(),progressKind:"ecs.update",...e};return s(r)},ecsProgress(e){const r={...n(),progressKind:"ecs.progress",message:t(e.message,g),...e.percentage!==void 0&&{percentage:e.percentage}};return s(r)},ecsCompleted(e){const r={...n(),progressKind:"ecs.completed",serviceName:e.serviceName,serviceArn:e.serviceArn,success:e.success,taskDefinitionArn:e.taskDefinitionArn,durationMs:e.durationMs,...e.reason!==void 0&&{reason:t(e.reason,p)},...e.finalRunningCount!==void 0&&{finalRunningCount:e.finalRunningCount},...e.finalDesiredCount!==void 0&&{finalDesiredCount:e.finalDesiredCount}};return s(r)},migrationsStarted(e){const r={...n(),progressKind:"migrations.started",...e};return s(r)},migrationsCompleted(e){const r={...n(),progressKind:"migrations.completed",family:e.family,taskDefinitionArn:e.taskDefinitionArn,success:e.success,durationMs:e.durationMs,...e.exitCode!==void 0&&{exitCode:e.exitCode},...e.reason!==void 0&&{reason:t(e.reason,p)}};return s(r)},cdkBootstrap(e){const r={...n(),progressKind:"cdk.bootstrap",...e};return s(r)},cdkOutput(e){const r={...n(),progressKind:"cdk.output",outputType:e.outputType,output:t(e.output,f)};return s(r)},detectionCompleted(e){const r={...n(),progressKind:"detection.completed",...e};return s(r)},detectionPhase(e){const r={...n(),progressKind:"detection.phase",...e};return s(r)},cascadeStarted(){const e={...n(),progressKind:"cascade.started"};return s(e)},cascadeAccountsReconciled(e){const r={...n(),progressKind:"cascade.accountsReconciled",...e};return s(r)},cascadeOrgChanges(e){const r={...n(),progressKind:"cascade.orgChanges",...e};return s(r)},cascadeMissingAccounts(e){const r={...n(),progressKind:"cascade.missingAccounts",...e};return s(r)},cascadePhase(e){const r={...n(),progressKind:"cascade.phase",...e};return s(r)},cascadeAccountStarted(e){const r={...n(),progressKind:"cascade.account.started",...e};return s(r)},cascadeAccountPhase(e){const r={...n(),progressKind:"cascade.account.phase",...e};return s(r)},cascadeAccountCompleted(e){const r={...n(),progressKind:"cascade.account.completed",operationKey:e.operationKey,success:e.success,...e.error!==void 0&&{error:t(e.error,c)},...e.region!==void 0&&{region:e.region},...e.outputs!==void 0&&{outputs:C(e.outputs)},...e.skipped!==void 0&&{skipped:e.skipped}};return s(r)},cascadeCompleted(e){const r={...n(),progressKind:"cascade.completed",result:{platformDeployed:e.result.platformDeployed,platformSkipped:e.result.platformSkipped,platformFailed:e.result.platformFailed,domainsDeployed:e.result.domainsDeployed,accountsDeployed:e.result.accountsDeployed,accountsSkipped:e.result.accountsSkipped,accountsFailed:e.result.accountsFailed,errors:e.result.errors.map(i=>({accountId:i.accountId,error:t(i.error,c)}))}};return s(r)},cascadeLedger(e){const{ledger:r}=e,i={...n(),progressKind:"cascade.ledger",ledger:{members:r.members.map(o=>({accountId:o.accountId,accountName:o.accountName,region:o.region,result:o.result,durationMs:o.durationMs,...o.error!==void 0&&{error:t(o.error,c)}})),...r.platform!==void 0&&{platform:{accountId:r.platform.accountId,result:r.platform.result,durationMs:r.platform.durationMs,...r.platform.error!==void 0&&{error:t(r.platform.error,c)}}},domainsDeployed:r.domainsDeployed,errors:r.errors.map(o=>({accountId:o.accountId,error:t(o.error,c)})),totalDurationMs:r.totalDurationMs}};return s(i)},trailPhase(e){const r={...n(),progressKind:"trail.phase",accountId:e.accountId,accountName:e.accountName,phase:e.phase,status:e.status,...e.detail!==void 0&&{detail:t(e.detail,A)}};return s(r)},trailLifecycle(e){const r={...n(),progressKind:"trail.lifecycle",accountId:e.accountId,to:e.to,...e.from!==void 0&&{from:e.from}};return s(r)},cleanupProgress(e){const r={...n(),progressKind:"cleanup.progress",stackName:e.stackName,phase:e.phase,...e.detail!==void 0&&{detail:e.detail}};return s(r)},authSsoUrl(e){const r={...n(),progressKind:"auth.ssoUrl",url:e.url===null?null:t(e.url,k)};return s(r)},authCompleted(e){const r={...n(),progressKind:"auth.completed",...e};return s(r)},error(e){const r={...n(),progressKind:"error",message:t(e.message,c),...e.name!==void 0&&{name:e.name}};return s(r)},deployCompleted(e){const r={...n(),progressKind:"deploy.completed",result:e.result,ok:e.ok,...e.errorType!==void 0&&{errorType:e.errorType},message:t(e.message,g)};return s(r)},planAvailable(e){const r={...n(),progressKind:"plan.available",plan:{summary:t(e.plan.summary,g),changeCount:e.plan.changeCount,hasDestructiveChanges:e.plan.hasDestructiveChanges,...e.plan.changes!==void 0&&{changes:e.plan.changes},...e.plan.diffRef!==void 0&&{diffRef:e.plan.diffRef},...e.plan.iamBroadening!==void 0&&{iamBroadening:e.plan.iamBroadening},...e.plan.securityGroupBroadening!==void 0&&{securityGroupBroadening:e.plan.securityGroupBroadening},...e.plan.changeCountsByAction!==void 0&&{changeCountsByAction:e.plan.changeCountsByAction}}};return s(r)},approvalAwaiting(e){const r={...n(),progressKind:"approval.awaiting",approval:{token:e.approval.token,kind:e.approval.kind,reason:t(e.approval.reason,g),expiresAt:e.approval.expiresAt,...e.approval.assemblyDigest!==void 0&&{assemblyDigest:e.approval.assemblyDigest},...e.approval.changeCounts!==void 0&&{changeCounts:e.approval.changeCounts},...e.approval.approvalClass!==void 0&&{approvalClass:e.approval.approvalClass},...e.approval.requiredApprovers!==void 0&&{requiredApprovers:e.approval.requiredApprovers}}};return s(r)},approvalResolved(e){const r={...n(),progressKind:"approval.resolved",...e};return s(r)}}}l(N,"createDeployEmitter");export{N as createDeployEmitter};
|
|
@@ -493,6 +493,7 @@ export declare const DeployEventSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
493
493
|
hasStorage: z.ZodBoolean;
|
|
494
494
|
hasMessaging: z.ZodBoolean;
|
|
495
495
|
hasCdn: z.ZodBoolean;
|
|
496
|
+
hasUsEast1Certificates: z.ZodOptional<z.ZodBoolean>;
|
|
496
497
|
}, z.core.$strict>;
|
|
497
498
|
requiredSecrets: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
498
499
|
}, z.core.$strict>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{z as e}from"zod";import{CASCADE_PHASES as h,DEPLOYMENT_EVENT_RESOURCE_CATEGORIES as E}from"./deploymentEventSchema.js";import{TRAIL_MIGRATION_PHASES as A,TRAIL_MIGRATION_STATUSES as C}from"./events.js";import{TRAIL_LIFECYCLE_STATES as p}from"@fjall/util/config";const Ue="fjall.deploy/1.1",Ve=1,Ye=1,_=["fjall.deploy/1.0","fjall.deploy/1.1"],a=256,o=256,s=2048,i=2048,n=4096,j=2048,m=8192,r=2048,g=4096,T=["completed","skipped","error","cancelled"],y=["info","debug","warn"],D=["emptying-bucket","deleting-stack","waiting","complete","error","quarantine-suspected","retained-buckets"],v=["bootstrap","synth","deploy","destroy"],P=["success","failure","cancelled","no-changes","rejected"],R=["detect","synth","hash","validate"],c=["started","completed"],l=["docker","buildpush","opennext","staticsite"],d=["succeeded","skipped","failed"],N=["create","update","replace","delete","read","no-op"],K=["will","may","conditional","none"],O=["destructive","cost","policy"],f=["approved","rejected","expired","superseded"],u=e.object({create:e.number().int().nonnegative(),update:e.number().int().nonnegative(),replace:e.number().int().nonnegative(),delete:e.number().int().nonnegative(),read:e.number().int().nonnegative(),"no-op":e.number().int().nonnegative()}).strict(),L={create:!0,update:!0,replace:!0,delete:!0,read:!0,"no-op":!0},t={contract:e.enum(_),deploymentId:e.string().min(1).max(a),seq:e.number().int().nonnegative(),time:e.string().datetime()},x=e.object({index:e.number().int().nonnegative(),total:e.number().int().positive()}).strict(),b=e.object({id:e.string().max(a),name:e.string().max(o)}).strict(),k=e.object({logicalId:e.string().max(a),resourceType:e.string().max(a),status:e.string().max(64),displayName:e.string().max(o).optional(),category:e.enum(E).optional(),group:e.string().max(128).optional(),constructPath:e.string().max(512).optional(),statusReason:e.string().max(i).optional(),physicalId:e.string().max(r).optional(),expectedDurationSeconds:e.number().nonnegative().optional()}).strict(),M=e.object({pattern:e.string().max(128).nullable(),hasDockerfile:e.boolean(),hasDifferences:e.boolean(),resources:e.object({hasNetwork:e.boolean(),hasCompute:e.boolean(),hasDatabase:e.boolean(),hasStorage:e.boolean(),hasMessaging:e.boolean(),hasCdn:e.boolean()}).strict(),requiredSecrets:e.array(e.string().max(512)).max(100).optional()}).strict(),I=e.object({path:e.string().max(512),forcesReplacement:e.boolean()}).strict(),U=e.object({address:e.string().max(512),resourceType:e.string().max(a),action:e.enum(N),stack:e.string().max(a).optional(),replacementMode:e.enum(K).optional(),dataLoss:e.boolean().optional(),propertyChanges:e.array(I).max(100).optional()}).strict(),S=e.object({accountId:e.string().max(a),error:e.string().max(n)}).strict(),V=e.object({platformDeployed:e.boolean(),platformSkipped:e.boolean(),platformFailed:e.boolean(),domainsDeployed:e.boolean(),accountsDeployed:e.number().int().nonnegative(),accountsSkipped:e.number().int().nonnegative(),accountsFailed:e.number().int().nonnegative(),errors:e.array(S).max(1e3)}).strict(),Y=e.object({accountId:e.string().max(a),accountName:e.string().max(o),region:e.string().max(a),result:e.enum(d),durationMs:e.number().nonnegative(),error:e.string().max(n).optional()}).strict(),B=e.object({accountId:e.string().max(a),result:e.enum(d),durationMs:e.number().nonnegative(),error:e.string().max(n).optional()}).strict(),G=e.object({members:e.array(Y).max(1e3),platform:B.optional(),domainsDeployed:e.boolean(),errors:e.array(S).max(1e3),totalDurationMs:e.number().nonnegative()}).strict(),X=e.object({bucketName:e.string().max(o),accountId:e.string().max(a).optional()}).strict(),w=e.object({retainedBuckets:e.array(e.string().max(o)).max(1e3),message:e.string().max(s)}).strict(),H=e.union([X,w]),q=e.object({stack:e.string().max(a),success:e.boolean(),error:e.string().max(n).optional()}).strict(),F=e.object({accountId:e.string().max(a),region:e.string().max(a),profileName:e.string().max(o).optional()}).strict(),z=e.object({...t,progressKind:e.literal("step.started"),step:b,progress:x.optional()}).strict(),J=e.object({...t,progressKind:e.literal("step.completed"),step:b,status:e.enum(T),progress:x.optional(),errorMessage:e.string().max(n).optional()}).strict(),Q=e.object({...t,progressKind:e.literal("log"),level:e.enum(y),message:e.string().max(s)}).strict(),W=e.object({...t,progressKind:e.literal("output"),chunk:e.string().max(m)}).strict(),Z=e.object({...t,progressKind:e.literal("resource"),resource:k,scope:e.object({stack:e.string().max(a).optional(),operationKey:e.string().max(a).optional(),region:e.string().max(a).optional()}).strict().optional()}).strict(),$=e.object({...t,progressKind:e.literal("phase.parallel"),status:e.enum(c),stacks:e.array(e.string().max(a)).max(50),description:e.string().max(o).optional(),results:e.array(q).max(50).optional()}).strict(),ee=e.object({...t,progressKind:e.literal("build.started"),builder:e.enum(l),serviceName:e.string().max(o).optional(),imageTag:e.string().max(o).optional(),ecrRepositoryUri:e.string().max(r).optional()}).strict(),te=e.object({...t,progressKind:e.literal("build.progress"),builder:e.enum(l),message:e.string().max(s),serviceName:e.string().max(o).optional(),percentage:e.number().optional(),layerId:e.string().max(a).optional(),status:e.string().max(64).optional()}).strict(),ae=e.object({...t,progressKind:e.literal("build.completed"),builder:e.enum(l),success:e.boolean(),serviceName:e.string().max(o).optional(),imageTag:e.string().max(o).optional(),imageDigest:e.string().max(a).optional(),imageUri:e.string().max(g).optional(),ecrRepositoryArn:e.string().max(r).optional(),durationMs:e.number().nonnegative().optional(),error:e.string().max(n).optional()}).strict(),oe=e.object({...t,progressKind:e.literal("taskdef.registered"),serviceName:e.string().max(o),taskDefinitionArn:e.string().max(r),previousTaskDefinitionArn:e.string().max(r),revision:e.number().int().nonnegative(),family:e.string().max(o),imageDigest:e.string().max(a).optional()}).strict(),re=e.object({...t,progressKind:e.literal("ecs.update"),status:e.string().max(64),service:e.string().max(o).optional()}).strict(),se=e.object({...t,progressKind:e.literal("ecs.progress"),message:e.string().max(s),percentage:e.number().optional()}).strict(),ne=e.object({...t,progressKind:e.literal("ecs.completed"),serviceName:e.string().max(o),serviceArn:e.string().max(r),success:e.boolean(),taskDefinitionArn:e.string().max(r),durationMs:e.number().nonnegative(),reason:e.string().max(i).optional(),finalRunningCount:e.number().int().nonnegative().optional(),finalDesiredCount:e.number().int().nonnegative().optional()}).strict(),ie=e.object({...t,progressKind:e.literal("migrations.started"),family:e.string().max(o),taskDefinitionArn:e.string().max(r),imageDigest:e.string().max(a)}).strict(),ce=e.object({...t,progressKind:e.literal("migrations.completed"),family:e.string().max(o),taskDefinitionArn:e.string().max(r),success:e.boolean(),durationMs:e.number().nonnegative(),exitCode:e.number().int().optional(),reason:e.string().max(i).optional()}).strict(),le=e.object({...t,progressKind:e.literal("cdk.bootstrap"),status:e.string().max(s)}).strict(),pe=e.object({...t,progressKind:e.literal("cdk.output"),outputType:e.enum(["synth","diff"]),output:e.string().max(m)}).strict(),me=e.object({...t,progressKind:e.literal("detection.completed"),detection:M}).strict(),ge=e.object({...t,progressKind:e.literal("detection.phase"),phase:e.enum(R),status:e.enum(c)}).strict(),de=e.object({...t,progressKind:e.literal("cascade.started")}).strict(),ue=e.object({...t,progressKind:e.literal("cascade.accountsReconciled"),hasPlatformAccount:e.boolean(),hasMemberAccounts:e.boolean()}).strict(),xe=e.object({...t,progressKind:e.literal("cascade.orgChanges"),hasOrgChanges:e.boolean()}).strict(),be=e.object({...t,progressKind:e.literal("cascade.missingAccounts"),accountNames:e.array(e.string().max(o)).max(256)}).strict(),Se=e.object({...t,progressKind:e.literal("cascade.phase"),phase:e.enum(h),status:e.enum(c)}).strict(),he=e.object({...t,progressKind:e.literal("cascade.account.started"),operationKey:e.string().max(a),accountId:e.string().max(a),region:e.string().max(a),deployType:e.string().max(64).optional()}).strict(),Ee=e.object({...t,progressKind:e.literal("cascade.account.phase"),operationKey:e.string().max(a),phase:e.enum(v),region:e.string().max(a).optional()}).strict(),Ae=e.object({...t,progressKind:e.literal("cascade.account.completed"),operationKey:e.string().max(a),success:e.boolean(),error:e.string().max(n).optional(),region:e.string().max(a).optional(),outputs:e.record(e.string().max(o),e.string().max(i)).optional(),skipped:e.boolean().optional()}).strict(),Ce=e.object({...t,progressKind:e.literal("cascade.completed"),result:V}).strict(),_e=e.object({...t,progressKind:e.literal("cascade.ledger"),ledger:G}).strict(),je=e.object({...t,progressKind:e.literal("trail.phase"),accountId:e.string().max(a),accountName:e.string().max(o),phase:e.enum(A),status:e.enum(C),detail:e.string().max(j).optional()}).strict(),Te=e.object({...t,progressKind:e.literal("trail.lifecycle"),accountId:e.string().max(a),to:e.enum(p),from:e.enum(p).optional()}).strict(),ye=e.object({...t,progressKind:e.literal("cleanup.progress"),stackName:e.string().max(a),phase:e.enum(D),detail:H.optional()}).strict(),De=e.object({...t,progressKind:e.literal("auth.ssoUrl"),url:e.string().max(g).nullable()}).strict(),ve=e.object({...t,progressKind:e.literal("auth.completed"),result:F.nullable()}).strict(),Pe=e.object({...t,progressKind:e.literal("error"),message:e.string().max(n),name:e.string().max(o).optional()}).strict(),Re=e.object({...t,progressKind:e.literal("deploy.completed"),result:e.enum(P),ok:e.boolean(),errorType:e.string().max(128).optional(),message:e.string().max(s)}).strict(),Ne=e.object({...t,progressKind:e.literal("plan.available"),plan:e.object({summary:e.string().max(s),changeCount:e.number().int().nonnegative(),hasDestructiveChanges:e.boolean(),changes:e.array(U).max(1e3).optional(),diffRef:e.string().max(512).optional(),iamBroadening:e.boolean().optional(),securityGroupBroadening:e.boolean().optional(),changeCountsByAction:u.optional()}).strict()}).strict(),Ke=e.object({...t,progressKind:e.literal("approval.awaiting"),approval:e.object({token:e.string().max(512),kind:e.enum(O),reason:e.string().max(s),expiresAt:e.string().datetime(),assemblyDigest:e.string().max(128).optional(),changeCounts:u.optional(),approvalClass:e.string().max(64).optional(),requiredApprovers:e.array(e.string().max(256)).max(50).optional()}).strict()}).strict(),Oe=e.object({...t,progressKind:e.literal("approval.resolved"),approval:e.object({token:e.string().max(512),decision:e.enum(f),actor:e.string().max(o).optional()}).strict()}).strict(),Be=e.discriminatedUnion("progressKind",[z,J,Q,W,Z,$,ee,te,ae,oe,re,se,ne,ie,ce,le,pe,me,ge,de,ue,xe,be,Se,he,Ee,Ae,Ce,_e,je,Te,ye,De,ve,Pe,Re,Ne,Ke,Oe]),fe={"step.started":!0,"step.completed":!0,log:!0,output:!0,resource:!0,"phase.parallel":!0,"build.started":!0,"build.progress":!0,"build.completed":!0,"taskdef.registered":!0,"ecs.update":!0,"ecs.progress":!0,"ecs.completed":!0,"migrations.started":!0,"migrations.completed":!0,"cdk.bootstrap":!0,"cdk.output":!0,"detection.completed":!0,"detection.phase":!0,"cascade.started":!0,"cascade.accountsReconciled":!0,"cascade.orgChanges":!0,"cascade.missingAccounts":!0,"cascade.phase":!0,"cascade.account.started":!0,"cascade.account.phase":!0,"cascade.account.completed":!0,"cascade.completed":!0,"cascade.ledger":!0,"trail.phase":!0,"trail.lifecycle":!0,"cleanup.progress":!0,"auth.ssoUrl":!0,"auth.completed":!0,error:!0,"deploy.completed":!0,"plan.available":!0,"approval.awaiting":!0,"approval.resolved":!0},Ge=Object.keys(fe);export{Ge as ALL_PROGRESS_KINDS,f as APPROVAL_DECISIONS,O as APPROVAL_KINDS,l as BUILDERS,v as CASCADE_ACCOUNT_PHASES,d as CASCADE_OUTCOME_RESULTS,u as ChangeCountsSchema,r as DEPLOY_EVENT_ARN_MAX,Ue as DEPLOY_EVENT_CONTRACT,Ve as DEPLOY_EVENT_CONTRACT_MAJOR,Ye as DEPLOY_EVENT_CONTRACT_MINOR,n as DEPLOY_EVENT_ERROR_MESSAGE_MAX,a as DEPLOY_EVENT_ID_MAX,s as DEPLOY_EVENT_MESSAGE_MAX,o as DEPLOY_EVENT_NAME_MAX,m as DEPLOY_EVENT_OUTPUT_MAX,i as DEPLOY_EVENT_STATUS_REASON_MAX,j as DEPLOY_EVENT_TRAIL_DETAIL_MAX,g as DEPLOY_EVENT_URL_MAX,P as DEPLOY_RESULTS,R as DETECTION_PHASES,Be as DeployEventSchema,k as DeployResourceSchema,y as LOG_LEVELS,c as PHASE_STATUSES,N as PLAN_ACTIONS,U as PlanChangeSchema,I as PlanPropertyChangeSchema,K as REPLACEMENT_MODES,D as STACK_CLEANUP_PHASES,T as STEP_COMPLETE_STATUSES,_ as SUPPORTED_CONTRACT_MARKERS,x as StepProgressSchema};
|
|
1
|
+
import{z as e}from"zod";import{CASCADE_PHASES as h,DEPLOYMENT_EVENT_RESOURCE_CATEGORIES as E}from"./deploymentEventSchema.js";import{TRAIL_MIGRATION_PHASES as A,TRAIL_MIGRATION_STATUSES as C}from"./events.js";import{TRAIL_LIFECYCLE_STATES as p}from"@fjall/util/config";const Ue="fjall.deploy/1.1",Ve=1,Ye=1,_=["fjall.deploy/1.0","fjall.deploy/1.1"],a=256,o=256,s=2048,i=2048,n=4096,j=2048,m=8192,r=2048,g=4096,T=["completed","skipped","error","cancelled"],y=["info","debug","warn"],D=["emptying-bucket","deleting-stack","waiting","complete","error","quarantine-suspected","retained-buckets"],v=["bootstrap","synth","deploy","destroy"],P=["success","failure","cancelled","no-changes","rejected"],R=["detect","synth","hash","validate"],c=["started","completed"],l=["docker","buildpush","opennext","staticsite"],d=["succeeded","skipped","failed"],N=["create","update","replace","delete","read","no-op"],K=["will","may","conditional","none"],O=["destructive","cost","policy"],f=["approved","rejected","expired","superseded"],u=e.object({create:e.number().int().nonnegative(),update:e.number().int().nonnegative(),replace:e.number().int().nonnegative(),delete:e.number().int().nonnegative(),read:e.number().int().nonnegative(),"no-op":e.number().int().nonnegative()}).strict(),L={create:!0,update:!0,replace:!0,delete:!0,read:!0,"no-op":!0},t={contract:e.enum(_),deploymentId:e.string().min(1).max(a),seq:e.number().int().nonnegative(),time:e.string().datetime()},x=e.object({index:e.number().int().nonnegative(),total:e.number().int().positive()}).strict(),b=e.object({id:e.string().max(a),name:e.string().max(o)}).strict(),k=e.object({logicalId:e.string().max(a),resourceType:e.string().max(a),status:e.string().max(64),displayName:e.string().max(o).optional(),category:e.enum(E).optional(),group:e.string().max(128).optional(),constructPath:e.string().max(512).optional(),statusReason:e.string().max(i).optional(),physicalId:e.string().max(r).optional(),expectedDurationSeconds:e.number().nonnegative().optional()}).strict(),M=e.object({pattern:e.string().max(128).nullable(),hasDockerfile:e.boolean(),hasDifferences:e.boolean(),resources:e.object({hasNetwork:e.boolean(),hasCompute:e.boolean(),hasDatabase:e.boolean(),hasStorage:e.boolean(),hasMessaging:e.boolean(),hasCdn:e.boolean(),hasUsEast1Certificates:e.boolean().optional()}).strict(),requiredSecrets:e.array(e.string().max(512)).max(100).optional()}).strict(),I=e.object({path:e.string().max(512),forcesReplacement:e.boolean()}).strict(),U=e.object({address:e.string().max(512),resourceType:e.string().max(a),action:e.enum(N),stack:e.string().max(a).optional(),replacementMode:e.enum(K).optional(),dataLoss:e.boolean().optional(),propertyChanges:e.array(I).max(100).optional()}).strict(),S=e.object({accountId:e.string().max(a),error:e.string().max(n)}).strict(),V=e.object({platformDeployed:e.boolean(),platformSkipped:e.boolean(),platformFailed:e.boolean(),domainsDeployed:e.boolean(),accountsDeployed:e.number().int().nonnegative(),accountsSkipped:e.number().int().nonnegative(),accountsFailed:e.number().int().nonnegative(),errors:e.array(S).max(1e3)}).strict(),Y=e.object({accountId:e.string().max(a),accountName:e.string().max(o),region:e.string().max(a),result:e.enum(d),durationMs:e.number().nonnegative(),error:e.string().max(n).optional()}).strict(),B=e.object({accountId:e.string().max(a),result:e.enum(d),durationMs:e.number().nonnegative(),error:e.string().max(n).optional()}).strict(),G=e.object({members:e.array(Y).max(1e3),platform:B.optional(),domainsDeployed:e.boolean(),errors:e.array(S).max(1e3),totalDurationMs:e.number().nonnegative()}).strict(),X=e.object({bucketName:e.string().max(o),accountId:e.string().max(a).optional()}).strict(),w=e.object({retainedBuckets:e.array(e.string().max(o)).max(1e3),message:e.string().max(s)}).strict(),H=e.union([X,w]),q=e.object({stack:e.string().max(a),success:e.boolean(),error:e.string().max(n).optional()}).strict(),F=e.object({accountId:e.string().max(a),region:e.string().max(a),profileName:e.string().max(o).optional()}).strict(),z=e.object({...t,progressKind:e.literal("step.started"),step:b,progress:x.optional()}).strict(),J=e.object({...t,progressKind:e.literal("step.completed"),step:b,status:e.enum(T),progress:x.optional(),errorMessage:e.string().max(n).optional()}).strict(),Q=e.object({...t,progressKind:e.literal("log"),level:e.enum(y),message:e.string().max(s)}).strict(),W=e.object({...t,progressKind:e.literal("output"),chunk:e.string().max(m)}).strict(),Z=e.object({...t,progressKind:e.literal("resource"),resource:k,scope:e.object({stack:e.string().max(a).optional(),operationKey:e.string().max(a).optional(),region:e.string().max(a).optional()}).strict().optional()}).strict(),$=e.object({...t,progressKind:e.literal("phase.parallel"),status:e.enum(c),stacks:e.array(e.string().max(a)).max(50),description:e.string().max(o).optional(),results:e.array(q).max(50).optional()}).strict(),ee=e.object({...t,progressKind:e.literal("build.started"),builder:e.enum(l),serviceName:e.string().max(o).optional(),imageTag:e.string().max(o).optional(),ecrRepositoryUri:e.string().max(r).optional()}).strict(),te=e.object({...t,progressKind:e.literal("build.progress"),builder:e.enum(l),message:e.string().max(s),serviceName:e.string().max(o).optional(),percentage:e.number().optional(),layerId:e.string().max(a).optional(),status:e.string().max(64).optional()}).strict(),ae=e.object({...t,progressKind:e.literal("build.completed"),builder:e.enum(l),success:e.boolean(),serviceName:e.string().max(o).optional(),imageTag:e.string().max(o).optional(),imageDigest:e.string().max(a).optional(),imageUri:e.string().max(g).optional(),ecrRepositoryArn:e.string().max(r).optional(),durationMs:e.number().nonnegative().optional(),error:e.string().max(n).optional()}).strict(),oe=e.object({...t,progressKind:e.literal("taskdef.registered"),serviceName:e.string().max(o),taskDefinitionArn:e.string().max(r),previousTaskDefinitionArn:e.string().max(r),revision:e.number().int().nonnegative(),family:e.string().max(o),imageDigest:e.string().max(a).optional()}).strict(),re=e.object({...t,progressKind:e.literal("ecs.update"),status:e.string().max(64),service:e.string().max(o).optional()}).strict(),se=e.object({...t,progressKind:e.literal("ecs.progress"),message:e.string().max(s),percentage:e.number().optional()}).strict(),ne=e.object({...t,progressKind:e.literal("ecs.completed"),serviceName:e.string().max(o),serviceArn:e.string().max(r),success:e.boolean(),taskDefinitionArn:e.string().max(r),durationMs:e.number().nonnegative(),reason:e.string().max(i).optional(),finalRunningCount:e.number().int().nonnegative().optional(),finalDesiredCount:e.number().int().nonnegative().optional()}).strict(),ie=e.object({...t,progressKind:e.literal("migrations.started"),family:e.string().max(o),taskDefinitionArn:e.string().max(r),imageDigest:e.string().max(a)}).strict(),ce=e.object({...t,progressKind:e.literal("migrations.completed"),family:e.string().max(o),taskDefinitionArn:e.string().max(r),success:e.boolean(),durationMs:e.number().nonnegative(),exitCode:e.number().int().optional(),reason:e.string().max(i).optional()}).strict(),le=e.object({...t,progressKind:e.literal("cdk.bootstrap"),status:e.string().max(s)}).strict(),pe=e.object({...t,progressKind:e.literal("cdk.output"),outputType:e.enum(["synth","diff"]),output:e.string().max(m)}).strict(),me=e.object({...t,progressKind:e.literal("detection.completed"),detection:M}).strict(),ge=e.object({...t,progressKind:e.literal("detection.phase"),phase:e.enum(R),status:e.enum(c)}).strict(),de=e.object({...t,progressKind:e.literal("cascade.started")}).strict(),ue=e.object({...t,progressKind:e.literal("cascade.accountsReconciled"),hasPlatformAccount:e.boolean(),hasMemberAccounts:e.boolean()}).strict(),xe=e.object({...t,progressKind:e.literal("cascade.orgChanges"),hasOrgChanges:e.boolean()}).strict(),be=e.object({...t,progressKind:e.literal("cascade.missingAccounts"),accountNames:e.array(e.string().max(o)).max(256)}).strict(),Se=e.object({...t,progressKind:e.literal("cascade.phase"),phase:e.enum(h),status:e.enum(c)}).strict(),he=e.object({...t,progressKind:e.literal("cascade.account.started"),operationKey:e.string().max(a),accountId:e.string().max(a),region:e.string().max(a),deployType:e.string().max(64).optional()}).strict(),Ee=e.object({...t,progressKind:e.literal("cascade.account.phase"),operationKey:e.string().max(a),phase:e.enum(v),region:e.string().max(a).optional()}).strict(),Ae=e.object({...t,progressKind:e.literal("cascade.account.completed"),operationKey:e.string().max(a),success:e.boolean(),error:e.string().max(n).optional(),region:e.string().max(a).optional(),outputs:e.record(e.string().max(o),e.string().max(i)).optional(),skipped:e.boolean().optional()}).strict(),Ce=e.object({...t,progressKind:e.literal("cascade.completed"),result:V}).strict(),_e=e.object({...t,progressKind:e.literal("cascade.ledger"),ledger:G}).strict(),je=e.object({...t,progressKind:e.literal("trail.phase"),accountId:e.string().max(a),accountName:e.string().max(o),phase:e.enum(A),status:e.enum(C),detail:e.string().max(j).optional()}).strict(),Te=e.object({...t,progressKind:e.literal("trail.lifecycle"),accountId:e.string().max(a),to:e.enum(p),from:e.enum(p).optional()}).strict(),ye=e.object({...t,progressKind:e.literal("cleanup.progress"),stackName:e.string().max(a),phase:e.enum(D),detail:H.optional()}).strict(),De=e.object({...t,progressKind:e.literal("auth.ssoUrl"),url:e.string().max(g).nullable()}).strict(),ve=e.object({...t,progressKind:e.literal("auth.completed"),result:F.nullable()}).strict(),Pe=e.object({...t,progressKind:e.literal("error"),message:e.string().max(n),name:e.string().max(o).optional()}).strict(),Re=e.object({...t,progressKind:e.literal("deploy.completed"),result:e.enum(P),ok:e.boolean(),errorType:e.string().max(128).optional(),message:e.string().max(s)}).strict(),Ne=e.object({...t,progressKind:e.literal("plan.available"),plan:e.object({summary:e.string().max(s),changeCount:e.number().int().nonnegative(),hasDestructiveChanges:e.boolean(),changes:e.array(U).max(1e3).optional(),diffRef:e.string().max(512).optional(),iamBroadening:e.boolean().optional(),securityGroupBroadening:e.boolean().optional(),changeCountsByAction:u.optional()}).strict()}).strict(),Ke=e.object({...t,progressKind:e.literal("approval.awaiting"),approval:e.object({token:e.string().max(512),kind:e.enum(O),reason:e.string().max(s),expiresAt:e.string().datetime(),assemblyDigest:e.string().max(128).optional(),changeCounts:u.optional(),approvalClass:e.string().max(64).optional(),requiredApprovers:e.array(e.string().max(256)).max(50).optional()}).strict()}).strict(),Oe=e.object({...t,progressKind:e.literal("approval.resolved"),approval:e.object({token:e.string().max(512),decision:e.enum(f),actor:e.string().max(o).optional()}).strict()}).strict(),Be=e.discriminatedUnion("progressKind",[z,J,Q,W,Z,$,ee,te,ae,oe,re,se,ne,ie,ce,le,pe,me,ge,de,ue,xe,be,Se,he,Ee,Ae,Ce,_e,je,Te,ye,De,ve,Pe,Re,Ne,Ke,Oe]),fe={"step.started":!0,"step.completed":!0,log:!0,output:!0,resource:!0,"phase.parallel":!0,"build.started":!0,"build.progress":!0,"build.completed":!0,"taskdef.registered":!0,"ecs.update":!0,"ecs.progress":!0,"ecs.completed":!0,"migrations.started":!0,"migrations.completed":!0,"cdk.bootstrap":!0,"cdk.output":!0,"detection.completed":!0,"detection.phase":!0,"cascade.started":!0,"cascade.accountsReconciled":!0,"cascade.orgChanges":!0,"cascade.missingAccounts":!0,"cascade.phase":!0,"cascade.account.started":!0,"cascade.account.phase":!0,"cascade.account.completed":!0,"cascade.completed":!0,"cascade.ledger":!0,"trail.phase":!0,"trail.lifecycle":!0,"cleanup.progress":!0,"auth.ssoUrl":!0,"auth.completed":!0,error:!0,"deploy.completed":!0,"plan.available":!0,"approval.awaiting":!0,"approval.resolved":!0},Ge=Object.keys(fe);export{Ge as ALL_PROGRESS_KINDS,f as APPROVAL_DECISIONS,O as APPROVAL_KINDS,l as BUILDERS,v as CASCADE_ACCOUNT_PHASES,d as CASCADE_OUTCOME_RESULTS,u as ChangeCountsSchema,r as DEPLOY_EVENT_ARN_MAX,Ue as DEPLOY_EVENT_CONTRACT,Ve as DEPLOY_EVENT_CONTRACT_MAJOR,Ye as DEPLOY_EVENT_CONTRACT_MINOR,n as DEPLOY_EVENT_ERROR_MESSAGE_MAX,a as DEPLOY_EVENT_ID_MAX,s as DEPLOY_EVENT_MESSAGE_MAX,o as DEPLOY_EVENT_NAME_MAX,m as DEPLOY_EVENT_OUTPUT_MAX,i as DEPLOY_EVENT_STATUS_REASON_MAX,j as DEPLOY_EVENT_TRAIL_DETAIL_MAX,g as DEPLOY_EVENT_URL_MAX,P as DEPLOY_RESULTS,R as DETECTION_PHASES,Be as DeployEventSchema,k as DeployResourceSchema,y as LOG_LEVELS,c as PHASE_STATUSES,N as PLAN_ACTIONS,U as PlanChangeSchema,I as PlanPropertyChangeSchema,K as REPLACEMENT_MODES,D as STACK_CLEANUP_PHASES,T as STEP_COMPLETE_STATUSES,_ as SUPPORTED_CONTRACT_MARKERS,x as StepProgressSchema};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ALL_PROGRESS_KINDS as
|
|
1
|
+
var d=Object.defineProperty;var i=(n,e)=>d(n,"name",{value:e,configurable:!0});import{ALL_PROGRESS_KINDS as f,DEPLOY_EVENT_CONTRACT_MAJOR as u,DEPLOY_EVENT_CONTRACT_MINOR as l,DeployEventSchema as p}from"./deployEvent.js";const m=/^fjall\.deploy\/(\d+)\.(\d+)$/,N=new Set(f);function E(n){const e=m.exec(n);if(e===null)return null;const t=e[1],o=e[2];if(t===void 0||o===void 0)return null;const r=parseInt(t,10),s=parseInt(o,10);return Number.isNaN(r)||Number.isNaN(s)?null:{major:r,minor:s}}i(E,"parseDeployContractVersion");function c(n,e){if(!(e in n))return;const t=n[e];return typeof t=="string"?t:void 0}i(c,"readStringField");function T(n){const e=p.safeParse(n);if(e.success)return{status:"ok",event:e.data};if(typeof n!="object"||n===null)return{status:"incompatible",reason:"Event is not an object",raw:n};const t=c(n,"contract");if(t===void 0)return{status:"incompatible",reason:"Missing or non-string contract marker",raw:n};const o=E(t);if(o===null)return{status:"incompatible",reason:`Unrecognised contract marker: ${t}`,raw:n};if(o.major!==u)return{status:"incompatible",reason:`Contract major ${o.major} unsupported (expected ${u})`,raw:n};const r=c(n,"progressKind"),s=o.minor>l,a=r===void 0||!N.has(r);return s||a?{status:"unknown",contract:t,...r!==void 0&&{progressKind:r},raw:n}:{status:"invalid",reason:e.error.message,...r!==void 0&&{progressKind:r},raw:n}}i(T,"parseDeployEvent");export{E as parseDeployContractVersion,T as parseDeployEvent};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
var e=Object.defineProperty;var n=(t,r)=>e(t,"name",{value:r,configurable:!0});function c(t){return{Account:t,Arn:"",UserId:""}}n(c,"stubCallerIdentity");export{c as stubCallerIdentity};
|
|
@@ -155,6 +155,7 @@ export declare const DeploymentEventSchema: z.ZodObject<{
|
|
|
155
155
|
hasStorage: z.ZodBoolean;
|
|
156
156
|
hasMessaging: z.ZodBoolean;
|
|
157
157
|
hasCdn: z.ZodBoolean;
|
|
158
|
+
hasUsEast1Certificates: z.ZodOptional<z.ZodBoolean>;
|
|
158
159
|
}, z.core.$strict>;
|
|
159
160
|
requiredSecrets: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
160
161
|
}, z.core.$strict>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{z as e}from"zod";import{TRAIL_MIGRATION_PHASES as
|
|
1
|
+
var i=Object.defineProperty;var n=(t,o)=>i(t,"name",{value:o,configurable:!0});import{z as e}from"zod";import{TRAIL_MIGRATION_PHASES as c,TRAIL_MIGRATION_STATUSES as m}from"./events.js";const l=["security","network","compute","database","storage","monitoring","dns","identity","bootstrap","events","registry","backup"],r=["platform","domains","accounts"],p=["started","deploying","completed","failed"],u=2048,g=4096,d=2048,x=["step","resource","docker","ecs","error","complete","cascade_phase","cascade_account","cascade_missing_accounts","parallel_phase","detection","trail_migration","log"],E={step:"step",resource:"resource",docker:"docker",ecs:"ecs",error:"error",complete:null,cascade_phase:"cascadePhase",cascade_account:"cascadeAccount",cascade_missing_accounts:"cascadeMissingAccounts",parallel_phase:"parallelPhase",detection:"detection",trail_migration:"trailMigration",log:"log"},T=e.object({type:e.enum(x),timestamp:e.string().max(64),sequence:e.number().int().nonnegative().optional(),step:e.object({id:e.string().max(256),name:e.string().max(256),index:e.number(),total:e.number(),status:e.string().max(64)}).strict().optional(),resource:e.object({logicalId:e.string().max(256),resourceType:e.string().max(256),category:e.enum(l),group:e.string().max(128).optional(),constructPath:e.string().max(512).optional(),displayName:e.string().max(256),status:e.string().max(64),statusReason:e.string().max(u).optional(),physicalId:e.string().max(2048).optional(),expectedDurationSeconds:e.number().optional(),stack:e.string().max(256).optional(),clientRequestToken:e.string().max(256).optional()}).strict().optional(),docker:e.object({message:e.string().max(2048),percentage:e.number().optional()}).strict().optional(),ecs:e.object({status:e.string().max(64),message:e.string().max(2048).optional(),percentage:e.number().optional()}).strict().optional(),error:e.object({message:e.string().max(g),category:e.string().max(128).optional(),remediation:e.array(e.string().max(1024)).max(10).optional()}).strict().optional(),message:e.string().max(2048).optional(),cascadePhase:e.object({phase:e.enum(r),status:e.enum(["started","completed"])}).strict().optional(),cascadeAccount:e.object({accountId:e.string().max(32),region:e.string().max(32),operationKey:e.string().max(256),status:e.enum(p),error:e.string().max(2048).optional(),phase:e.enum(["bootstrap","synth","deploy","destroy"]).optional(),cascadePhase:e.enum(r).optional()}).strict().optional(),cascadeMissingAccounts:e.object({accountNames:e.array(e.string().max(256)).max(256)}).strict().optional(),parallelPhase:e.object({stacks:e.array(e.string().max(256)).max(20),status:e.enum(["started","completed"]),results:e.array(e.object({stack:e.string().max(256),success:e.boolean(),error:e.string().max(2048).optional()}).strict()).max(20).optional()}).strict().optional(),detection:e.object({pattern:e.string().max(128).nullable(),hasDockerfile:e.boolean(),hasDifferences:e.boolean(),resources:e.object({hasNetwork:e.boolean(),hasCompute:e.boolean(),hasDatabase:e.boolean(),hasStorage:e.boolean(),hasMessaging:e.boolean(),hasCdn:e.boolean(),hasUsEast1Certificates:e.boolean().optional()}).strict(),requiredSecrets:e.array(e.string().max(512)).max(100).optional()}).strict().optional(),trailMigration:e.object({accountId:e.string().max(32),accountName:e.string().max(256),phase:e.enum(c),status:e.enum(m),detail:e.string().max(d).optional()}).strict().optional(),log:e.object({message:e.string().max(2048),level:e.enum(["info","debug","warn"])}).strict().optional()}).strict().superRefine((t,o)=>{const a=E[t.type],s=a?t[a]:void 0;a&&s==null&&o.addIssue({code:e.ZodIssueCode.custom,message:`"${a}" is required when type is "${t.type}"`,path:[a]}),t.type==="complete"&&!t.message&&o.addIssue({code:e.ZodIssueCode.custom,message:'"message" is required when type is "complete"',path:["message"]})});function A(t){if(t==="platform")return"platform";if(t==="account")return"accounts"}n(A,"toCascadePhase");export{p as CASCADE_ACCOUNT_STATUSES,r as CASCADE_PHASES,g as DEPLOYMENT_EVENT_ERROR_MESSAGE_MAX,l as DEPLOYMENT_EVENT_RESOURCE_CATEGORIES,u as DEPLOYMENT_EVENT_STATUS_REASON_MAX,d as DEPLOYMENT_EVENT_TRAIL_DETAIL_MAX,x as DEPLOYMENT_EVENT_TYPES,T as DeploymentEventSchema,A as toCascadePhase};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{existsSync as
|
|
1
|
+
var a=Object.defineProperty;var o=(e,r)=>a(e,"name",{value:r,configurable:!0});import{existsSync as i,readFileSync as f}from"fs";import{join as m}from"path";import{logger as u}from"@fjall/util/logger";import{getErrorMessage as E}from"@fjall/util";import{APPLICATION_STACKS as t}from"../operations.js";import{INFRASTRUCTURE_FILENAME as S}from"../constants.js";import{OPENNEXT_PATTERNS as R,isOpenNextPattern as F}from"./patternTypes.js";function l(e){const r=o(s=>e.some(n=>n.endsWith(s)),"has");return{hasNetwork:r(t.NETWORK),hasCompute:r(t.COMPUTE),hasDatabase:r(t.DATABASE),hasStorage:r(t.STORAGE),hasMessaging:r(t.MESSAGING),hasCdn:r(t.CDN),hasUsEast1Certificates:r(t.US_EAST_1_CERTIFICATES)}}o(l,"deriveResourcesFromManifestStacks");function d(e){try{const r=m(e,S);return i(r)?f(r,"utf-8"):null}catch(r){return u.debug("patternDetection","Failed to read infrastructure file",{appPath:e,error:E(r)}),null}}o(d,"readInfrastructureContent");export{R as OPENNEXT_PATTERNS,l as deriveResourcesFromManifestStacks,F as isOpenNextPattern,d as readInfrastructureContent};
|
|
@@ -21,4 +21,13 @@ export interface AppResourceFlags {
|
|
|
21
21
|
hasStorage: boolean;
|
|
22
22
|
hasMessaging: boolean;
|
|
23
23
|
hasCdn: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* A `${app}UsEast1Certificates` stack was synthesised (domain gold-plating
|
|
26
|
+
* D3, BYO CloudFront path): the app mints its viewer certificate in a
|
|
27
|
+
* paired us-east-1 stack that must deploy BEFORE the Cdn stack. Optional so
|
|
28
|
+
* pre-goldplate event payloads and the mirrored deploy-event zod schemas
|
|
29
|
+
* (deployEvent.ts / deploymentEventSchema.ts / cli deploymentEvents.ts)
|
|
30
|
+
* stay valid without a lockstep bump — absent reads as `false`.
|
|
31
|
+
*/
|
|
32
|
+
hasUsEast1Certificates?: boolean;
|
|
24
33
|
}
|
package/dist/src/types/drift.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{z as t}from"zod";import{RemediationVerbSchema as
|
|
1
|
+
var s=Object.defineProperty;var r=(e,n)=>s(e,"name",{value:n,configurable:!0});import{z as t}from"zod";import{RemediationVerbSchema as c}from"./destruction.js";const o=["confirmed-deleted","present","unconfirmed","stack-missing"],a=t.enum(o),i=t.object({stackName:t.string().min(1),logicalId:t.string().min(1),resourceType:t.string().min(1),physicalId:t.string().min(1).optional(),failedStatus:t.string().min(1),statusReason:t.string()}).strict(),p=t.object({...i.shape,verdict:a,verdictDetail:t.string(),probeMethod:t.string(),verbs:t.array(c)}).strict();function f(e){switch(e){case"confirmed-deleted":return["forget","recreate"];case"present":return[];case"unconfirmed":case"stack-missing":return["repair"]}}r(f,"verbsForDriftVerdict");const u=t.object({version:t.literal(1),accountId:t.string().min(1),region:t.string().min(1),stackName:t.string().min(1),recordedAt:t.string().min(1),suspects:t.array(i)}).strict();export{o as DRIFT_VERDICTS,p as DriftFindingSchema,u as DriftJournalRecordSchema,i as DriftSuspectSchema,a as DriftVerdictSchema,f as verbsForDriftVerdict};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{BaseServiceError as
|
|
1
|
+
var u=Object.defineProperty;var s=(t,e)=>u(t,"name",{value:e,configurable:!0});import{BaseServiceError as C}from"./ServiceError.js";class m extends C{static{s(this,"CdkError")}errorType;stackName;exitCode;output;constructor(e,r,o,a,i,p,c=!1){super(`CDK_${r.toUpperCase()}`,e,p,c),this.errorType=r,this.stackName=o,this.exitCode=a,this.output=i}}export{m as CdkError};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{maskSensitiveOutput as
|
|
1
|
+
var l=Object.defineProperty;var a=(s,e)=>l(s,"name",{value:e,configurable:!0});import{maskSensitiveOutput as i}from"@fjall/util";class n extends Error{static{a(this,"BaseServiceError")}code;details;recoverable;cause;constructor(e,t,r,o=!1,c){super(t),this.code=e,this.details=r,this.recoverable=o,this.cause=c,this.name=this.constructor.name,Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}}class E extends n{static{a(this,"ValidationError")}fields;rules;constructor(e,t,r,o){super("VALIDATION_ERROR",e,o,!1),this.fields=t,this.rules=r}}class R extends n{static{a(this,"AuthError")}account;reason;constructor(e,t,r,o){super("AUTH_ERROR",e,o,!1),this.account=t,this.reason=r}}class d extends n{static{a(this,"AwsError")}service;operation;awsErrorCode;constructor(e,t,r,o,c,u=!1){super("AWS_ERROR",e,c,u),this.service=t,this.operation=r,this.awsErrorCode=o}}class f extends n{static{a(this,"DeploymentError")}stackName;deploymentPhase;constructor(e,t,r,o,c=!1){super("DEPLOYMENT_ERROR",e,o,c),this.stackName=t,this.deploymentPhase=r}}class x extends n{static{a(this,"NetworkError")}endpoint;statusCode;constructor(e,t,r,o){super("NETWORK_ERROR",e,void 0,!0,o),this.endpoint=t,this.statusCode=r}}class m extends n{static{a(this,"FileSystemError")}path;operation;constructor(e,t,r,o){super("FILESYSTEM_ERROR",e,{path:t,operation:r},!1,o),this.path=t,this.operation=r}}class O extends n{static{a(this,"ConfigError")}configKey;configPath;constructor(e,t,r,o){super("CONFIG_ERROR",e,o,!1),this.configKey=t,this.configPath=r}}function N(s,e="UNKNOWN_ERROR"){return s instanceof n?s:s instanceof Error?new n(e,i(s.message),{name:s.name},!1,s):new n(e,i(String(s)),{rawError:s},!1)}a(N,"toServiceError");export{R as AuthError,d as AwsError,n as BaseServiceError,O as ConfigError,f as DeploymentError,m as FileSystemError,x as NetworkError,E as ValidationError,N as toServiceError};
|
|
@@ -4,12 +4,24 @@ import { toPascalCase } from "@fjall/util";
|
|
|
4
4
|
import type { PatternType } from "@fjall/generator";
|
|
5
5
|
/**
|
|
6
6
|
* Application infrastructure stacks
|
|
7
|
+
*
|
|
8
|
+
* UsEast1Certificates is the app-owned us-east-1 certificate stack (domain
|
|
9
|
+
* gold-plating D3, BYO CloudFront path — components/infrastructure
|
|
10
|
+
* `App.getUsEast1CertificateStack`). It exists only when a CloudFront-facing
|
|
11
|
+
* pattern carries a custom domain outside us-east-1, so ordering derivations
|
|
12
|
+
* include it ONLY when the post-synth manifest proves it
|
|
13
|
+
* (`AppResourceFlags.hasUsEast1Certificates`) — a fixed-set entry would make
|
|
14
|
+
* every deploy attempt a stack that does not exist (the dev-substrate
|
|
15
|
+
* design's APPLICATION_STACKS warning). It must deploy BEFORE Cdn (the
|
|
16
|
+
* distribution consumes its certificate ARN through cross-region references)
|
|
17
|
+
* and destroy AFTER Cdn.
|
|
7
18
|
*/
|
|
8
19
|
export declare const APPLICATION_STACKS: {
|
|
9
20
|
readonly NETWORK: "Network";
|
|
10
21
|
readonly DATABASE: "Database";
|
|
11
22
|
readonly STORAGE: "Storage";
|
|
12
23
|
readonly COMPUTE: "Compute";
|
|
24
|
+
readonly US_EAST_1_CERTIFICATES: "UsEast1Certificates";
|
|
13
25
|
readonly CDN: "Cdn";
|
|
14
26
|
readonly MESSAGING: "Messaging";
|
|
15
27
|
};
|
|
@@ -150,10 +162,22 @@ export declare const PARALLEL_DESTROY_GROUPS: {
|
|
|
150
162
|
* Type for parallel destroy group keys
|
|
151
163
|
*/
|
|
152
164
|
export type ParallelDestroyGroupKey = keyof typeof PARALLEL_DESTROY_GROUPS;
|
|
165
|
+
/** The shape destroy consumers iterate — fixed groups plus spliced extras. */
|
|
166
|
+
export interface ParallelDestroyGroup {
|
|
167
|
+
phase: number;
|
|
168
|
+
stacks: readonly ApplicationStack[];
|
|
169
|
+
description: string;
|
|
170
|
+
}
|
|
153
171
|
/**
|
|
154
|
-
* Get all parallel destroy groups as an ordered array
|
|
172
|
+
* Get all parallel destroy groups as an ordered array.
|
|
173
|
+
*
|
|
174
|
+
* When the caller's resource flags prove a `${app}UsEast1Certificates` stack
|
|
175
|
+
* was deployed, a single-stack phase for it is spliced in AFTER the Cdn phase
|
|
176
|
+
* (the distribution's cross-region reference must die before its certificate
|
|
177
|
+
* stack) and before Compute. Without the flag the historic four phases are
|
|
178
|
+
* returned unchanged, so no destroy targets a stack that never existed.
|
|
155
179
|
*/
|
|
156
|
-
export declare function getParallelDestroyGroups():
|
|
180
|
+
export declare function getParallelDestroyGroups(resources?: AppResourceFlags): readonly ParallelDestroyGroup[];
|
|
157
181
|
/**
|
|
158
182
|
* Options for determining deployment order
|
|
159
183
|
*/
|