@fjall/deploy-core 12.1.0 → 12.1.1

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.
@@ -9,7 +9,7 @@
9
9
  "package.json",
10
10
  "tsconfig.json"
11
11
  ],
12
- "hash": "4250aea204bbe1e15ed014e7778bdda555ef84c50eff9e54b4d5dfa036b62e53",
12
+ "hash": "90e018da3e7f80528070345841dd2eb5bfbf67ac291b658d7af36fc40c85cf79",
13
13
  "files": {
14
14
  "src/__test-utils__/awsMockHelpers.ts": "fea371c1b1869678",
15
15
  "src/__test-utils__/index.ts": "e03cf35821157dc4",
@@ -87,9 +87,9 @@
87
87
  "src/orchestration/application/plan/loadDeployPlan.ts": "f0d4414fd34f68c3",
88
88
  "src/orchestration/application/plan/pinnedNames.ts": "d6a90c96c88f13e0",
89
89
  "src/orchestration/application/plan/registryOverlay.ts": "920be845c7f4aea2",
90
- "src/orchestration/application/plan/renameDetection.ts": "a4a96ad3c175dd5a",
91
- "src/orchestration/application/plan/renderDeployPlan.ts": "13a01fc9b11e1cf7",
92
- "src/orchestration/application/plan/types.ts": "45c3bf684cd90f9f",
90
+ "src/orchestration/application/plan/renameDetection.ts": "49780c599bfa11d1",
91
+ "src/orchestration/application/plan/renderDeployPlan.ts": "7fa4fc332accdc00",
92
+ "src/orchestration/application/plan/types.ts": "191929198672081c",
93
93
  "src/orchestration/application/schemaGateImage.ts": "587a115432c6678e",
94
94
  "src/orchestration/application/serviceImageTagsRollback.ts": "55e23a493545511c",
95
95
  "src/orchestration/application/taskDefinitionRoll.ts": "d9378c509c7ec287",
@@ -262,9 +262,9 @@
262
262
  "src/util/sleepAbortable.ts": "f9cac3bf8a79a476",
263
263
  "src/version.ts": "1811a4475823b27e",
264
264
  "../scripts/minify-dist.mjs": "6b2e4b0df8aec601",
265
- "package.json": "694bf1ca9d5112b6",
265
+ "package.json": "61f32ff62adeef4a",
266
266
  "tsconfig.json": "1929cf3f99fe9b1e"
267
267
  },
268
- "outputHash": "97e2ceb8fcd71d8df97284f3093522a76bc4aec4d7b5ff5c3013fc2069cabca1",
268
+ "outputHash": "8a17d78f93b4c4f6b91fb51ad46d03669d8c1b574856b4f1948d11fe2247f41d",
269
269
  "outputFileCount": 493
270
270
  }
package/dist/.minified CHANGED
@@ -1 +1 @@
1
- 246 files minified at 2026-08-15T06:01:57.084Z
1
+ 246 files minified at 2026-08-15T09:47:12.044Z
@@ -1,3 +1,3 @@
1
- var v=Object.defineProperty;var u=(e,t)=>v(e,"name",{value:t,configurable:!0});import{isStatefulResourceType as z}from"./classify.js";import{resourcePropertiesFromTemplate as D}from"./pinnedNames.js";import{renderPlanSummary as G}from"./renderDeployPlan.js";const J=8,W=8,U=/[0-9A-F]{8}$/;function b(e){return e.length<=8?e:U.test(e.slice(-8))?e.slice(0,-8):e}u(b,"stripTrailingHash");const L=240;function O(e,t){for(let n=Math.min(t.length-1,e.length);n>=1;n--)if(t.startsWith(e.slice(-n)))return e.slice(0,-n);return e}u(O,"trimTrailingTokenFragment");function I(e,t,n,r){const a=e.split(n).join(r);if(a===t)return!0;const m=e.length>=L,h=t.length>=L;if(!m&&!h)return!1;const l=m?O(a,n):a,i=h?O(t,r):t;return l===""||i===""?!1:m&&i.startsWith(l)?!0:h&&l.startsWith(i)}u(I,"substitutionReproducesId");function B(e,t){if(e===t)return[];let n=0;const r=Math.min(e.length,t.length);for(;n<r&&e[n]===t[n];)n+=1;let a=0;const m=Math.min(e.length,t.length)-n;for(;a<m&&e[e.length-1-a]===t[t.length-1-a];)a+=1;const h=e.slice(n,e.length-a),l=t.slice(n,t.length-a);if(h===""||l==="")return[];const i={oldResidue:h,newResidue:l},g=Math.min(h.length,l.length),A=Math.min(Math.max(0,J-g),a);if(A===0)return[i];const f=e.slice(e.length-a,e.length-a+A);return[i,{oldResidue:h+f,newResidue:l+f}]}u(B,"deriveResiduePairs");function V(e,t,n,r){const a=t.filter(y=>b(y.address).includes(e.oldResidue)),m=n.filter(y=>b(y.address).includes(e.newResidue)),h=[],l=new Set,i=u(y=>m.filter(S=>S.resourceType===y.resourceType&&I(b(y.address),b(S.address),e.oldResidue,e.newResidue)&&!l.has(S.address)),"candidatesFor"),g=new Map,A=new Map,f=u((y,S,s)=>{const d=y.get(s);if(d!==void 0)return d;const o=[],c=D(S,s);return c!==void 0&&H(c,o),y.set(s,o),o},"stringsOf"),P=u((y,S)=>{let s=!1;const d=f(g,r?.oldTemplate,y.address),o=f(A,r?.newTemplate,S.address);for(const c of h)if(f(g,r?.oldTemplate,c.deleteChange.address).some(C=>C.includes(y.address))&&(s=!0,!f(A,r?.newTemplate,c.createChange.address).some(w=>w.includes(S.address)))||d.some(C=>C.includes(c.deleteChange.address))&&(s=!0,!o.some(C=>C.includes(c.createChange.address))))return!1;return s},"candidateAgrees");let N=[...a],k=!0;for(;k;){k=!1;for(const y of[...N]){const S=i(y);let s;if(S.length===1)s=S[0];else if(S.length>1){const d=S.filter(o=>P(y,o));d.length===1&&(s=d[0])}s!==void 0&&(l.add(s.address),h.push({deleteChange:y,createChange:s}),N=N.filter(d=>d!==y),k=!0)}}const x=N.length>0||l.size!==m.length;return{...e,pairs:h,touchedDeletes:a,integrityFailed:x}}u(V,"coverHypothesis");function X(e){return e.pairs.map(t=>`${t.deleteChange.address} ${t.createChange.address}`).sort().join(`
2
- `)}u(X,"pairSetKey");function Y(e){const t=e.touchedDeletes.map(n=>n.address).sort().join(`
3
- `);return`${X(e)}::${t}`}u(Y,"hypothesisKey");function q(e,t){if(e.pairs.length===0||e.pairs.length>=t.pairs.length)return!1;const n=new Set(t.pairs.map(r=>`${r.deleteChange.address} ${r.createChange.address}`));return e.pairs.every(r=>n.has(`${r.deleteChange.address} ${r.createChange.address}`))}u(q,"isSubsumedBy");function Q(e,t){if(e.pairs.length>=t.pairs.length)return!1;const n=new Set(t.pairs.map(a=>a.deleteChange.address)),r=new Set(t.pairs.map(a=>a.createChange.address));return e.touchedDeletes.every(a=>n.has(a.address))&&e.pairs.every(a=>r.has(a.createChange.address))}u(Q,"isNoiseAgainst");function H(e,t){if(typeof e=="string"){t.push(e);return}if(Array.isArray(e)){for(const n of e)H(n,t);return}if(typeof e=="object"&&e!==null)for(const n of Object.values(e))H(n,t)}u(H,"deepStrings");function Z(e,t,n,r){const a=t.get(e.deleteChange.address);if(a===void 0||a.length<W)return!1;const m=D(r,e.createChange.address);if(m===void 0)return!1;const h=[];if(H(m,h),!h.some(g=>g.includes(a)))return!1;const l=D(n,e.deleteChange.address);if(l===void 0)return!0;const i=[];return H(l,i),!i.some(g=>g.includes(a))}u(Z,"physicalIdAnchors");function E(e,t){const n=t.get(e);if(n!==void 0)return n;let r=e;for(const[a,m]of t)r.includes(a)&&(r=r.split(a).join(m));return r}u(E,"remapString");function j(e,t){if(typeof e=="string")return E(e,t);if(Array.isArray(e))return e.map(n=>j(n,t));if(typeof e=="object"&&e!==null){const n={};for(const[r,a]of Object.entries(e))n[E(r,t)]=j(a,t);return n}return e}u(j,"remapValue");function _(e){return Array.isArray(e)?`[${e.map(_).join(",")}]`:typeof e=="object"&&e!==null?`{${Object.entries(e).sort(([n],[r])=>n<r?-1:n>r?1:0).map(([n,r])=>`${JSON.stringify(n)}:${_(r)}`).join(",")}}`:JSON.stringify(e)??"null"}u(_,"canonicalJson");function ee(e,t,n){const r=new Map(e.pairs.map(a=>[a.deleteChange.address,a.createChange.address]));return e.pairs.every(a=>{const m=D(t,a.deleteChange.address),h=D(n,a.createChange.address);return m===void 0||h===void 0?!1:_(j(m,r))===_(h)})}u(ee,"propertyDigestMatches");const te={"identity-alias":"the synthesised manifest's capacity-identity alias names this rename","physical-id":"the new resource's properties reproduce the live physical ID","property-digest":"properties are unchanged apart from the renamed identity",singleton:"the only renamed subtree in the stack"};function se(e,t){return t.find(n=>n.legacyAnchor===n.anchor?!1:e.pairs.every(r=>{const a=b(r.deleteChange.address),m=b(r.createChange.address);return a.includes(n.legacyAnchor)&&I(a,m,n.legacyAnchor,n.anchor)}))}u(se,"confirmingAlias");function K(e,t,n){const r=n>1?` (subtree of ${n} resources)`:"";return`logical identity renamed to ${e.createChange.address} \u2014 ${te[t]}${r}; deploying without remediation deletes or orphans the live resource and recreates a fresh twin under the new identity`}u(K,"detectedCause");function ne(e){const t=e.slice(0,3).join(", "),n=e.length>3?` and ${e.length-3} more`:"";return e.length>0?`identity rename suspected but ambiguous \u2014 candidate new identities: ${t}${n}; no matcher could disambiguate, and remediating against the wrong identity is worse than aborting`:"identity rename suspected but ambiguous \u2014 a renamed subtree member could not be role-matched (possible ID truncation); failing closed"}u(ne,"ambiguousCause");function re(e){const t=new Set(e.changes.map(r=>r.stack)),n=[];for(const r of t){const a=e.changes.filter(l=>l.stack===r&&l.action==="delete"),m=e.changes.filter(l=>l.stack===r&&l.action==="create");a.some(l=>m.some(i=>i.resourceType===l.resourceType&&B(b(l.address),b(i.address)).length>0))&&n.push(r)}return n}u(re,"renameCandidateStackNames");function ae(e){const{deletes:t,creates:n,pair:r,physicalIdByLogicalId:a,identityAliases:m}=e,h=new Map,l=new Map;for(const s of t)for(const d of n){if(d.resourceType!==s.resourceType)continue;const o=B(b(s.address),b(d.address));for(const c of o)l.set(`${c.oldResidue} ${c.newResidue}`,c)}if(l.size===0)return h;let i=[...l.values()].map(s=>V(s,t,n,r)).filter(s=>s.pairs.length>0||s.integrityFailed&&s.touchedDeletes.length>=2);const g=new Map;for(const s of i){const d=Y(s),o=g.get(d);(o===void 0||!o.integrityFailed&&s.integrityFailed)&&g.set(d,s)}i=[...g.values()];const A=i;i=A.filter(s=>!A.some(d=>d!==s&&(q(s,d)||Q(s,d))));const f=new Map,P=new Map;for(const s of i){if(s.integrityFailed){f.set(s,void 0);continue}const d=se(s,m);if(d!==void 0){f.set(s,"identity-alias"),P.set(s,d);continue}if(s.pairs.some(c=>Z(c,a,r?.oldTemplate,r?.newTemplate))){f.set(s,"physical-id");continue}if(ee(s,r?.oldTemplate,r?.newTemplate)){f.set(s,"property-digest");continue}f.set(s,void 0)}const N=u(s=>{const d=[],o=new Set;for(const c of s){if(o.has(c))continue;const p=[c];o.add(c);let C=!0;for(;C;){C=!1;const w=new Set(p.flatMap($=>[...$.pairs.flatMap(M=>[`d:${M.deleteChange.address}`,`c:${M.createChange.address}`]),...$.touchedDeletes.map(M=>`d:${M.address}`)]));for(const $ of s){if(o.has($))continue;($.pairs.some(T=>w.has(`d:${T.deleteChange.address}`)||w.has(`c:${T.createChange.address}`))||$.touchedDeletes.some(T=>w.has(`d:${T.address}`)))&&(p.push($),o.add($),C=!0)}}d.push(p)}return d},"splitComponents"),k=u((s,d)=>{const o=P.get(s),c=o!==void 0?{pinSlotHint:{appName:o.appName,slot:o.slot}}:{};for(const p of s.pairs)h.set(p.deleteChange.address,{finding:"rename-detected",pairedAddress:p.createChange.address,cause:K(p,d,s.pairs.length),...c}),h.set(p.createChange.address,{finding:"rename-detected",pairedAddress:p.deleteChange.address,cause:K(p,d,s.pairs.length),...c})},"markDetected"),x=u(s=>{const d=new Map,o=new Map;for(const c of s){for(const p of c.pairs){o.set(p.deleteChange.address,p.deleteChange);const C=d.get(p.deleteChange.address)??new Set;C.add(p.createChange.address),d.set(p.deleteChange.address,C)}for(const p of c.touchedDeletes)o.set(p.address,p)}for(const[c]of o){const p=[...d.get(c)??[]].sort();h.set(c,{finding:"rename-ambiguous",cause:ne(p)})}},"markAmbiguous"),y=u((s,d)=>{const o=new Set(s.pairs.flatMap(c=>[`d:${c.deleteChange.address}`,`c:${c.createChange.address}`]));return d.pairs.some(c=>o.has(`d:${c.deleteChange.address}`)||o.has(`c:${c.createChange.address}`))},"hypothesesShareRow"),S=u(s=>{const d=s.some(w=>w.integrityFailed),o=s.filter(w=>f.get(w)!==void 0&&!w.integrityFailed);if(o.some((w,$)=>o.some((M,T)=>T>$&&y(w,M)))||d){x(s);return}const p=o[0];if(p!==void 0){const w=f.get(p);w!==void 0&&k(p,w);const $=new Set(p.pairs.map(R=>R.deleteChange.address)),M=new Set(p.pairs.map(R=>R.createChange.address)),T=s.filter(R=>R!==p&&!R.pairs.some(F=>$.has(F.deleteChange.address)||M.has(F.createChange.address)));for(const R of N(T))S(R);return}const C=s[0];if(s.length===1&&C!==void 0&&C.pairs.length>=2){k(C,"singleton");return}s.length>1&&s.some(w=>w.pairs.length>=2)&&x(s)},"resolveComponent");for(const s of N(i))S(s);return h}u(ae,"resolveStack");function le(e){const{plan:t,stacks:n,physicalResources:r,identityAliases:a}=e,m=new Map(n.map(i=>[i.stackName,i])),h=new Map;for(const i of re(t)){const g=new Map;for(const f of r.get(i)??[])f.physicalId!==void 0&&f.physicalId!==""&&g.set(f.logicalId,f.physicalId);const A=ae({deletes:t.changes.filter(f=>f.stack===i&&f.action==="delete"),creates:t.changes.filter(f=>f.stack===i&&f.action==="create"),pair:m.get(i),physicalIdByLogicalId:g,identityAliases:a??[]});A.size>0&&h.set(i,A)}if(h.size===0)return t;const l=t.changes.map(i=>{const g=h.get(i.stack)?.get(i.address);if(g===void 0)return i;if(i.action==="create")return g.pairedAddress===void 0?i:{...i,renamePairedAddress:g.pairedAddress,renameCause:g.cause,...g.pinSlotHint!==void 0?{renameSlotHint:g.pinSlotHint}:{}};if(i.action!=="delete")return i;const A=r.get(i.stack)?.find(f=>f.logicalId===i.address&&f.physicalId!==void 0&&f.physicalId!=="")?.physicalId;return{...i,renameFinding:g.finding,...g.pairedAddress!==void 0?{renamePairedAddress:g.pairedAddress}:{},...A!==void 0?{renamePhysicalId:A}:{},...g.pinSlotHint!==void 0?{renameSlotHint:g.pinSlotHint}:{},renameCause:g.cause,destructive:!0,dataLoss:z(i.resourceType)}});return{...t,changes:l,hasDestructiveChanges:l.some(i=>i.destructive),summary:G({counts:t.counts,changes:l})}}u(le,"applyRenameDetection");export{L as CDK_LOGICAL_ID_HUMAN_CLIP_LENGTH,le as applyRenameDetection,B as deriveResiduePairs,re as renameCandidateStackNames,b as stripTrailingHash,I as substitutionReproducesId};
1
+ var z=Object.defineProperty;var l=(e,t)=>z(e,"name",{value:t,configurable:!0});import{isStatefulResourceType as L}from"./classify.js";import{resourcePropertiesFromTemplate as D}from"./pinnedNames.js";import{renderPlanSummary as G}from"./renderDeployPlan.js";const J=8,W=8,U=/[0-9A-F]{8}$/;function b(e){return e.length<=8?e:U.test(e.slice(-8))?e.slice(0,-8):e}l(b,"stripTrailingHash");const O=240;function I(e,t){for(let s=Math.min(t.length-1,e.length);s>=1;s--)if(t.startsWith(e.slice(-s)))return e.slice(0,-s);return e}l(I,"trimTrailingTokenFragment");function v(e,t,s,r){const i=e.split(s).join(r);if(i===t)return!0;const y=e.length>=O,h=t.length>=O;if(!y&&!h)return!1;const c=y?I(i,s):i,a=h?I(t,r):t;return c===""||a===""?!1:y&&a.startsWith(c)?!0:h&&c.startsWith(a)}l(v,"substitutionReproducesId");function B(e,t){if(e===t)return[];let s=0;const r=Math.min(e.length,t.length);for(;s<r&&e[s]===t[s];)s+=1;let i=0;const y=Math.min(e.length,t.length)-s;for(;i<y&&e[e.length-1-i]===t[t.length-1-i];)i+=1;const h=e.slice(s,e.length-i),c=t.slice(s,t.length-i);if(h===""||c==="")return[];const a={oldResidue:h,newResidue:c},u=Math.min(h.length,c.length),A=Math.min(Math.max(0,J-u),i);if(A===0)return[a];const f=e.slice(e.length-i,e.length-i+A);return[a,{oldResidue:h+f,newResidue:c+f}]}l(B,"deriveResiduePairs");function V(e,t,s,r){const i=t.filter(w=>b(w.address).includes(e.oldResidue)),y=s.filter(w=>b(w.address).includes(e.newResidue)),h=[],c=new Set,a=l(w=>y.filter(S=>S.resourceType===w.resourceType&&v(b(w.address),b(S.address),e.oldResidue,e.newResidue)&&!c.has(S.address)),"candidatesFor"),u=new Map,A=new Map,f=l((w,S,n)=>{const d=w.get(n);if(d!==void 0)return d;const o=[],g=D(S,n);return g!==void 0&&H(g,o),w.set(n,o),o},"stringsOf"),P=l((w,S)=>{let n=!1;const d=f(u,r?.oldTemplate,w.address),o=f(A,r?.newTemplate,S.address);for(const g of h)if(f(u,r?.oldTemplate,g.deleteChange.address).some(m=>m.includes(w.address))&&(n=!0,!f(A,r?.newTemplate,g.createChange.address).some(C=>C.includes(S.address)))||d.some(m=>m.includes(g.deleteChange.address))&&(n=!0,!o.some(m=>m.includes(g.createChange.address))))return!1;return n},"candidateAgrees");let R=[...i],N=!0;for(;N;){N=!1;for(const w of[...R]){const S=a(w);let n;if(S.length===1)n=S[0];else if(S.length>1){const d=S.filter(o=>P(w,o));d.length===1&&(n=d[0])}n!==void 0&&(c.add(n.address),h.push({deleteChange:w,createChange:n}),R=R.filter(d=>d!==w),N=!0)}}const j=R.length>0||c.size!==y.length;return{...e,pairs:h,touchedDeletes:i,integrityFailed:j}}l(V,"coverHypothesis");function X(e){return e.pairs.map(t=>`${t.deleteChange.address} ${t.createChange.address}`).sort().join(`
2
+ `)}l(X,"pairSetKey");function Y(e){const t=e.touchedDeletes.map(s=>s.address).sort().join(`
3
+ `);return`${X(e)}::${t}`}l(Y,"hypothesisKey");function q(e,t){if(e.pairs.length===0||e.pairs.length>=t.pairs.length)return!1;const s=new Set(t.pairs.map(r=>`${r.deleteChange.address} ${r.createChange.address}`));return e.pairs.every(r=>s.has(`${r.deleteChange.address} ${r.createChange.address}`))}l(q,"isSubsumedBy");function Q(e,t){if(e.pairs.length>=t.pairs.length)return!1;const s=new Set(t.pairs.map(i=>i.deleteChange.address)),r=new Set(t.pairs.map(i=>i.createChange.address));return e.touchedDeletes.every(i=>s.has(i.address))&&e.pairs.every(i=>r.has(i.createChange.address))}l(Q,"isNoiseAgainst");function H(e,t){if(typeof e=="string"){t.push(e);return}if(Array.isArray(e)){for(const s of e)H(s,t);return}if(typeof e=="object"&&e!==null)for(const s of Object.values(e))H(s,t)}l(H,"deepStrings");function Z(e,t,s,r){const i=t.get(e.deleteChange.address);if(i===void 0||i.length<W)return!1;const y=D(r,e.createChange.address);if(y===void 0)return!1;const h=[];if(H(y,h),!h.some(u=>u.includes(i)))return!1;const c=D(s,e.deleteChange.address);if(c===void 0)return!0;const a=[];return H(c,a),!a.some(u=>u.includes(i))}l(Z,"physicalIdAnchors");function E(e,t){const s=t.get(e);if(s!==void 0)return s;let r=e;for(const[i,y]of t)r.includes(i)&&(r=r.split(i).join(y));return r}l(E,"remapString");function _(e,t){if(typeof e=="string")return E(e,t);if(Array.isArray(e))return e.map(s=>_(s,t));if(typeof e=="object"&&e!==null){const s={};for(const[r,i]of Object.entries(e))s[E(r,t)]=_(i,t);return s}return e}l(_,"remapValue");function x(e){return Array.isArray(e)?`[${e.map(x).join(",")}]`:typeof e=="object"&&e!==null?`{${Object.entries(e).sort(([s],[r])=>s<r?-1:s>r?1:0).map(([s,r])=>`${JSON.stringify(s)}:${x(r)}`).join(",")}}`:JSON.stringify(e)??"null"}l(x,"canonicalJson");function ee(e,t,s){const r=new Map(e.pairs.map(i=>[i.deleteChange.address,i.createChange.address]));return e.pairs.every(i=>{const y=D(t,i.deleteChange.address),h=D(s,i.createChange.address);return y===void 0||h===void 0?!1:x(_(y,r))===x(h)})}l(ee,"propertyDigestMatches");const te={"identity-alias":"the synthesised manifest's capacity-identity alias names this rename","physical-id":"the new resource's properties reproduce the live physical ID","property-digest":"properties are unchanged apart from the renamed identity",singleton:"the only renamed subtree in the stack"};function se(e,t){return t.find(s=>s.legacyAnchor===s.anchor?!1:e.pairs.every(r=>{const i=b(r.deleteChange.address),y=b(r.createChange.address);return i.includes(s.legacyAnchor)&&v(i,y,s.legacyAnchor,s.anchor)}))}l(se,"confirmingAlias");function K(e,t,s){const r=s>1?` (subtree of ${s} resources)`:"";return`logical identity renamed to ${e.createChange.address} \u2014 ${te[t]}${r}; deploying without remediation deletes or orphans the live resource and recreates a fresh twin under the new identity`}l(K,"detectedCause");function ne(e){const t=e.slice(0,3).join(", "),s=e.length>3?` and ${e.length-3} more`:"";return e.length>0?`identity rename suspected but ambiguous \u2014 candidate new identities: ${t}${s}; no matcher could disambiguate, and remediating against the wrong identity is worse than aborting`:"identity rename suspected but ambiguous \u2014 a renamed subtree member could not be role-matched (possible ID truncation); failing closed"}l(ne,"ambiguousCause");function re(e){const t=e.slice(0,3).join(", "),s=e.length>3?` and ${e.length-3} more`:"";return`rename candidacy dissolved \u2014 every touched resource is stateless (nothing to orphan); ${e.length>0?`candidate new identities: ${t}${s}`:"a subtree member could not be role-matched"}`}l(re,"statelessDissolveCause");function ie(e){const t=new Set(e.changes.map(r=>r.stack)),s=[];for(const r of t){const i=e.changes.filter(c=>c.stack===r&&c.action==="delete"),y=e.changes.filter(c=>c.stack===r&&c.action==="create");i.some(c=>y.some(a=>a.resourceType===c.resourceType&&B(b(c.address),b(a.address)).length>0))&&s.push(r)}return s}l(ie,"renameCandidateStackNames");function ae(e){const{deletes:t,creates:s,pair:r,physicalIdByLogicalId:i,identityAliases:y}=e,h=new Map,c=new Map;for(const n of t)for(const d of s){if(d.resourceType!==n.resourceType)continue;const o=B(b(n.address),b(d.address));for(const g of o)c.set(`${g.oldResidue} ${g.newResidue}`,g)}if(c.size===0)return h;let a=[...c.values()].map(n=>V(n,t,s,r)).filter(n=>n.pairs.length>0||n.integrityFailed&&n.touchedDeletes.length>=2);const u=new Map;for(const n of a){const d=Y(n),o=u.get(d);(o===void 0||!o.integrityFailed&&n.integrityFailed)&&u.set(d,n)}a=[...u.values()];const A=a;a=A.filter(n=>!A.some(d=>d!==n&&(q(n,d)||Q(n,d))));const f=new Map,P=new Map;for(const n of a){if(n.integrityFailed){f.set(n,void 0);continue}const d=se(n,y);if(d!==void 0){f.set(n,"identity-alias"),P.set(n,d);continue}if(n.pairs.some(g=>Z(g,i,r?.oldTemplate,r?.newTemplate))){f.set(n,"physical-id");continue}if(ee(n,r?.oldTemplate,r?.newTemplate)){f.set(n,"property-digest");continue}f.set(n,void 0)}const R=l(n=>{const d=[],o=new Set;for(const g of n){if(o.has(g))continue;const p=[g];o.add(g);let m=!0;for(;m;){m=!1;const C=new Set(p.flatMap($=>[...$.pairs.flatMap(k=>[`d:${k.deleteChange.address}`,`c:${k.createChange.address}`]),...$.touchedDeletes.map(k=>`d:${k.address}`)]));for(const $ of n){if(o.has($))continue;($.pairs.some(M=>C.has(`d:${M.deleteChange.address}`)||C.has(`c:${M.createChange.address}`))||$.touchedDeletes.some(M=>C.has(`d:${M.address}`)))&&(p.push($),o.add($),m=!0)}}d.push(p)}return d},"splitComponents"),N=l((n,d)=>{const o=P.get(n),g=o!==void 0?{pinSlotHint:{appName:o.appName,slot:o.slot}}:{};for(const p of n.pairs)h.set(p.deleteChange.address,{kind:"finding",finding:"rename-detected",pairedAddress:p.createChange.address,cause:K(p,d,n.pairs.length),...g}),h.set(p.createChange.address,{kind:"finding",finding:"rename-detected",pairedAddress:p.deleteChange.address,cause:K(p,d,n.pairs.length),...g})},"markDetected"),j=l(n=>{const d=new Map,o=new Map;for(const p of n){for(const m of p.pairs){o.set(m.deleteChange.address,m.deleteChange);const C=d.get(m.deleteChange.address)??new Set;C.add(m.createChange.address),d.set(m.deleteChange.address,C)}for(const m of p.touchedDeletes)o.set(m.address,m)}const g=[...o.values()].every(p=>!L(p.resourceType));for(const[p]of o){const m=[...d.get(p)??[]].sort();h.set(p,g?{kind:"stateless-dissolve",cause:re(m)}:{kind:"finding",finding:"rename-ambiguous",cause:ne(m)})}},"markAmbiguous"),w=l((n,d)=>{const o=new Set(n.pairs.flatMap(g=>[`d:${g.deleteChange.address}`,`c:${g.createChange.address}`]));return d.pairs.some(g=>o.has(`d:${g.deleteChange.address}`)||o.has(`c:${g.createChange.address}`))},"hypothesesShareRow"),S=l(n=>{const d=n.some(C=>C.integrityFailed),o=n.filter(C=>f.get(C)!==void 0&&!C.integrityFailed);if(o.some((C,$)=>o.some((k,M)=>M>$&&w(C,k)))||d){j(n);return}const p=o[0];if(p!==void 0){const C=f.get(p);C!==void 0&&N(p,C);const $=new Set(p.pairs.map(T=>T.deleteChange.address)),k=new Set(p.pairs.map(T=>T.createChange.address)),M=n.filter(T=>T!==p&&!T.pairs.some(F=>$.has(F.deleteChange.address)||k.has(F.createChange.address)));for(const T of R(M))S(T);return}const m=n[0];if(n.length===1&&m!==void 0&&m.pairs.length>=2){N(m,"singleton");return}n.length>1&&n.some(C=>C.pairs.length>=2)&&j(n)},"resolveComponent");for(const n of R(a))S(n);return h}l(ae,"resolveStack");function ue(e){const{plan:t,stacks:s,physicalResources:r,identityAliases:i}=e,y=new Map(s.map(a=>[a.stackName,a])),h=new Map;for(const a of ie(t)){const u=new Map;for(const f of r.get(a)??[])f.physicalId!==void 0&&f.physicalId!==""&&u.set(f.logicalId,f.physicalId);const A=ae({deletes:t.changes.filter(f=>f.stack===a&&f.action==="delete"),creates:t.changes.filter(f=>f.stack===a&&f.action==="create"),pair:y.get(a),physicalIdByLogicalId:u,identityAliases:i??[]});A.size>0&&h.set(a,A)}if(h.size===0)return t;const c=t.changes.map(a=>{const u=h.get(a.stack)?.get(a.address);if(u===void 0||a.action!=="delete"&&a.action!=="create")return a;if(u.kind==="stateless-dissolve")return{...a,renameCandidacyNote:u.cause};if(a.action==="create")return u.pairedAddress===void 0?a:{...a,renamePairedAddress:u.pairedAddress,renameCause:u.cause,...u.pinSlotHint!==void 0?{renameSlotHint:u.pinSlotHint}:{}};const A=r.get(a.stack)?.find(f=>f.logicalId===a.address&&f.physicalId!==void 0&&f.physicalId!=="")?.physicalId;return{...a,renameFinding:u.finding,...u.pairedAddress!==void 0?{renamePairedAddress:u.pairedAddress}:{},...A!==void 0?{renamePhysicalId:A}:{},...u.pinSlotHint!==void 0?{renameSlotHint:u.pinSlotHint}:{},renameCause:u.cause,destructive:!0,dataLoss:L(a.resourceType)}});return{...t,changes:c,hasDestructiveChanges:c.some(a=>a.destructive),summary:G({counts:t.counts,changes:c})}}l(ue,"applyRenameDetection");export{O as CDK_LOGICAL_ID_HUMAN_CLIP_LENGTH,ue as applyRenameDetection,B as deriveResiduePairs,ie as renameCandidateStackNames,b as stripTrailingHash,v as substitutionReproducesId};
@@ -1 +1 @@
1
- var p=Object.defineProperty;var n=(a,e)=>p(a,"name",{value:e,configurable:!0});const u={create:0,update:1,replace:2,delete:3,read:4,"no-op":5},c={create:"+",update:"~",replace:"\xB1",delete:"-",read:">","no-op":" "};function h(a){const{counts:e}=a,t=[];if(e.create>0&&t.push(`${e.create} to create`),e.update>0&&t.push(`${e.update} to update`),e.replace>0&&t.push(`${e.replace} to replace`),e.delete>0&&t.push(`${e.delete} to destroy`),e.read>0&&t.push(`${e.read} to read`),t.length===0)return"No changes";const r=a.changes.filter(d=>d.destructive).length,o=a.changes.filter(d=>d.dataLoss).length,s=[];r>0&&s.push(`${r} destructive`),o>0&&s.push(`${o} with data loss`);const i=t.join(", ");return s.length>0?`${i} (${s.join(", ")})`:i}n(h,"renderPlanSummary");function f(a){return a.changes.slice().sort((e,t)=>u[e.action]-u[t.action]||`${e.stack}/${e.address}`.localeCompare(`${t.stack}/${t.address}`)).map(e=>{const t=[];e.replacementMode==="may"&&t.push("may replace"),e.replacementMode==="conditional"&&t.push("conditional replace"),e.renameFinding==="rename-detected"&&t.push(e.renamePairedAddress!==void 0?`renamed to ${e.renamePairedAddress}`:"rename detected"),e.renameFinding==="rename-ambiguous"&&t.push("rename ambiguous"),e.action==="create"&&e.renamePairedAddress!==void 0&&t.push(`renamed from ${e.renamePairedAddress}`),e.dataLoss&&t.push("data loss"),e.retained&&t.push("retained"),(e.verdictSource==="cdk-spec (unverified)"||e.verdictSource==="registry (change-set unverified)")&&t.push("unverified");const r=t.length>0?` (${t.join(", ")})`:"";return`${c[e.action]} ${e.action.padEnd(7)} ${e.resourceType} ${e.stack}/${e.address}${r}`})}n(f,"renderPlanLines");function m(a){return a.changes.map(e=>({address:e.address,resourceType:e.resourceType,action:e.action,stack:e.stack,replacementMode:e.replacementMode,dataLoss:e.dataLoss,...e.propertyChanges.length>0&&{propertyChanges:e.propertyChanges}}))}n(m,"toWirePlanChanges");export{f as renderPlanLines,h as renderPlanSummary,m as toWirePlanChanges};
1
+ var p=Object.defineProperty;var s=(t,e)=>p(t,"name",{value:e,configurable:!0});const u={create:0,update:1,replace:2,delete:3,read:4,"no-op":5},c={create:"+",update:"~",replace:"\xB1",delete:"-",read:">","no-op":" "};function h(t){const{counts:e}=t,a=[];if(e.create>0&&a.push(`${e.create} to create`),e.update>0&&a.push(`${e.update} to update`),e.replace>0&&a.push(`${e.replace} to replace`),e.delete>0&&a.push(`${e.delete} to destroy`),e.read>0&&a.push(`${e.read} to read`),a.length===0)return"No changes";const r=t.changes.filter(d=>d.destructive).length,o=t.changes.filter(d=>d.dataLoss).length,n=[];r>0&&n.push(`${r} destructive`),o>0&&n.push(`${o} with data loss`);const i=a.join(", ");return n.length>0?`${i} (${n.join(", ")})`:i}s(h,"renderPlanSummary");function l(t){return t.changes.slice().sort((e,a)=>u[e.action]-u[a.action]||`${e.stack}/${e.address}`.localeCompare(`${a.stack}/${a.address}`)).map(e=>{const a=[];e.replacementMode==="may"&&a.push("may replace"),e.replacementMode==="conditional"&&a.push("conditional replace"),e.renameFinding==="rename-detected"&&a.push(e.renamePairedAddress!==void 0?`renamed to ${e.renamePairedAddress}`:"rename detected"),e.renameFinding==="rename-ambiguous"&&a.push("rename ambiguous"),e.renameCandidacyNote!==void 0&&a.push(e.renameCandidacyNote),e.action==="create"&&e.renamePairedAddress!==void 0&&a.push(`renamed from ${e.renamePairedAddress}`),e.dataLoss&&a.push("data loss"),e.retained&&a.push("retained"),(e.verdictSource==="cdk-spec (unverified)"||e.verdictSource==="registry (change-set unverified)")&&a.push("unverified");const r=a.length>0?` (${a.join(", ")})`:"";return`${c[e.action]} ${e.action.padEnd(7)} ${e.resourceType} ${e.stack}/${e.address}${r}`})}s(l,"renderPlanLines");function m(t){return t.changes.map(e=>({address:e.address,resourceType:e.resourceType,action:e.action,stack:e.stack,replacementMode:e.replacementMode,dataLoss:e.dataLoss,...e.propertyChanges.length>0&&{propertyChanges:e.propertyChanges}}))}s(m,"toWirePlanChanges");export{l as renderPlanLines,h as renderPlanSummary,m as toWirePlanChanges};
@@ -90,6 +90,14 @@ export interface DeployPlanResourceChange {
90
90
  renamePhysicalId?: string;
91
91
  /** Human attribution for the ticket cause and the plan renderer. */
92
92
  renameCause?: string;
93
+ /**
94
+ * Set on a delete row whose rename candidacy DISSOLVED: the contention
95
+ * component was ambiguous but every touched delete row is stateless, so
96
+ * there is nothing to orphan and the row keeps its plain classification.
97
+ * Mutually exclusive with {@link renameFinding} — a dissolved row mints no
98
+ * destruction ticket. Plan-internal annotation; not part of the wire shape.
99
+ */
100
+ renameCandidacyNote?: string;
93
101
  /**
94
102
  * The {appName, slot} the confirming capacity-identity alias named — set
95
103
  * only when matcher (a) confirmed the rename. Present ⇔ the row is
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fjall/deploy-core",
3
- "version": "12.1.0",
3
+ "version": "12.1.1",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/fjall-tech/fjall.git",
@@ -96,8 +96,8 @@
96
96
  "@aws-sdk/client-ssm": "^3.1098.0",
97
97
  "@aws-sdk/client-sso-admin": "^3.1098.0",
98
98
  "@aws-sdk/client-sts": "^3.1098.0",
99
- "@fjall/generator": "^12.1.0",
100
- "@fjall/util": "^12.1.0",
99
+ "@fjall/generator": "^12.1.1",
100
+ "@fjall/util": "^12.1.1",
101
101
  "@smithy/node-http-handler": "^4.9.13",
102
102
  "aws-cdk": "^2.1134.0",
103
103
  "tsx": "^4.23.1",