@fjall/generator 0.95.0 → 0.99.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.
Files changed (166) hide show
  1. package/dist/.minified +1 -1
  2. package/dist/src/ast/astClickHouseParser.d.ts +25 -0
  3. package/dist/src/ast/astClickHouseParser.js +1 -0
  4. package/dist/src/ast/astCodeInjection.d.ts +9 -0
  5. package/dist/src/ast/astCodeInjection.js +8 -0
  6. package/dist/src/ast/astComputeParser.js +1 -1
  7. package/dist/src/ast/astComputeParserHelpers.js +1 -1
  8. package/dist/src/ast/astDatabaseParser.d.ts +5 -2
  9. package/dist/src/ast/astDatabaseParser.js +1 -1
  10. package/dist/src/ast/astInfrastructureParser.d.ts +7 -1
  11. package/dist/src/ast/astInfrastructureParser.js +1 -1
  12. package/dist/src/ast/astPlanConverter.js +2 -2
  13. package/dist/src/ast/astScheduleParser.d.ts +18 -0
  14. package/dist/src/ast/astScheduleParser.js +1 -0
  15. package/dist/src/ast/astStatementClassifier.d.ts +2 -2
  16. package/dist/src/ast/astStatementClassifier.js +1 -1
  17. package/dist/src/ast/astStatementQueries.d.ts +4 -4
  18. package/dist/src/ast/astStatementQueries.js +3 -3
  19. package/dist/src/ast/astSurgicalModification.d.ts +14 -12
  20. package/dist/src/ast/astSurgicalModification.js +6 -13
  21. package/dist/src/ast/astTestHelpers.d.ts +41 -7
  22. package/dist/src/ast/index.d.ts +3 -2
  23. package/dist/src/ast/index.js +1 -1
  24. package/dist/src/codemod/_internal.d.ts +6 -1
  25. package/dist/src/codemod/_internal.js +1 -1
  26. package/dist/src/codemod/drift/detect.d.ts +11 -0
  27. package/dist/src/codemod/drift/detect.js +1 -0
  28. package/dist/src/codemod/drift/index.d.ts +4 -0
  29. package/dist/src/codemod/drift/index.js +1 -0
  30. package/dist/src/codemod/drift/merge.d.ts +19 -0
  31. package/dist/src/codemod/drift/merge.js +1 -0
  32. package/dist/src/codemod/drift/snapshot.d.ts +4 -0
  33. package/dist/src/codemod/drift/snapshot.js +1 -0
  34. package/dist/src/codemod/drift/types.d.ts +60 -0
  35. package/dist/src/codemod/drift/types.js +1 -0
  36. package/dist/src/codemod/edits/addResource/propertyBuilder.d.ts +1 -1
  37. package/dist/src/codemod/edits/addResource/propertyBuilder.js +1 -1
  38. package/dist/src/codemod/edits/addResource.d.ts +8 -3
  39. package/dist/src/codemod/edits/addResource.js +1 -1
  40. package/dist/src/codemod/edits/controlFlowPolicy.d.ts +19 -0
  41. package/dist/src/codemod/edits/controlFlowPolicy.js +1 -0
  42. package/dist/src/codemod/edits/crossPlanConnection.d.ts +20 -0
  43. package/dist/src/codemod/edits/crossPlanConnection.js +1 -0
  44. package/dist/src/codemod/edits/driftPolicy.d.ts +7 -0
  45. package/dist/src/codemod/edits/driftPolicy.js +1 -0
  46. package/dist/src/codemod/edits/findInsertionPosition.js +1 -1
  47. package/dist/src/codemod/edits/index.d.ts +3 -0
  48. package/dist/src/codemod/edits/index.js +1 -1
  49. package/dist/src/codemod/edits/modifyResource.d.ts +9 -3
  50. package/dist/src/codemod/edits/modifyResource.js +1 -1
  51. package/dist/src/codemod/edits/removeResource.d.ts +2 -2
  52. package/dist/src/codemod/edits/removeResource.js +1 -1
  53. package/dist/src/codemod/edits/vpcPeer.d.ts +24 -0
  54. package/dist/src/codemod/edits/vpcPeer.js +1 -0
  55. package/dist/src/codemod/edits/vpcPeerAccepter.d.ts +20 -0
  56. package/dist/src/codemod/edits/vpcPeerAccepter.js +1 -0
  57. package/dist/src/codemod/index.d.ts +16 -4
  58. package/dist/src/codemod/index.js +1 -1
  59. package/dist/src/codemod/llmFallback/apply.d.ts +10 -0
  60. package/dist/src/codemod/llmFallback/apply.js +1 -0
  61. package/dist/src/codemod/llmFallback/claudeTier.d.ts +6 -0
  62. package/dist/src/codemod/llmFallback/claudeTier.js +1 -0
  63. package/dist/src/codemod/llmFallback/egressGate.d.ts +5 -0
  64. package/dist/src/codemod/llmFallback/egressGate.js +1 -0
  65. package/dist/src/codemod/llmFallback/egressGate.types.d.ts +9 -0
  66. package/dist/src/codemod/llmFallback/egressGate.types.js +0 -0
  67. package/dist/src/codemod/llmFallback/index.d.ts +6 -0
  68. package/dist/src/codemod/llmFallback/index.js +1 -0
  69. package/dist/src/codemod/llmFallback/morphTier.d.ts +2 -0
  70. package/dist/src/codemod/llmFallback/morphTier.js +3 -0
  71. package/dist/src/codemod/llmFallback/prompt.d.ts +12 -0
  72. package/dist/src/codemod/llmFallback/prompt.js +36 -0
  73. package/dist/src/codemod/llmFallback/runFallback.d.ts +13 -0
  74. package/dist/src/codemod/llmFallback/runFallback.js +1 -0
  75. package/dist/src/codemod/llmFallback/shouldTryFallback.d.ts +13 -0
  76. package/dist/src/codemod/llmFallback/shouldTryFallback.js +1 -0
  77. package/dist/src/codemod/llmFallback/signals.d.ts +4 -0
  78. package/dist/src/codemod/llmFallback/signals.js +1 -0
  79. package/dist/src/codemod/llmFallback/telemetryEvents.d.ts +141 -0
  80. package/dist/src/codemod/llmFallback/telemetryEvents.js +1 -0
  81. package/dist/src/codemod/llmFallback/tierRunner.d.ts +7 -0
  82. package/dist/src/codemod/llmFallback/tierRunner.js +1 -0
  83. package/dist/src/codemod/llmFallback/types.d.ts +104 -0
  84. package/dist/src/codemod/llmFallback/types.js +1 -0
  85. package/dist/src/codemod/registry.d.ts +4 -1
  86. package/dist/src/codemod/registry.js +1 -1
  87. package/dist/src/codemod/semanticIndex/classifyControlFlow.d.ts +2 -0
  88. package/dist/src/codemod/semanticIndex/classifyControlFlow.js +1 -0
  89. package/dist/src/codemod/semanticIndex/findReferences.js +2 -2
  90. package/dist/src/codemod/telemetry/errorKinds.d.ts +2 -0
  91. package/dist/src/codemod/telemetry/errorKinds.js +1 -0
  92. package/dist/src/codemod/types.d.ts +110 -1
  93. package/dist/src/codemod/types.js +1 -1
  94. package/dist/src/codemod/validationGate/gates/classify.d.ts +2 -0
  95. package/dist/src/codemod/validationGate/gates/classify.js +1 -0
  96. package/dist/src/codemod/validationGate/gates/drift.d.ts +2 -0
  97. package/dist/src/codemod/validationGate/gates/drift.js +1 -0
  98. package/dist/src/codemod/validationGate/gates/locate.d.ts +7 -0
  99. package/dist/src/codemod/validationGate/gates/locate.js +1 -0
  100. package/dist/src/codemod/validationGate/gates/parse.d.ts +2 -0
  101. package/dist/src/codemod/validationGate/gates/parse.js +1 -0
  102. package/dist/src/codemod/validationGate/gates/schema.d.ts +2 -0
  103. package/dist/src/codemod/validationGate/gates/schema.js +1 -0
  104. package/dist/src/codemod/validationGate/index.d.ts +6 -0
  105. package/dist/src/codemod/validationGate/index.js +1 -0
  106. package/dist/src/codemod/validationGate/types.d.ts +35 -0
  107. package/dist/src/codemod/validationGate/types.js +1 -0
  108. package/dist/src/detection/index.d.ts +148 -0
  109. package/dist/src/detection/index.js +1 -0
  110. package/dist/src/generation/common.d.ts +22 -0
  111. package/dist/src/generation/common.js +5 -4
  112. package/dist/src/generation/compute/ec2.d.ts +2 -0
  113. package/dist/src/generation/compute/ec2.js +4 -0
  114. package/dist/src/generation/compute/ecs.d.ts +2 -0
  115. package/dist/src/generation/compute/ecs.js +42 -0
  116. package/dist/src/generation/compute/lambda.d.ts +3 -0
  117. package/dist/src/generation/compute/lambda.js +26 -0
  118. package/dist/src/generation/compute/shared.d.ts +22 -0
  119. package/dist/src/generation/compute/shared.js +4 -0
  120. package/dist/src/generation/compute.d.ts +4 -5
  121. package/dist/src/generation/compute.js +6 -86
  122. package/dist/src/generation/database.d.ts +11 -0
  123. package/dist/src/generation/database.js +23 -12
  124. package/dist/src/generation/index.d.ts +1 -1
  125. package/dist/src/generation/index.js +1 -1
  126. package/dist/src/generation/infrastructure.js +5 -5
  127. package/dist/src/generation/storage.js +30 -30
  128. package/dist/src/index.d.ts +1 -1
  129. package/dist/src/index.js +1 -1
  130. package/dist/src/planning/index.d.ts +2 -1
  131. package/dist/src/planning/index.js +1 -1
  132. package/dist/src/planning/openNextPlanning.d.ts +38 -0
  133. package/dist/src/planning/openNextPlanning.js +1 -0
  134. package/dist/src/planning/resourceAddition.d.ts +5 -1
  135. package/dist/src/planning/resourceAddition.js +1 -1
  136. package/dist/src/planning/resourcePlanning.d.ts +0 -46
  137. package/dist/src/planning/resourcePlanning.js +1 -1
  138. package/dist/src/presets/clickhouseTierPreset.d.ts +35 -0
  139. package/dist/src/presets/clickhouseTierPreset.js +0 -0
  140. package/dist/src/presets/tierPresets.d.ts +5 -12
  141. package/dist/src/presets/tierPresets.js +1 -1
  142. package/dist/src/presets/tierTypes.d.ts +9 -19
  143. package/dist/src/schemas/applicationSchemas.d.ts +67 -8
  144. package/dist/src/schemas/applicationSchemas.js +1 -1
  145. package/dist/src/schemas/baseSchemas.d.ts +24 -5
  146. package/dist/src/schemas/baseSchemas.js +2 -2
  147. package/dist/src/schemas/computeSchemas.d.ts +108 -14
  148. package/dist/src/schemas/computeSchemas.js +1 -1
  149. package/dist/src/schemas/constants.d.ts +14 -0
  150. package/dist/src/schemas/constants.js +1 -1
  151. package/dist/src/schemas/databaseSchemas.d.ts +80 -0
  152. package/dist/src/schemas/databaseSchemas.js +1 -1
  153. package/dist/src/schemas/networkSchemas.d.ts +126 -11
  154. package/dist/src/schemas/networkSchemas.js +1 -1
  155. package/dist/src/schemas/patternSchemas.js +1 -1
  156. package/dist/src/schemas/sharedTypes.d.ts +1 -1
  157. package/dist/src/schemas/sharedTypes.js +1 -1
  158. package/dist/src/validation/patterns.d.ts +2 -318
  159. package/dist/src/validation/patterns.js +1 -1
  160. package/dist/src/validation/validationMessages.d.ts +315 -0
  161. package/dist/src/validation/validationMessages.js +1 -0
  162. package/dist/src/validation/validationPatterns.d.ts +34 -0
  163. package/dist/src/validation/validationPatterns.js +1 -0
  164. package/dist/src/version.d.ts +1 -1
  165. package/dist/src/version.js +1 -1
  166. package/package.json +19 -13
@@ -1,15 +1,26 @@
1
- import{buildProperty as o,formatValue as p,getVariableName as d,emitExtraProperties as g}from"./common.js";const s=Object.freeze({HOST:"DATABASE_HOST",PORT:"DATABASE_PORT",NAME:"DATABASE_NAME",SSL:"DATABASE_SSL",USERNAME:"DATABASE_USERNAME",PASSWORD:"DATABASE_PASSWORD"}),u=Object.freeze({USERNAME:"username",PASSWORD:"password"});function A(e,n){const t=n.connectedDatabase;return t?.length?e.database.filter(r=>t.includes(r.name)):[]}function a(e,n){return`${e}.getCredentials().getImport("${n}")`}function S(e){const n=[],t=(r,l,c)=>{n.push({key:r,expression:l,isSecret:c})};if(e.length===1){const r=d(e[0]);t(s.HOST,`${r}.getHostEndpoint()`,!1),t(s.PORT,`${r}.getHostPort()`,!1),t(s.NAME,`${r}.getDatabaseName()`,!1),t(s.SSL,'"true"',!1),t(s.USERNAME,a(r,u.USERNAME),!0),t(s.PASSWORD,a(r,u.PASSWORD),!0)}else for(const[r,l]of e.entries()){const c=d(l),i=r===0?"":`_${r+1}`;t(`${s.HOST}${i}`,`${c}.getHostEndpoint()`,!1),t(`${s.PORT}${i}`,`${c}.getHostPort()`,!1),t(`${s.NAME}${i}`,`${c}.getDatabaseName()`,!1),t(`${s.SSL}${i}`,'"true"',!1),t(`${s.USERNAME}${i}`,a(c,u.USERNAME),!0),t(`${s.PASSWORD}${i}`,a(c,u.PASSWORD),!0)}return n}function x(e){return`connections: [${e.map(t=>d(t)).join(", ")}],`}function P(e,n){const t={},r={};if(!n.needsConnection||!n.connectedDatabase?.length)return{env:t,secrets:r};const l=A(e,n),c=S(l);for(const i of c){const f=i.expression==='"true"'?"true":{__expression:i.expression};i.isSecret?r[i.key]={__expression:i.expression}:t[i.key]=f}return{env:t,secrets:r}}function E(e){let n="";return n+=o(e.port!==void 0,"port",e.port),n+=o(e.deletionProtection!==void 0,"deletionProtection",e.deletionProtection),n+=o(e.snapshotIdentifier!==void 0,"snapshotIdentifier",e.snapshotIdentifier,"string"),n+=o(e.snapshotUsername!==void 0,"snapshotUsername",e.snapshotUsername,"string"),n+=o(e.monitoringInterval!==void 0,"monitoringInterval",e.monitoringInterval),n}function y(e){if(e.type!=="Instance")return"";let n="";return n+=o(e.instanceType!==void 0,"instanceType",e.instanceType,"string"),n+=o(e.allocatedStorage!==void 0,"allocatedStorage",e.allocatedStorage),n+=o(e.multiAz!==void 0,"multiAz",e.multiAz),n+=o(e.publiclyAccessible!==void 0,"publiclyAccessible",e.publiclyAccessible),n+=o(e.encryption!==void 0,"encryption",e.encryption,"object"),n+=o(e.databaseInsights!==void 0,"databaseInsights",e.databaseInsights,"boolean-or-object"),n+=o(e.proxy!==void 0,"proxy",e.proxy,"boolean-or-object"),n+=o(e.readReplica!==void 0,"readReplica",e.readReplica,"boolean-or-object"),n+=o(e.credentials!==void 0,"credentials",e.credentials,"object"),n+=o(e.backupRetention!==void 0,"backupRetention",e.backupRetention),n}function m(e){if(e.type!=="Aurora"&&e.type!=="GlobalAurora")return"";let n="";return n+=o(e.encryption!==void 0,"encryption",e.encryption,"object"),n+=o(e.databaseInsights!==void 0,"databaseInsights",e.databaseInsights,"boolean-or-object"),n+=o(e.proxy!==void 0,"proxy",e.proxy,"boolean-or-object"),n+=o(e.credentials!==void 0,"credentials",e.credentials,"object"),n+=o(e.writer!==void 0,"writer",e.writer,"object"),n+=o(e.readers!==void 0,"readers",e.readers,"boolean-or-object"),n+=o(e.backupRetention!==void 0,"backupRetention",e.backupRetention),n+=o(e.preferredMaintenanceWindow!==void 0,"preferredMaintenanceWindow",e.preferredMaintenanceWindow,"string"),n}function R(e){if(e.type!=="GlobalAurora")return"";let n="";return n+=o(e.primaryRegion!==void 0,"primaryRegion",e.primaryRegion,"string"),e.secondaryRegions!==void 0&&e.secondaryRegions.length>0&&(n+=`
2
- secondaryRegions: [${e.secondaryRegions.map(t=>`"${t}"`).join(", ")}],`),n+=o(e.globalClusterIdentifier!==void 0,"globalClusterIdentifier",e.globalClusterIdentifier,"string"),n+=o(e.enableGlobalWriteForwarding!==void 0,"enableGlobalWriteForwarding",e.enableGlobalWriteForwarding),n}function b(e,n){return n.compute.some(t=>t.needsConnection&&t.connectedDatabase?.includes(e.name))}function h(e){if(e.database.length===0)return"";let n="";for(let t=0;t<e.database.length;t++){const r=e.database[t],l=d(r),c=b(r,e),i=t>0,f=c?`const ${l} = `:"";n+=`${i?`
3
- `:""}${f}app.addDatabase(
4
- DatabaseFactory.build("${r.name}", {
1
+ import{buildProperty as o,formatValue as f,getVariableName as d,emitExtraProperties as S,escapeStringLiteral as a,formatStringArray as A,emitProductionAlertsTopicSpread as b}from"./common.js";const c=Object.freeze({HOST:"DATABASE_HOST",PORT:"DATABASE_PORT",NAME:"DATABASE_NAME",SSL:"DATABASE_SSL",USERNAME:"DATABASE_USERNAME",PASSWORD:"DATABASE_PASSWORD"}),p=Object.freeze({USERNAME:"username",PASSWORD:"password"});function y(e,n){const r=n.connectedDatabase;return r?.length?e.database.filter(t=>r.includes(t.name)):[]}function g(e,n){return`${e}.getCredentials().getImport(${a(n)})`}function m(e){const n=[],r=(t,l,s)=>{n.push({key:t,expression:l,isSecret:s})};if(e.length===1){const t=d(e[0]);r(c.HOST,`${t}.getHostEndpoint()`,!1),r(c.PORT,`${t}.getHostPort()`,!1),r(c.NAME,`${t}.getDatabaseName()`,!1),r(c.SSL,'"true"',!1),r(c.USERNAME,g(t,p.USERNAME),!0),r(c.PASSWORD,g(t,p.PASSWORD),!0)}else for(const[t,l]of e.entries()){const s=d(l),i=t===0?"":`_${t+1}`;r(`${c.HOST}${i}`,`${s}.getHostEndpoint()`,!1),r(`${c.PORT}${i}`,`${s}.getHostPort()`,!1),r(`${c.NAME}${i}`,`${s}.getDatabaseName()`,!1),r(`${c.SSL}${i}`,'"true"',!1),r(`${c.USERNAME}${i}`,g(s,p.USERNAME),!0),r(`${c.PASSWORD}${i}`,g(s,p.PASSWORD),!0)}return n}function k(e){return`connections: [${e.map(r=>d(r)).join(", ")}],`}function E(e){return e.expression==='"true"'?"true":{__expression:e.expression}}function I(e,n){const r={},t={};if(!n.needsConnection||!n.connectedDatabase?.length)return{env:r,secrets:t};const l=y(e,n),s=m(l);for(const i of s){const u=E(i);i.isSecret?t[i.key]={__expression:i.expression}:r[i.key]=u}return{env:r,secrets:t}}function $(e){let n="";return n+=o(e.port!==void 0,"port",e.port),n+=o(e.deletionProtection!==void 0,"deletionProtection",e.deletionProtection),n+=o(e.snapshotIdentifier!==void 0,"snapshotIdentifier",e.snapshotIdentifier,"string"),n+=o(e.snapshotUsername!==void 0,"snapshotUsername",e.snapshotUsername,"string"),n+=o(e.monitoringInterval!==void 0,"monitoringInterval",e.monitoringInterval),n}function R(e){if(e.type!=="Instance")return"";let n="";return n+=o(e.instanceType!==void 0,"instanceType",e.instanceType,"string"),n+=o(e.allocatedStorage!==void 0,"allocatedStorage",e.allocatedStorage),n+=o(e.multiAz!==void 0,"multiAz",e.multiAz),n+=o(e.publiclyAccessible!==void 0,"publiclyAccessible",e.publiclyAccessible),n+=o(e.encryption!==void 0,"encryption",e.encryption,"object"),n+=o(e.databaseInsights!==void 0,"databaseInsights",e.databaseInsights,"boolean-or-object"),n+=o(e.proxy!==void 0,"proxy",e.proxy,"boolean-or-object"),n+=o(e.readReplica!==void 0,"readReplica",e.readReplica,"boolean-or-object"),n+=o(e.credentials!==void 0,"credentials",e.credentials,"object"),n+=o(e.backupRetention!==void 0,"backupRetention",e.backupRetention),n}function h(e){if(e.type!=="Aurora"&&e.type!=="GlobalAurora")return"";let n="";return n+=o(e.encryption!==void 0,"encryption",e.encryption,"object"),n+=o(e.databaseInsights!==void 0,"databaseInsights",e.databaseInsights,"boolean-or-object"),n+=o(e.proxy!==void 0,"proxy",e.proxy,"boolean-or-object"),n+=o(e.credentials!==void 0,"credentials",e.credentials,"object"),n+=o(e.writer!==void 0,"writer",e.writer,"object"),n+=o(e.readers!==void 0,"readers",e.readers,"boolean-or-object"),n+=o(e.backupRetention!==void 0,"backupRetention",e.backupRetention),n+=o(e.preferredMaintenanceWindow!==void 0,"preferredMaintenanceWindow",e.preferredMaintenanceWindow,"string"),n}function D(e){if(e.type!=="GlobalAurora")return"";let n="";return n+=o(e.primaryRegion!==void 0,"primaryRegion",e.primaryRegion,"string"),e.secondaryRegions!==void 0&&e.secondaryRegions.length>0&&(n+=`
2
+ secondaryRegions: [${A(e.secondaryRegions)}],`),n+=o(e.globalClusterIdentifier!==void 0,"globalClusterIdentifier",e.globalClusterIdentifier,"string"),n+=o(e.enableGlobalWriteForwarding!==void 0,"enableGlobalWriteForwarding",e.enableGlobalWriteForwarding),n}function x(e,n){return n.compute.some(r=>r.needsConnection&&r.connectedDatabase?.includes(e.name))}function C(e){if(e.database.length===0)return"";let n="";for(let r=0;r<e.database.length;r++){const t=e.database[r],l=d(t),s=x(t,e),i=r>0,u=s?`const ${l} = `:"";n+=`${i?`
3
+ `:""}${u}app.addDatabase(
4
+ DatabaseFactory.build(${a(t.name)}, {
5
5
  vpc: app.getVpc(),
6
- type: "${r.type}",
7
- databaseName: "${r.databaseName}",`,r.engineExpression?n+=`
8
- engine: ${r.engineExpression},`:r.databaseEngine&&(n+=`
9
- databaseEngine: "${r.databaseEngine}",`),n+=E(r),n+=y(r),n+=m(r),n+=R(r),n+=g(r.extraProperties),r.alarms===!1?n+=`
10
- alarms: false,`:typeof r.alarms=="object"&&(n+=`
11
- alarms: ${p(r.alarms," ")},`),r.type!=="GlobalAurora"&&(n+=`
12
- ...(getConfig().environment === "production" ? { alertsTopic: "import:SharedAlarmTopicArn" } : {}),`),n+=`
6
+ type: ${a(t.type)},
7
+ databaseName: ${a(t.databaseName)},`,t.engineExpression?n+=`
8
+ engine: ${t.engineExpression},`:t.databaseEngine&&(n+=`
9
+ databaseEngine: ${a(t.databaseEngine)},`),n+=$(t),n+=R(t),n+=h(t),n+=D(t),n+=S(t.extraProperties),t.alarms===!1?n+=`
10
+ alarms: false,`:typeof t.alarms=="object"&&(n+=`
11
+ alarms: ${f(t.alarms," ")},`),t.type!=="GlobalAurora"&&(n+=b()),n+=`
13
12
  })
14
13
  );
15
- `}return n}export{u as CREDENTIAL_KEYS,s as DATABASE_ENV_VARS,P as buildDatabaseEnvVars,b as databaseNeedsVariable,x as formatConnectionsCode,h as generateDatabaseCode,S as generateDatabaseEnvVarEntries,A as getConnectedDatabases};
14
+ `}return n}function O(e){if(!e.clickhouse||e.clickhouse.length===0)return"";let n="";for(let r=0;r<e.clickhouse.length;r++){const t=e.clickhouse[r],l=d(t),s=N(t,e),i=r>0?`
15
+ `:"",u=s?`const ${l} = `:"";n+=`${i}${u}app.addDatabase(
16
+ DatabaseFactory.build(${a(t.name)}, {
17
+ type: "ClickHouse",
18
+ databaseName: ${a(t.databaseName)},`,t.instanceType!==void 0&&(n+=`
19
+ instanceType: ${a(t.instanceType)},`),t.coldTier!==void 0&&(n+=`
20
+ coldTier: ${f(t.coldTier," ")},`),t.optimiseSchedule!==void 0&&(n+=`
21
+ optimiseSchedule: ${f(t.optimiseSchedule," ")},`),t.backupSchedule!==void 0&&(n+=`
22
+ backupSchedule: ${f(t.backupSchedule," ")},`),t.backupRetentionDays!==void 0&&(n+=`
23
+ backupRetentionDays: ${t.backupRetentionDays},`),n+=S(t.extraProperties),n+=`
24
+ })
25
+ );
26
+ `}return n}function N(e,n){return n.compute.some(r=>r.connectedDatabase?.includes(e.name))}export{p as CREDENTIAL_KEYS,c as DATABASE_ENV_VARS,I as buildDatabaseEnvVars,x as databaseNeedsVariable,k as formatConnectionsCode,O as generateClickHouseCode,C as generateDatabaseCode,m as generateDatabaseEnvVarEntries,y as getConnectedDatabases,E as toDatabaseEnvVarValue};
@@ -5,7 +5,7 @@
5
5
  * infrastructure code from resource plans.
6
6
  */
7
7
  export { type IdentifierValue, type ExpressionValue, type CallValue, type SpecialValue, isSpecialValue, toPascalCase, toKebab, toValidDatabaseName, toVariableName, formatValue, buildProperty, getVariableName, resolveResourceVariable, emitExtraProperties, } from "./common.js";
8
- export { DATABASE_ENV_VARS, CREDENTIAL_KEYS, type DatabaseEnvVarEntry, type DatabaseEnvVars, getConnectedDatabases, generateDatabaseEnvVarEntries, formatConnectionsCode, buildDatabaseEnvVars, databaseNeedsVariable, generateDatabaseCode, } from "./database.js";
8
+ export { DATABASE_ENV_VARS, CREDENTIAL_KEYS, type DatabaseEnvVarEntry, type DatabaseEnvVars, getConnectedDatabases, generateDatabaseEnvVarEntries, formatConnectionsCode, buildDatabaseEnvVars, databaseNeedsVariable, generateDatabaseCode, generateClickHouseCode, } from "./database.js";
9
9
  export { STORAGE_ENV_VARS, type StorageEnvVarEntry, type StorageEnvVars, getConnectedStorage, generateStorageEnvVarEntries, buildStorageEnvVars, formatAllConnectionsCode, } from "./storageConnections.js";
10
10
  export { MESSAGING_ENV_VARS, type MessagingEnvVarEntry, type MessagingEnvVars, getConnectedMessaging, generateMessagingEnvVarEntries, buildMessagingEnvVars, } from "./messagingConnections.js";
11
11
  export { generateLambdaCode, generateLambdaConnectionsCode, generateEc2Code, generateEcsCode, generateComputeCode, } from "./compute.js";
@@ -1 +1 @@
1
- import{isSpecialValue as t,toPascalCase as r,toKebab as o,toValidDatabaseName as n,toVariableName as s,formatValue as g,buildProperty as d,getVariableName as i,resolveResourceVariable as C,emitExtraProperties as m}from"./common.js";import{DATABASE_ENV_VARS as V,CREDENTIAL_KEYS as b,getConnectedDatabases as l,generateDatabaseEnvVarEntries as c,formatConnectionsCode as p,buildDatabaseEnvVars as S,databaseNeedsVariable as N,generateDatabaseCode as A}from"./database.js";import{STORAGE_ENV_VARS as u,getConnectedStorage as D,generateStorageEnvVarEntries as x,buildStorageEnvVars as R,formatAllConnectionsCode as v}from"./storageConnections.js";import{MESSAGING_ENV_VARS as P,getConnectedMessaging as I,generateMessagingEnvVarEntries as M,buildMessagingEnvVars as T}from"./messagingConnections.js";import{generateLambdaCode as L,generateLambdaConnectionsCode as h,generateEc2Code as y,generateEcsCode as B,generateComputeCode as K}from"./compute.js";import{generateS3Code as q,generateDynamoDBCode as w,generateSQSCode as O,s3NeedsVariable as Q,sqsNeedsVariable as W}from"./storage.js";import{generateNetworkCode as j,generateTags as z,generateAppInit as F,generateImports as H,generateCDNCode as J,collectCdnReferencedResources as U,usesPatternApproach as X,generatePatternCodeWithComments as Z}from"./infrastructure.js";export{b as CREDENTIAL_KEYS,V as DATABASE_ENV_VARS,P as MESSAGING_ENV_VARS,u as STORAGE_ENV_VARS,S as buildDatabaseEnvVars,T as buildMessagingEnvVars,d as buildProperty,R as buildStorageEnvVars,U as collectCdnReferencedResources,N as databaseNeedsVariable,m as emitExtraProperties,v as formatAllConnectionsCode,p as formatConnectionsCode,g as formatValue,F as generateAppInit,J as generateCDNCode,K as generateComputeCode,A as generateDatabaseCode,c as generateDatabaseEnvVarEntries,w as generateDynamoDBCode,y as generateEc2Code,B as generateEcsCode,H as generateImports,L as generateLambdaCode,h as generateLambdaConnectionsCode,M as generateMessagingEnvVarEntries,j as generateNetworkCode,Z as generatePatternCodeWithComments,q as generateS3Code,O as generateSQSCode,x as generateStorageEnvVarEntries,z as generateTags,l as getConnectedDatabases,I as getConnectedMessaging,D as getConnectedStorage,i as getVariableName,t as isSpecialValue,C as resolveResourceVariable,Q as s3NeedsVariable,W as sqsNeedsVariable,o as toKebab,r as toPascalCase,n as toValidDatabaseName,s as toVariableName,X as usesPatternApproach};
1
+ import{isSpecialValue as t,toPascalCase as r,toKebab as o,toValidDatabaseName as n,toVariableName as s,formatValue as g,buildProperty as d,getVariableName as C,resolveResourceVariable as i,emitExtraProperties as l}from"./common.js";import{DATABASE_ENV_VARS as E,CREDENTIAL_KEYS as V,getConnectedDatabases as b,generateDatabaseEnvVarEntries as c,formatConnectionsCode as p,buildDatabaseEnvVars as S,databaseNeedsVariable as N,generateDatabaseCode as A,generateClickHouseCode as f}from"./database.js";import{STORAGE_ENV_VARS as D,getConnectedStorage as x,generateStorageEnvVarEntries as R,buildStorageEnvVars as v,formatAllConnectionsCode as _}from"./storageConnections.js";import{MESSAGING_ENV_VARS as I,getConnectedMessaging as M,generateMessagingEnvVarEntries as T,buildMessagingEnvVars as G}from"./messagingConnections.js";import{generateLambdaCode as h,generateLambdaConnectionsCode as k,generateEc2Code as y,generateEcsCode as B,generateComputeCode as K}from"./compute.js";import{generateS3Code as w,generateDynamoDBCode as H,generateSQSCode as O,s3NeedsVariable as Q,sqsNeedsVariable as W}from"./storage.js";import{generateNetworkCode as j,generateTags as z,generateAppInit as F,generateImports as J,generateCDNCode as U,collectCdnReferencedResources as X,usesPatternApproach as Z,generatePatternCodeWithComments as $}from"./infrastructure.js";export{V as CREDENTIAL_KEYS,E as DATABASE_ENV_VARS,I as MESSAGING_ENV_VARS,D as STORAGE_ENV_VARS,S as buildDatabaseEnvVars,G as buildMessagingEnvVars,d as buildProperty,v as buildStorageEnvVars,X as collectCdnReferencedResources,N as databaseNeedsVariable,l as emitExtraProperties,_ as formatAllConnectionsCode,p as formatConnectionsCode,g as formatValue,F as generateAppInit,U as generateCDNCode,f as generateClickHouseCode,K as generateComputeCode,A as generateDatabaseCode,c as generateDatabaseEnvVarEntries,H as generateDynamoDBCode,y as generateEc2Code,B as generateEcsCode,J as generateImports,h as generateLambdaCode,k as generateLambdaConnectionsCode,T as generateMessagingEnvVarEntries,j as generateNetworkCode,$ as generatePatternCodeWithComments,w as generateS3Code,O as generateSQSCode,R as generateStorageEnvVarEntries,z as generateTags,b as getConnectedDatabases,M as getConnectedMessaging,x as getConnectedStorage,C as getVariableName,t as isSpecialValue,i as resolveResourceVariable,Q as s3NeedsVariable,W as sqsNeedsVariable,o as toKebab,r as toPascalCase,n as toValidDatabaseName,s as toVariableName,Z as usesPatternApproach};
@@ -1,4 +1,4 @@
1
- import{toVariableName as m,formatValue as a,resolveResourceVariable as f,emitExtraProperties as g}from"./common.js";import{COMPUTE_TYPE as d}from"../schemas/constants.js";import{OPENNEXT_DEFAULTS as O,generatePatternCodeWithComments as P}from"./generatePatternCode.js";const u="fjall:costAllocation:owner",h="engineering";function l(e){return typeof e=="object"&&e!==null&&Object.keys(e).length===0}function p(e){const t={...e};return l(t.flowLogs)&&delete t.flowLogs,t}function A(e){if(!e.additionalNetworks||e.additionalNetworks.length===0)return"";let t="";for(const n of e.additionalNetworks){const i=m(n.name),o={};n.maxAzs!==void 0&&(o.maxAzs=n.maxAzs),n.natGateways!==void 0&&(o.natGateways=n.natGateways),n.flowLogs!==void 0&&(o.flowLogs=n.flowLogs),n.vpcEndpoints!==void 0&&(o.vpcEndpoints=n.vpcEndpoints);const c=p(o);t+=`const ${i} = app.addNetwork(
1
+ import{toVariableName as p,formatValue as a,resolveResourceVariable as f,emitExtraProperties as g}from"./common.js";import{COMPUTE_TYPE as d}from"../schemas/constants.js";import{OPENNEXT_DEFAULTS as O,generatePatternCodeWithComments as P}from"./generatePatternCode.js";const u="fjall:costAllocation:owner",h="engineering";function l(e){return typeof e=="object"&&e!==null&&Object.keys(e).length===0}function m(e){const t={...e};return l(t.flowLogs)&&delete t.flowLogs,t}function A(e){if(!e.additionalNetworks||e.additionalNetworks.length===0)return"";let t="";for(const n of e.additionalNetworks){const i=p(n.name),o={};n.maxAzs!==void 0&&(o.maxAzs=n.maxAzs),n.natGateways!==void 0&&(o.natGateways=n.natGateways),n.flowLogs!==void 0&&(o.flowLogs=n.flowLogs),n.vpcEndpoints!==void 0&&(o.vpcEndpoints=n.vpcEndpoints);const c=m(o);t+=`const ${i} = app.addNetwork(
2
2
  NetworkFactory.build("${n.name}", ${a(c," ")})
3
3
  );
4
4
 
@@ -7,21 +7,21 @@ ${Object.entries(t).map(([i,o])=>` "${i}": "${o}"`).join(`,
7
7
  `)}
8
8
  });
9
9
 
10
- `}function w(e){let t=`
10
+ `}function k(e){let t=`
11
11
  const appName = "${e.appName}";
12
12
  `;const n=e.backup&&typeof e.backup=="object"?e.backup:void 0,i=e.tunnel&&typeof e.tunnel=="object"?e.tunnel:void 0,o=i?i.instanceType?`tunnel: { instanceType: "${i.instanceType}" }`:"tunnel: true":void 0;if(e.vpcId)t+=`const app = App.getApp(appName, {
13
13
  network: { useExisting: "${e.vpcId}" }`,n&&(t+=`,
14
14
  backup: { tier: "${n.tier}" }`),o&&(t+=`,
15
15
  ${o}`),t+=`
16
16
  });
17
- `;else if(e.network){const c=p(e.network);t+=`const app = App.getApp(appName, {
17
+ `;else if(e.network){const c=m(e.network);t+=`const app = App.getApp(appName, {
18
18
  network: ${a(c," ")}`,n&&(t+=`,
19
19
  backup: { tier: "${n.tier}" }`),o&&(t+=`,
20
20
  ${o}`),t+=`
21
21
  });
22
22
  `}else t+="const app = App.getApp(appName, { network: false",n&&(t+=`, backup: { tier: "${n.tier}" }`),o&&(t+=`, ${o}`),t+=` });
23
23
  `;return t+=`
24
- `,t}function k(e){const t=[];if(e.patternConfig?t.push("PatternFactory"):(e.database.length>0&&t.push("DatabaseFactory"),e.s3.length>0&&t.push("StorageFactory"),e.compute.length>0&&t.push("ComputeFactory"),(e.compute.length>0||e.database.length>0)&&t.push("getConfig"),e.dynamodb&&e.dynamodb.length>0&&e.database.length===0&&t.push("DatabaseFactory"),e.sqs&&e.sqs.length>0&&t.push("MessagingFactory"),e.cdn&&t.push("CdnFactory"),e.compute.some(r=>r.type===d.LAMBDA&&r.deployment==="code")&&(t.push("Code"),t.push("Runtime")),e.compute.some(r=>r.type===d.LAMBDA&&r.functionUrl)&&t.push("FunctionUrlAuthType"),e.compute.some(r=>r.type===d.LAMBDA&&(r.architecture||r.deployment==="container"))&&t.push("Architecture")),e.additionalNetworks&&e.additionalNetworks.length>0&&t.push("NetworkFactory"),e.additionalManagedImports){for(const o of e.additionalManagedImports)if(o.moduleSpecifier==="@fjall/components-infrastructure"||o.moduleSpecifier==="@fjall/infrastructure")for(const c of o.namedImports)t.includes(c)||t.push(c)}let i=`#!/usr/bin/env node
24
+ `,t}function w(e){const t=[];if(e.patternConfig?t.push("PatternFactory"):(e.database.length>0&&t.push("DatabaseFactory"),e.s3.length>0&&t.push("StorageFactory"),e.compute.length>0&&t.push("ComputeFactory"),(e.compute.length>0||e.database.length>0)&&t.push("getConfig"),e.dynamodb&&e.dynamodb.length>0&&e.database.length===0&&t.push("DatabaseFactory"),e.clickhouse&&e.clickhouse.length>0&&e.database.length===0&&!(e.dynamodb&&e.dynamodb.length>0)&&t.push("DatabaseFactory"),e.sqs&&e.sqs.length>0&&t.push("MessagingFactory"),e.cdn&&t.push("CdnFactory"),e.compute.some(r=>r.type===d.LAMBDA&&r.deployment==="code")&&(t.push("Code"),t.push("Runtime")),e.compute.some(r=>r.type===d.LAMBDA&&r.functionUrl)&&t.push("FunctionUrlAuthType"),e.compute.some(r=>r.type===d.LAMBDA&&(r.architecture||r.deployment==="container"))&&t.push("Architecture")),e.additionalNetworks&&e.additionalNetworks.length>0&&t.push("NetworkFactory"),e.additionalManagedImports){for(const o of e.additionalManagedImports)if(o.moduleSpecifier==="@fjall/components-infrastructure"||o.moduleSpecifier==="@fjall/infrastructure")for(const c of o.namedImports)t.includes(c)||t.push(c)}let i=`#!/usr/bin/env node
25
25
 
26
26
  import { App${t.length>0?`, ${t.join(", ")}`:""} } from "@fjall/components-infrastructure";
27
27
  `;if(e.additionalManagedImports)for(const o of e.additionalManagedImports){if(o.moduleSpecifier==="@fjall/components-infrastructure"||o.moduleSpecifier==="@fjall/infrastructure")continue;const c=o.namedImports.length>0?`{ ${o.namedImports.join(", ")} }`:"",r=[o.defaultImport??"",c].filter(Boolean).join(", ");r&&(i+=`import ${r} from "${o.moduleSpecifier}";
@@ -44,4 +44,4 @@ app.addCdn(
44
44
  accessGate: ${a(e.cdn.accessGate," ")}`),n+=g(e.cdn.extraProperties),n+=`
45
45
  })
46
46
  );
47
- `,n}function N(e){const t=new Set;if(e.cdn&&(e.cdn.defaultOriginRef&&t.add(e.cdn.defaultOriginRef),e.cdn.behaviours))for(const n of e.cdn.behaviours)t.add(n.originRef);return t}function j(e){return e.patternConfig!==void 0}export{u as COST_ALLOCATION_TAG,h as DEFAULT_COST_ALLOCATION_OWNER,O as OPENNEXT_DEFAULTS,N as collectCdnReferencedResources,w as generateAppInit,C as generateCDNCode,k as generateImports,A as generateNetworkCode,P as generatePatternCodeWithComments,$ as generateTags,j as usesPatternApproach};
47
+ `,n}function N(e){const t=new Set;if(e.cdn&&(e.cdn.defaultOriginRef&&t.add(e.cdn.defaultOriginRef),e.cdn.behaviours))for(const n of e.cdn.behaviours)t.add(n.originRef);return t}function j(e){return e.patternConfig!==void 0}export{u as COST_ALLOCATION_TAG,h as DEFAULT_COST_ALLOCATION_OWNER,O as OPENNEXT_DEFAULTS,N as collectCdnReferencedResources,k as generateAppInit,C as generateCDNCode,w as generateImports,A as generateNetworkCode,P as generatePatternCodeWithComments,$ as generateTags,j as usesPatternApproach};
@@ -1,49 +1,49 @@
1
- import{buildProperty as o,getVariableName as d,emitExtraProperties as c}from"./common.js";function f(e){let t="";return t+=o(e.bucketName!==void 0,"bucketName",e.bucketName,"string"),t+=o(e.stackPlacement!==void 0&&e.stackPlacement!=="storage","stackPlacement",e.stackPlacement,"string"),t+=o(e.publicReadAccess===!0,"publicReadAccess",!0),t+=o(e.websiteHosting!==void 0,"websiteHosting",e.websiteHosting,"object"),t+=o(e.backupVaultTier!==void 0,"backupVaultTier",e.backupVaultTier,"string"),t+=o(e.versioned!==void 0,"versioned",e.versioned),t+=o(e.encryption!==void 0,"encryption",e.encryption,"string"),t+=o(e.kmsKeyArn!==void 0,"kmsKeyArn",e.kmsKeyArn,"string"),t+=o(e.cors!==void 0&&e.cors.length>0,"cors",e.cors,"object"),t+=o(e.deployment!==void 0,"deployment",e.deployment,"object"),t+=o(e.retain===!0,"retain",!0),t}function p(e,t){return!!(t.compute.some(r=>r.connectedStorage?.includes(e.name))||t.cdn&&(t.cdn.defaultOriginRef===e.name||t.cdn.behaviours?.some(r=>r.originRef===e.name)))}function b(e){if(e.s3.length===0)return"";let t="";for(let n=0;n<e.s3.length;n++){const r=e.s3[n],a=d(r),i=p(r,e),u=e.database.length>0||n>0?`
2
- `:"",m=f(r),y=i?`const ${a} = `:"",l=c(r.extraProperties);m||l?t+=`${u}${y}app.addStorage(
3
- StorageFactory.build("${r.name}", {${m}${l}
1
+ import{buildProperty as o,getVariableName as c,emitExtraProperties as u,escapeStringLiteral as r}from"./common.js";function p(e){let t="";return t+=o(e.bucketName!==void 0,"bucketName",e.bucketName,"string"),t+=o(e.stackPlacement!==void 0&&e.stackPlacement!=="storage","stackPlacement",e.stackPlacement,"string"),t+=o(e.publicReadAccess===!0,"publicReadAccess",!0),t+=o(e.websiteHosting!==void 0,"websiteHosting",e.websiteHosting,"object"),t+=o(e.backupVaultTier!==void 0,"backupVaultTier",e.backupVaultTier,"string"),t+=o(e.versioned!==void 0,"versioned",e.versioned),t+=o(e.encryption!==void 0,"encryption",e.encryption,"string"),t+=o(e.kmsKeyArn!==void 0,"kmsKeyArn",e.kmsKeyArn,"string"),t+=o(e.cors!==void 0&&e.cors.length>0,"cors",e.cors,"object"),t+=o(e.deployment!==void 0,"deployment",e.deployment,"object"),t+=o(e.retain===!0,"retain",!0),t}function g(e,t){return!!(t.compute.some(i=>i.connectedStorage?.includes(e.name))||t.cdn&&(t.cdn.defaultOriginRef===e.name||t.cdn.behaviours?.some(i=>i.originRef===e.name)))}function x(e){if(e.s3.length===0)return"";let t="";for(let n=0;n<e.s3.length;n++){const i=e.s3[n],s=c(i),a=g(i,e),m=e.database.length>0||n>0?`
2
+ `:"",l=p(i),y=a?`const ${s} = `:"",f=u(i.extraProperties);l||f?t+=`${m}${y}app.addStorage(
3
+ StorageFactory.build(${r(i.name)}, {${l}${f}
4
4
  })
5
5
  );
6
- `:t+=`${u}${y}app.addStorage(
7
- StorageFactory.build("${r.name}", {})
6
+ `:t+=`${m}${y}app.addStorage(
7
+ StorageFactory.build(${r(i.name)}, {})
8
8
  );
9
- `}return t}function x(e){if(!e.dynamodb||e.dynamodb.length===0)return"";let t="";for(const n of e.dynamodb){const r=d(n);if(t+=`
10
- const ${r} = app.addDatabase(
11
- DatabaseFactory.build("${n.name}", {
9
+ `}return t}function K(e){if(!e.dynamodb||e.dynamodb.length===0)return"";let t="";for(const n of e.dynamodb){const i=c(n);if(t+=`
10
+ const ${i} = app.addDatabase(
11
+ DatabaseFactory.build(${r(n.name)}, {
12
12
  type: "DynamoDB",
13
13
  partitionKey: {
14
- name: "${n.partitionKey.name}",
15
- type: "${n.partitionKey.type}",
14
+ name: ${r(n.partitionKey.name)},
15
+ type: ${r(n.partitionKey.type)},
16
16
  }`,n.sortKey&&(t+=`,
17
17
  sortKey: {
18
- name: "${n.sortKey.name}",
19
- type: "${n.sortKey.type}",
20
- }`),n.globalSecondaryIndexes&&n.globalSecondaryIndexes.length>0){const a=n.globalSecondaryIndexes.map(i=>{let s=`{
21
- indexName: "${i.indexName}",
18
+ name: ${r(n.sortKey.name)},
19
+ type: ${r(n.sortKey.type)},
20
+ }`),n.globalSecondaryIndexes&&n.globalSecondaryIndexes.length>0){const s=n.globalSecondaryIndexes.map(a=>{let d=`{
21
+ indexName: ${r(a.indexName)},
22
22
  partitionKey: {
23
- name: "${i.partitionKey.name}",
24
- type: "${i.partitionKey.type}",
25
- },`;return i.sortKey&&(s+=`
23
+ name: ${r(a.partitionKey.name)},
24
+ type: ${r(a.partitionKey.type)},
25
+ },`;return a.sortKey&&(d+=`
26
26
  sortKey: {
27
- name: "${i.sortKey.name}",
28
- type: "${i.sortKey.type}",
29
- },`),s+=`
30
- }`,s}).join(`,
27
+ name: ${r(a.sortKey.name)},
28
+ type: ${r(a.sortKey.type)},
29
+ },`),d+=`
30
+ }`,d}).join(`,
31
31
  `);t+=`,
32
32
  globalSecondaryIndexes: [
33
- ${a}
33
+ ${s}
34
34
  ]`}n.ttlAttribute&&(t+=`,
35
- ttlAttribute: "${n.ttlAttribute}"`),n.stream&&(t+=`,
36
- stream: true`),t+=c(n.extraProperties),t+=`
35
+ ttlAttribute: ${r(n.ttlAttribute)}`),n.stream&&(t+=`,
36
+ stream: true`),t+=u(n.extraProperties),t+=`
37
37
  })
38
38
  );
39
- `}return t}function g(e,t){return t.compute.some(n=>n.connectedMessaging?.includes(e.name))}function K(e){if(!e.sqs||e.sqs.length===0)return"";let t="";for(const n of e.sqs){const r=d(n),i=g(n,e)?`const ${r} = `:"";t+=`
40
- ${i}app.addMessaging(
41
- MessagingFactory.build("${n.name}", {
39
+ `}return t}function $(e,t){return t.compute.some(n=>n.connectedMessaging?.includes(e.name))}function S(e){if(!e.sqs||e.sqs.length===0)return"";let t="";for(const n of e.sqs){const i=c(n),a=$(n,e)?`const ${i} = `:"";t+=`
40
+ ${a}app.addMessaging(
41
+ MessagingFactory.build(${r(n.name)}, {
42
42
  type: "queue",
43
- queueType: "${n.queueType}"`,n.visibilityTimeout!==void 0&&(t+=`,
43
+ queueType: ${r(n.queueType)}`,n.visibilityTimeout!==void 0&&(t+=`,
44
44
  visibilityTimeout: ${n.visibilityTimeout}`),n.retentionPeriod!==void 0&&(t+=`,
45
45
  messageRetentionPeriod: ${n.retentionPeriod}`),n.contentBasedDeduplication&&(t+=`,
46
- contentBasedDeduplication: true`),t+=c(n.extraProperties),t+=`
46
+ contentBasedDeduplication: true`),t+=u(n.extraProperties),t+=`
47
47
  })
48
48
  );
49
- `}return t}export{x as generateDynamoDBCode,b as generateS3Code,K as generateSQSCode,p as s3NeedsVariable,g as sqsNeedsVariable};
49
+ `}return t}export{K as generateDynamoDBCode,x as generateS3Code,S as generateSQSCode,g as s3NeedsVariable,$ as sqsNeedsVariable};
@@ -1,6 +1,6 @@
1
1
  export { normaliseError, getErrorMessage } from "./util/errorUtils.js";
2
2
  export { type Result, isSuccess, isFailure, success, failure, tryAsync, trySync, } from "./types/Result.js";
3
- export { VALIDATION_PATTERNS, VALIDATION_MESSAGES, type ValidationPatternKey, type ValidationMessageKey, } from "./validation/patterns.js";
3
+ export { VALIDATION_PATTERNS, VALIDATION_MESSAGES, parseRateExpression, type ValidationPatternKey, type ValidationMessageKey, } from "./validation/patterns.js";
4
4
  export { type RegionInfo, DEFAULT_REGION, regions, AWS_REGIONS_METADATA, topRegions, commonRegions, parseRegionList, isValidRegion, isValidRegionFormat, getSuggestions, validateRegion, validateRegionList, filterDuplicateRegions, getRegionOptions, getRegionOptionsExcluding, getRegionName, createRegionFormatter, } from "./aws/regions.js";
5
5
  export { GENERATOR_VERSION } from "./version.js";
6
6
  export * from "./schemas/index.js";
package/dist/src/index.js CHANGED
@@ -1 +1 @@
1
- import{normaliseError as r,getErrorMessage as i}from"./util/errorUtils.js";import{isSuccess as s,isFailure as g,success as n,failure as R,tryAsync as m,trySync as a}from"./types/Result.js";import{VALIDATION_PATTERNS as f,VALIDATION_MESSAGES as A}from"./validation/patterns.js";import{DEFAULT_REGION as x,regions as c,AWS_REGIONS_METADATA as l,topRegions as S,commonRegions as N,parseRegionList as O,isValidRegion as T,isValidRegionFormat as u,getSuggestions as I,validateRegion as _,validateRegionList as d,filterDuplicateRegions as D,getRegionOptions as L,getRegionOptionsExcluding as V,getRegionName as y,createRegionFormatter as F}from"./aws/regions.js";import{GENERATOR_VERSION as M}from"./version.js";export*from"./schemas/index.js";export*from"./generation/index.js";export*from"./presets/index.js";export*from"./ast/index.js";export*from"./planning/index.js";export*from"./dns/index.js";export{l as AWS_REGIONS_METADATA,x as DEFAULT_REGION,M as GENERATOR_VERSION,A as VALIDATION_MESSAGES,f as VALIDATION_PATTERNS,N as commonRegions,F as createRegionFormatter,R as failure,D as filterDuplicateRegions,i as getErrorMessage,y as getRegionName,L as getRegionOptions,V as getRegionOptionsExcluding,I as getSuggestions,g as isFailure,s as isSuccess,T as isValidRegion,u as isValidRegionFormat,r as normaliseError,O as parseRegionList,c as regions,n as success,S as topRegions,m as tryAsync,a as trySync,_ as validateRegion,d as validateRegionList};
1
+ import{normaliseError as r,getErrorMessage as i}from"./util/errorUtils.js";import{isSuccess as s,isFailure as g,success as n,failure as R,tryAsync as a,trySync as p}from"./types/Result.js";import{VALIDATION_PATTERNS as E,VALIDATION_MESSAGES as f,parseRateExpression as x}from"./validation/patterns.js";import{DEFAULT_REGION as c,regions as l,AWS_REGIONS_METADATA as S,topRegions as N,commonRegions as O,parseRegionList as T,isValidRegion as u,isValidRegionFormat as I,getSuggestions as _,validateRegion as d,validateRegionList as D,filterDuplicateRegions as L,getRegionOptions as V,getRegionOptionsExcluding as y,getRegionName as F,createRegionFormatter as G}from"./aws/regions.js";import{GENERATOR_VERSION as v}from"./version.js";export*from"./schemas/index.js";export*from"./generation/index.js";export*from"./presets/index.js";export*from"./ast/index.js";export*from"./planning/index.js";export*from"./dns/index.js";export{S as AWS_REGIONS_METADATA,c as DEFAULT_REGION,v as GENERATOR_VERSION,f as VALIDATION_MESSAGES,E as VALIDATION_PATTERNS,O as commonRegions,G as createRegionFormatter,R as failure,L as filterDuplicateRegions,i as getErrorMessage,F as getRegionName,V as getRegionOptions,y as getRegionOptionsExcluding,_ as getSuggestions,g as isFailure,s as isSuccess,u as isValidRegion,I as isValidRegionFormat,r as normaliseError,x as parseRateExpression,T as parseRegionList,l as regions,n as success,N as topRegions,a as tryAsync,p as trySync,d as validateRegion,D as validateRegionList};
@@ -1,4 +1,5 @@
1
- export { planApplicationResources, type OpenNextResourceOptions, planOpenNextResources, type GenerationOptions, generateInfrastructureFromPlan, } from "./resourcePlanning.js";
1
+ export { planApplicationResources, type GenerationOptions, generateInfrastructureFromPlan, } from "./resourcePlanning.js";
2
+ export { type OpenNextResourceOptions, planOpenNextResources, } from "./openNextPlanning.js";
2
3
  export { type ConnectionType, applyComputeConnections, applyServiceConnections, } from "./resourceConnections.js";
3
4
  export { type AddableResourceType, type AddResourceOptions, type DatabaseAddOptions, type ProxyAddOptions, type S3AddOptions, type NetworkAddOptions, type EcsComputeAddOptions, type LambdaComputeAddOptions, type CdnAddOptions, type TunnelAddOptions, addResourceToPlan, validateResourceAddition, listAvailableResources, } from "./resourceAddition.js";
4
5
  export { type ResourceChangeResult, generateResourceChange, } from "./generateResourceChange.js";
@@ -1 +1 @@
1
- import{planApplicationResources as r,planOpenNextResources as n,generateInfrastructureFromPlan as a}from"./resourcePlanning.js";import{applyComputeConnections as p,applyServiceConnections as s}from"./resourceConnections.js";import{addResourceToPlan as l,validateResourceAddition as i,listAvailableResources as u}from"./resourceAddition.js";import{generateResourceChange as R}from"./generateResourceChange.js";export{l as addResourceToPlan,p as applyComputeConnections,s as applyServiceConnections,a as generateInfrastructureFromPlan,R as generateResourceChange,u as listAvailableResources,r as planApplicationResources,n as planOpenNextResources,i as validateResourceAddition};
1
+ import{planApplicationResources as r,generateInfrastructureFromPlan as n}from"./resourcePlanning.js";import{planOpenNextResources as a}from"./openNextPlanning.js";import{applyComputeConnections as s,applyServiceConnections as c}from"./resourceConnections.js";import{addResourceToPlan as i,validateResourceAddition as u,listAvailableResources as m}from"./resourceAddition.js";import{generateResourceChange as x}from"./generateResourceChange.js";export{i as addResourceToPlan,s as applyComputeConnections,c as applyServiceConnections,n as generateInfrastructureFromPlan,x as generateResourceChange,m as listAvailableResources,r as planApplicationResources,a as planOpenNextResources,u as validateResourceAddition};
@@ -0,0 +1,38 @@
1
+ import { type PatternTypeWithCustom } from "../presets/patternTierPresets.js";
2
+ import type { PatternType } from "../schemas/constants.js";
3
+ import { type Result } from "../types/Result.js";
4
+ import type { ApplicationResourcePlan } from "../schemas/resourceSchemas.js";
5
+ export interface OpenNextResourceOptions {
6
+ /** Pattern tier: lightweight, standard, resilient, or custom */
7
+ tier?: PatternTypeWithCustom;
8
+ /** Custom domain (auto-creates certificate + DNS) */
9
+ domain?: string;
10
+ /** Database configuration (uses tier defaults if not specified) */
11
+ database?: {
12
+ type?: "Instance" | "Aurora";
13
+ instanceType?: string;
14
+ databaseName?: string;
15
+ publiclyAccessible?: boolean;
16
+ allowedIpCidr?: string;
17
+ backupRetention?: number;
18
+ deletionProtection?: boolean;
19
+ encryption?: {
20
+ useCMK: true;
21
+ } | false;
22
+ };
23
+ /** Compute (Lambda) configuration (uses tier defaults if not specified) */
24
+ compute?: {
25
+ memorySize?: number;
26
+ timeout?: number;
27
+ };
28
+ /** CDN configuration (advanced - prefer `domain` for simple setup) */
29
+ cdn?: {
30
+ domainNames?: string[];
31
+ certificateArn?: string;
32
+ };
33
+ /** Additional environment variables */
34
+ environment?: Record<string, string>;
35
+ /** Resource tags */
36
+ tags?: Record<string, string>;
37
+ }
38
+ export declare function planOpenNextResources(appName: string, pattern: PatternType, options?: OpenNextResourceOptions): Result<ApplicationResourcePlan, Error>;
@@ -0,0 +1 @@
1
+ import{getPatternTierPreset as b,isPatternTierName as C,PATTERN_TIER_NAMES as T}from"../presets/patternTierPresets.js";import{getNetworkPreset as P}from"../presets/tierPresets.js";import{success as l,failure as f}from"../types/Result.js";import{PatternConfigSchema as y}from"../schemas/resourceSchemas.js";const N=P("standard");function w(e){return y.options.some(n=>n.shape?.type?.value===e)}function $(e,n,c){const{tier:r="standard",domain:u,database:d,compute:a,cdn:p,environment:i,tags:m}=c??{},s=C(r);if(!s&&r!=="custom")return f(new Error(`Invalid pattern tier: "${r}". Valid tiers are: ${[...T,"custom"].join(", ")}`));if(!w(n))return f(new Error(`Unsupported pattern type: ${n}`));const t=s?b(r):null,o=R(n,e,{domain:u,database:d,compute:a,cdn:p,environment:i,tierPreset:t});if(!o.success)return o;const g=o.data;return l({appName:e,type:"standard",pattern:n,network:t?t.network:N,backup:t?t.backup:!1,patternConfig:g,database:[],s3:[],compute:[],tags:m??{}})}function k(e,n){return{type:e?.type??n.database.type,instanceType:e?.instanceType??n.database.instanceType,backupRetention:e?.backupRetention??n.database.backupRetention,deletionProtection:e?.deletionProtection??n.database.deletionProtection,...e?.databaseName!==void 0&&{databaseName:e.databaseName},...e?.publiclyAccessible!==void 0&&{publiclyAccessible:e.publiclyAccessible},...e?.allowedIpCidr!==void 0&&{allowedIpCidr:e.allowedIpCidr},...e?.encryption!==void 0&&{encryption:e.encryption}}}function A(e,n){return{memorySize:e?.memorySize??n.compute.memorySize,timeout:e?.timeout??n.compute.timeout}}function E(e){const{encryption:n,...c}=e;return{...c,...n&&{encryption:{storageKey:n}}}}function R(e,n,c){const{domain:r,database:u,compute:d,cdn:a,environment:p,tierPreset:i}=c,m=i?k(u,i):u,s=i?A(d,i):d,t={type:e,name:n,domain:r,database:m?E(m):void 0,compute:s?{server:s}:void 0,cdn:a?{domainNames:a.domainNames,certificateArn:a.certificateArn}:void 0,environment:p},o=y.safeParse(t);return o.success?l(o.data):f(new Error(`Invalid pattern config: ${o.error.message}`))}export{$ as planOpenNextResources};
@@ -99,7 +99,11 @@ export interface EcsComputeAddOptions {
99
99
  capacityProvider?: "FARGATE" | "FARGATE_SPOT" | "EC2";
100
100
  }>;
101
101
  readonly loadBalancer?: false | "public" | "internal";
102
- readonly dockerfilePath?: string;
102
+ readonly docker?: {
103
+ path?: string;
104
+ context?: string;
105
+ target?: string;
106
+ };
103
107
  readonly connectedDatabase?: string[];
104
108
  }
105
109
  export interface LambdaComputeAddOptions {
@@ -1 +1 @@
1
- import{success as d,failure as u}from"../types/Result.js";import{toPascalCase as l}from"../generation/common.js";import{applyComputeConnections as b,applyServiceConnections as o}from"./resourceConnections.js";function $(a){const e=a.database.length>0,n=a.cdn!==void 0;return[{type:"database",label:"Database (RDS)",available:!0},{type:"database:proxy",label:"RDS Proxy",available:e,reason:e?void 0:"Requires at least one database"},{type:"storage:s3",label:"S3 Bucket",available:!0},{type:"network",label:"Network (VPC)",available:!0},{type:"compute:ecs",label:"Compute (ECS)",available:!0},{type:"compute:lambda",label:"Compute (Lambda)",available:!0},{type:"cdn",label:"CDN (CloudFront)",available:!n,reason:n?"A CDN is already configured. Remove existing CDN first.":void 0},{type:"tunnel",label:"Database Tunnel",available:e&&!a.tunnel,reason:e?a.tunnel?"Tunnel is already enabled":void 0:"Requires at least one database"}]}function y(a,e){if(E(a,e.resourceName))return u(new Error(`Resource name '${e.resourceName}' is already used in this application.`));switch(e.type){case"database":return w(a,e);case"database:proxy":return g(a,e);case"storage:s3":return d(void 0);case"network":return d(void 0);case"compute:ecs":return!e.services||e.services.length===0?u(new Error("ECS compute requires at least one service.")):d(void 0);case"compute:lambda":return d(void 0);case"cdn":return v(a,e);case"tunnel":return h(a);default:return e}}function w(a,e){const n=e.databaseName??e.resourceName.toLowerCase();return a.database.some(t=>t.databaseName===n)?u(new Error(`Database name '${n}' already exists. Choose a different database name.`)):e.databaseType==="GlobalAurora"&&!e.primaryRegion?u(new Error("GlobalAurora databases require a primaryRegion.")):d(void 0)}function g(a,e){const n=a.database.find(r=>r.name===e.targetDatabase||r.databaseName===e.targetDatabase);if(!n){const r=a.database.map(t=>t.name).join(", ")||"none";return u(new Error(`Database '${e.targetDatabase}' not found. Available databases: ${r}`))}return n.proxy!==void 0&&n.proxy!==!1?u(new Error(`Database '${n.name}' already has RDS Proxy enabled.`)):d(void 0)}function v(a,e){if(a.cdn)return u(new Error("A CDN is already configured for this application. Remove the existing CDN first."));if(!m(a,e.defaultOriginRef))return u(new Error(`Origin '${e.defaultOriginRef}' not found in plan. CDN origin must reference an existing resource.`));if(e.behaviours){for(const n of e.behaviours)if(!m(a,n.originRef))return u(new Error(`Behaviour origin '${n.originRef}' not found in plan.`))}return d(void 0)}function h(a){return a.tunnel&&typeof a.tunnel=="object"?u(new Error("Tunnel is already enabled for this application.")):a.database.length===0?u(new Error("No databases found \u2014 tunnel requires at least one relational database.")):d(void 0)}function q(a,e){const n=y(a,e);if(!n.success)return n;switch(e.type){case"database":return C(a,e);case"database:proxy":return R(a,e);case"storage:s3":return x(a,e);case"network":return D(a,e);case"compute:ecs":return k(a,e);case"compute:lambda":return N(a,e);case"cdn":return A(a,e);case"tunnel":return T(a,e);default:return e}}function C(a,e){const n=e.databaseName??e.resourceName.toLowerCase(),r={name:e.resourceName,type:e.databaseType,databaseName:n};let t;switch(e.databaseType){case"Instance":t={...r,...e.instanceType!==void 0?{instanceType:e.instanceType}:{},...e.multiAz!==void 0?{multiAz:e.multiAz}:{},...e.readReplica!==void 0?{readReplica:e.readReplica}:{},...e.publiclyAccessible!==void 0?{publiclyAccessible:e.publiclyAccessible}:{},...e.backupRetention!==void 0?{backupRetention:e.backupRetention}:{}};break;case"Aurora":t={...r,...e.writer!==void 0?{writer:e.writer}:{},...e.readers!==void 0?{readers:e.readers}:{},...e.backupRetention!==void 0?{backupRetention:e.backupRetention}:{},...e.preferredMaintenanceWindow!==void 0?{preferredMaintenanceWindow:e.preferredMaintenanceWindow}:{}};break;case"GlobalAurora":t={...r,primaryRegion:e.primaryRegion,...e.secondaryRegions!==void 0?{secondaryRegions:e.secondaryRegions}:{}};break;default:{const i=e.databaseType;return u(new Error(`Unknown database type: ${String(i)}`))}}const c={...a,database:[...a.database,t]};return f(c,e.resourceName,"database",e),d(c)}function R(a,e){const n=a.database.map(c=>({...c})),r=n.find(c=>c.name===e.targetDatabase||c.databaseName===e.targetDatabase);if(!r)return u(new Error(`Database '${e.targetDatabase}' not found.`));const t={};return e.maxConnections!==void 0&&(t.maxConnections=e.maxConnections),e.maxIdleConnections!==void 0&&(t.maxIdleConnections=e.maxIdleConnections),e.connectionBorrowTimeout!==void 0&&(t.connectionBorrowTimeout=e.connectionBorrowTimeout),e.requireTLS!==void 0&&(t.requireTLS=e.requireTLS),r.proxy=Object.keys(t).length>0?t:{},d({...a,database:n})}function x(a,e){const n=e.bucketName??e.resourceName.toLowerCase(),r=l(n),t=a.s3.length,c=t===0?"":`${t+1}`,i={name:r,bucketName:n,variableName:`bucket${c}`,...e.publicReadAccess!==void 0?{publicReadAccess:e.publicReadAccess}:{},...e.versioned!==void 0?{versioned:e.versioned}:{},...e.encryption!==void 0?{encryption:e.encryption}:{},...e.websiteHosting?{websiteHosting:{indexDocument:"index.html"}}:{}},s={...a,s3:[...a.s3,i]};return f(s,r,"storage",e),d(s)}function D(a,e){const n={};if(e.maxAzs!==void 0&&(n.maxAzs=e.maxAzs),e.natGateways!==void 0&&(n.natGateways=e.natGateways),e.flowLogs!==void 0&&(n.flowLogs=e.flowLogs),e.vpcEndpoints!==void 0&&(n.vpcEndpoints=e.vpcEndpoints),e.networkName){const r={name:e.networkName,...n};return d({...a,additionalNetworks:[...a.additionalNetworks??[],r]})}return d({...a,network:{...a.network??{},...n}})}function k(a,e){const n=e.connectedDatabase??[],r={name:e.resourceName,type:"ecs",needsConnection:n.length>0,connectedDatabase:n,...e.loadBalancer!==void 0?{cluster:{loadBalancer:e.loadBalancer}}:{},services:e.services.map(t=>({name:t.name,capacityProvider:t.capacityProvider??"FARGATE",...t.port!==void 0?{containers:[{port:t.port}]}:{},...t.cpu!==void 0?{cpu:t.cpu}:{},...t.memory!==void 0?{memory:t.memory}:{}})),dockerfilePath:e.dockerfilePath};return d({...a,compute:[...a.compute,r]})}function N(a,e){const n=e.connectedDatabase??[],r={name:e.resourceName,type:"lambda",needsConnection:n.length>0,connectedDatabase:n,...e.timeout!==void 0?{timeout:e.timeout}:{},...e.memory!==void 0?{memory:e.memory}:{},...e.handler!==void 0?{handler:e.handler}:{},...e.runtime!==void 0?{runtime:e.runtime}:{}};return d({...a,compute:[...a.compute,r]})}function A(a,e){const n={name:e.resourceName,defaultOriginRef:e.defaultOriginRef,...e.customDomain!==void 0?{customDomain:e.customDomain}:{},...e.certificateArn!==void 0?{certificateArn:e.certificateArn}:{},...e.behaviours&&e.behaviours.length>0?{behaviours:[...e.behaviours].map(r=>({pathPattern:r.pathPattern,originRef:r.originRef,...r.cachePolicy!==void 0?{cachePolicy:r.cachePolicy}:{}}))}:{}};return d({...a,cdn:n})}function T(a,e){const n=e.instanceType?{instanceType:e.instanceType}:{};return d({...a,tunnel:n})}function E(a,e){const n=[...a.database.map(r=>r.name),...a.s3.map(r=>r.name),...a.compute.map(r=>r.name),...(a.dynamodb??[]).map(r=>r.name),...(a.sqs??[]).map(r=>r.name)];return a.cdn&&n.push(a.cdn.name),n.includes(e)}function m(a,e){return a.database.some(n=>n.name===e)||a.s3.some(n=>n.name===e)||a.compute.some(n=>n.name===e)||(a.dynamodb??[]).some(n=>n.name===e)||(a.sqs??[]).some(n=>n.name===e)}function f(a,e,n,r){r.connectToCompute&&r.connectToCompute.length>0&&b(a,[...r.connectToCompute],e,n),r.connectToServices&&r.connectToServices.length>0&&o(a,[...r.connectToServices],e,n)}export{q as addResourceToPlan,$ as listAvailableResources,y as validateResourceAddition};
1
+ import{success as d,failure as c}from"../types/Result.js";import{toPascalCase as o}from"../generation/common.js";import{applyComputeConnections as b,applyServiceConnections as l}from"./resourceConnections.js";function L(a){const e=a.database.length>0,n=a.cdn!==void 0;return[{type:"database",label:"Database (RDS)",available:!0},{type:"database:proxy",label:"RDS Proxy",available:e,reason:e?void 0:"Requires at least one database"},{type:"storage:s3",label:"S3 Bucket",available:!0},{type:"network",label:"Network (VPC)",available:!0},{type:"compute:ecs",label:"Compute (ECS)",available:!0},{type:"compute:lambda",label:"Compute (Lambda)",available:!0},{type:"cdn",label:"CDN (CloudFront)",available:!n,reason:n?"A CDN is already configured. Remove existing CDN first.":void 0},{type:"tunnel",label:"Database Tunnel",available:e&&!a.tunnel,reason:e?a.tunnel?"Tunnel is already enabled":void 0:"Requires at least one database"}]}function y(a,e){if(E(a,e.resourceName))return c(new Error(`Resource name '${e.resourceName}' is already used in this application.`));switch(e.type){case"database":return w(a,e);case"database:proxy":return g(a,e);case"storage:s3":return d(void 0);case"network":return d(void 0);case"compute:ecs":return!e.services||e.services.length===0?c(new Error("ECS compute requires at least one service.")):d(void 0);case"compute:lambda":return d(void 0);case"cdn":return v(a,e);case"tunnel":return C(a);default:{const n=e;return c(new Error(`Unknown resource type: ${String(n)}`))}}}function w(a,e){const n=e.databaseName??e.resourceName.toLowerCase();return a.database.some(t=>t.databaseName===n)?c(new Error(`Database name '${n}' already exists. Choose a different database name.`)):e.databaseType==="GlobalAurora"&&!e.primaryRegion?c(new Error("GlobalAurora databases require a primaryRegion.")):d(void 0)}function g(a,e){const n=a.database.find(r=>r.name===e.targetDatabase||r.databaseName===e.targetDatabase);if(!n){const r=a.database.map(t=>t.name).join(", ")||"none";return c(new Error(`Database '${e.targetDatabase}' not found. Available databases: ${r}`))}return n.proxy!==void 0&&n.proxy!==!1?c(new Error(`Database '${n.name}' already has RDS Proxy enabled.`)):d(void 0)}function v(a,e){if(a.cdn)return c(new Error("A CDN is already configured for this application. Remove the existing CDN first."));if(!m(a,e.defaultOriginRef))return c(new Error(`Origin '${e.defaultOriginRef}' not found in plan. CDN origin must reference an existing resource.`));if(e.behaviours){for(const n of e.behaviours)if(!m(a,n.originRef))return c(new Error(`Behaviour origin '${n.originRef}' not found in plan.`))}return d(void 0)}function C(a){return a.tunnel&&typeof a.tunnel=="object"?c(new Error("Tunnel is already enabled for this application.")):a.database.length===0?c(new Error("No databases found \u2014 tunnel requires at least one relational database.")):d(void 0)}function q(a,e){const n=y(a,e);if(!n.success)return n;switch(e.type){case"database":return h(a,e);case"database:proxy":return R(a,e);case"storage:s3":return x(a,e);case"network":return k(a,e);case"compute:ecs":return D(a,e);case"compute:lambda":return N(a,e);case"cdn":return A(a,e);case"tunnel":return T(a,e);default:{const r=e;return c(new Error(`Unknown resource type: ${String(r)}`))}}}function h(a,e){const n=e.databaseName??e.resourceName.toLowerCase(),r={name:e.resourceName,type:e.databaseType,databaseName:n};let t;switch(e.databaseType){case"Instance":t={...r,...e.instanceType!==void 0?{instanceType:e.instanceType}:{},...e.multiAz!==void 0?{multiAz:e.multiAz}:{},...e.readReplica!==void 0?{readReplica:e.readReplica}:{},...e.publiclyAccessible!==void 0?{publiclyAccessible:e.publiclyAccessible}:{},...e.backupRetention!==void 0?{backupRetention:e.backupRetention}:{}};break;case"Aurora":t={...r,...e.writer!==void 0?{writer:e.writer}:{},...e.readers!==void 0?{readers:e.readers}:{},...e.backupRetention!==void 0?{backupRetention:e.backupRetention}:{},...e.preferredMaintenanceWindow!==void 0?{preferredMaintenanceWindow:e.preferredMaintenanceWindow}:{}};break;case"GlobalAurora":t={...r,primaryRegion:e.primaryRegion,...e.secondaryRegions!==void 0?{secondaryRegions:e.secondaryRegions}:{}};break;default:{const i=e.databaseType;return c(new Error(`Unknown database type: ${String(i)}`))}}const u={...a,database:[...a.database,t]};return f(u,e.resourceName,"database",e),d(u)}function R(a,e){const n=a.database.map(u=>({...u})),r=n.find(u=>u.name===e.targetDatabase||u.databaseName===e.targetDatabase);if(!r)return c(new Error(`Database '${e.targetDatabase}' not found.`));const t={};return e.maxConnections!==void 0&&(t.maxConnections=e.maxConnections),e.maxIdleConnections!==void 0&&(t.maxIdleConnections=e.maxIdleConnections),e.connectionBorrowTimeout!==void 0&&(t.connectionBorrowTimeout=e.connectionBorrowTimeout),e.requireTLS!==void 0&&(t.requireTLS=e.requireTLS),r.proxy=Object.keys(t).length>0?t:{},d({...a,database:n})}function x(a,e){const n=e.bucketName??e.resourceName.toLowerCase(),r=o(n),t=a.s3.length,u=t===0?"":`${t+1}`,i={name:r,bucketName:n,variableName:`bucket${u}`,...e.publicReadAccess!==void 0?{publicReadAccess:e.publicReadAccess}:{},...e.versioned!==void 0?{versioned:e.versioned}:{},...e.encryption!==void 0?{encryption:e.encryption}:{},...e.websiteHosting?{websiteHosting:{indexDocument:"index.html"}}:{}},s={...a,s3:[...a.s3,i]};return f(s,r,"storage",e),d(s)}function k(a,e){const n={};if(e.maxAzs!==void 0&&(n.maxAzs=e.maxAzs),e.natGateways!==void 0&&(n.natGateways=e.natGateways),e.flowLogs!==void 0&&(n.flowLogs=e.flowLogs),e.vpcEndpoints!==void 0&&(n.vpcEndpoints=e.vpcEndpoints),e.networkName){const r={name:e.networkName,...n};return d({...a,additionalNetworks:[...a.additionalNetworks??[],r]})}return d({...a,network:{...a.network??{},...n}})}function D(a,e){const n=e.connectedDatabase??[],r={name:e.resourceName,type:"ecs",needsConnection:n.length>0,connectedDatabase:n,...e.loadBalancer!==void 0?{cluster:{loadBalancer:e.loadBalancer}}:{},services:e.services.map(t=>({name:t.name,capacityProvider:t.capacityProvider??"FARGATE",...t.port!==void 0?{containers:[{port:t.port}]}:{},...t.cpu!==void 0?{cpu:t.cpu}:{},...t.memory!==void 0?{memoryLimitMiB:t.memory}:{}})),...e.docker!==void 0&&{docker:e.docker}};return d({...a,compute:[...a.compute,r]})}function N(a,e){const n=e.connectedDatabase??[],r={name:e.resourceName,type:"lambda",needsConnection:n.length>0,connectedDatabase:n,...e.timeout!==void 0?{timeout:e.timeout}:{},...e.memory!==void 0?{memory:e.memory}:{},...e.handler!==void 0?{handler:e.handler}:{},...e.runtime!==void 0?{runtime:e.runtime}:{}};return d({...a,compute:[...a.compute,r]})}function A(a,e){const n={name:e.resourceName,defaultOriginRef:e.defaultOriginRef,...e.customDomain!==void 0?{customDomain:e.customDomain}:{},...e.certificateArn!==void 0?{certificateArn:e.certificateArn}:{},...e.behaviours&&e.behaviours.length>0?{behaviours:[...e.behaviours].map(r=>({pathPattern:r.pathPattern,originRef:r.originRef,...r.cachePolicy!==void 0?{cachePolicy:r.cachePolicy}:{}}))}:{}};return d({...a,cdn:n})}function T(a,e){const n=e.instanceType?{instanceType:e.instanceType}:{};return d({...a,tunnel:n})}function E(a,e){const n=[...a.database.map(r=>r.name),...a.s3.map(r=>r.name),...a.compute.map(r=>r.name),...(a.dynamodb??[]).map(r=>r.name),...(a.sqs??[]).map(r=>r.name)];return a.cdn&&n.push(a.cdn.name),n.includes(e)}function m(a,e){return a.database.some(n=>n.name===e)||a.s3.some(n=>n.name===e)||a.compute.some(n=>n.name===e)||(a.dynamodb??[]).some(n=>n.name===e)||(a.sqs??[]).some(n=>n.name===e)}function f(a,e,n,r){r.connectToCompute&&r.connectToCompute.length>0&&b(a,[...r.connectToCompute],e,n),r.connectToServices&&r.connectToServices.length>0&&l(a,[...r.connectToServices],e,n)}export{q as addResourceToPlan,L as listAvailableResources,y as validateResourceAddition};
@@ -1,56 +1,10 @@
1
1
  import { type UserServiceConfig, type AppType } from "../presets/tierPresets.js";
2
- import { type PatternTypeWithCustom } from "../presets/patternTierPresets.js";
3
- import { type PatternType } from "../schemas/constants.js";
4
2
  import { type Result } from "../types/Result.js";
5
3
  import type { ApplicationResourcePlan } from "../schemas/resourceSchemas.js";
6
4
  export declare function planApplicationResources(appName: string, appType: AppType, includeDatabase?: boolean, services?: UserServiceConfig[], snapshotOptions?: {
7
5
  snapshotIdentifier?: string;
8
6
  snapshotUsername?: string;
9
7
  }): ApplicationResourcePlan;
10
- export interface OpenNextResourceOptions {
11
- /** Pattern tier: lightweight, standard, resilient, or custom */
12
- tier?: PatternTypeWithCustom;
13
- /** Custom domain (auto-creates certificate + DNS) */
14
- domain?: string;
15
- /** Database configuration (uses tier defaults if not specified) */
16
- database?: {
17
- type?: "Instance" | "Aurora";
18
- instanceType?: string;
19
- databaseName?: string;
20
- publiclyAccessible?: boolean;
21
- allowedIpCidr?: string;
22
- backupRetention?: number;
23
- deletionProtection?: boolean;
24
- encryption?: {
25
- useCMK: true;
26
- } | false;
27
- };
28
- /** Compute (Lambda) configuration (uses tier defaults if not specified) */
29
- compute?: {
30
- memorySize?: number;
31
- timeout?: number;
32
- };
33
- /** CDN configuration (advanced - prefer `domain` for simple setup) */
34
- cdn?: {
35
- domainNames?: string[];
36
- certificateArn?: string;
37
- };
38
- /** Additional environment variables */
39
- environment?: Record<string, string>;
40
- /** Resource tags */
41
- tags?: Record<string, string>;
42
- }
43
- /**
44
- * Plan resources for OpenNext patterns (Next.js/Payload).
45
- *
46
- * All OpenNext patterns use the PatternFactory approach, generating a single
47
- * `PatternFactory.build()` call. The pattern class internally handles all
48
- * infrastructure (database, S3, DynamoDB, SQS, Lambdas, CDN).
49
- *
50
- * @example
51
- * const plan = planOpenNextResources("my-cms", "payload", { tier: "standard" });
52
- */
53
- export declare function planOpenNextResources(appName: string, pattern: PatternType, options?: OpenNextResourceOptions): Result<ApplicationResourcePlan, Error>;
54
8
  export interface GenerationOptions {
55
9
  /** Resource name mapping from old names to new names (for custom code repositioning) */
56
10
  resourceMapping?: Map<string, string>;
@@ -1 +1 @@
1
- import{TIER_PRESETS as P,getDefaultDatabaseTypeForTier as y,getNetworkPreset as k,applyTierDefaultsToServices as T}from"../presets/tierPresets.js";import{getPatternTierPreset as h,isPatternTierName as D}from"../presets/patternTierPresets.js";import{COMPUTE_TYPE as w}from"../schemas/constants.js";import{success as g,failure as l}from"../types/Result.js";import{PatternConfigSchema as p}from"../schemas/resourceSchemas.js";import{injectCustomCodeBlocks as E}from"../ast/astSurgicalModification.js";import{toVariableName as b,toValidDatabaseName as R,generateImports as S,generateAppInit as I,generateTags as v,generateNetworkCode as C,generateDatabaseCode as A,generateS3Code as N,generateDynamoDBCode as $,generateSQSCode as U,generateComputeCode as B,generateCDNCode as j,collectCdnReferencedResources as x,usesPatternApproach as z,generatePatternCodeWithComments as F}from"../generation/index.js";const V=k("standard");function _(e){return p.options.some(t=>t.shape?.type?.value===e)}function ne(e,t,r=!0,o,n){const i={appName:e,type:t,database:[],s3:[],compute:[]};if(t==="custom")return i;const a=t,s=P[a];return{...i,database:K(e,s,a,r,n),compute:L(e,s,a,r,o),network:s.network,backup:s.backup}}function K(e,t,r,o,n){const i=y(r),a=t.database[i];return!o||a===null?[]:[{name:e,type:i,databaseName:R(e),variableName:`${b(e)}Database`,...a,...n?.snapshotIdentifier!==void 0&&{snapshotIdentifier:n.snapshotIdentifier},...n?.snapshotUsername!==void 0&&{snapshotUsername:n.snapshotUsername}}]}function M(e,t){if(!(e===void 0&&t===void 0))return{scaling:{...e!==void 0&&{minCapacity:e},...t!==void 0&&{maxCapacity:t}}}}function W(e,t){const{minCapacity:r,maxCapacity:o,...n}=e,i=t?.containerPort??3e3;return{...n,dockerfilePath:t?.dockerfilePath,needsDatabaseConnection:t?.needsDatabaseConnection,containers:[{port:i}],...M(r,o)}}function L(e,t,r,o,n){const i=t.compute.ecs,a=n&&n.length>0?T(r,n):i.services.map((s,c)=>({...s,name:c===0?"api":`service-${c+1}`}));return[{name:e,type:w.ECS,needsConnection:o,connectedDatabase:o?[e]:void 0,variableName:`${b(e)}Compute`,cluster:i.cluster,services:a.map((s,c)=>W(s,n?.[c]))}]}function re(e,t,r){const{tier:o="standard",domain:n,database:i,compute:a,cdn:s,environment:c,tags:f}=r??{},m=D(o);if(!m&&o!=="custom")return l(new Error(`Invalid pattern tier: "${o}". Valid tiers are: lightweight, standard, resilient, custom`));if(!_(t))return l(new Error(`Unsupported pattern type: ${t}`));const u=m?h(o):null,d=G(t,e,{domain:n,database:i,compute:a,cdn:s,environment:c,tierPreset:u});return d instanceof Error?l(d):g({appName:e,type:"standard",pattern:t,network:u?u.network:V,backup:u?u.backup:!1,patternConfig:d,database:[],s3:[],compute:[],tags:f??{}})}function Q(e,t){return{type:e?.type??t.database.type,instanceType:e?.instanceType??t.database.instanceType,databaseName:e?.databaseName,publiclyAccessible:e?.publiclyAccessible,allowedIpCidr:e?.allowedIpCidr,backupRetention:e?.backupRetention??t.database.backupRetention,deletionProtection:e?.deletionProtection??t.database.deletionProtection,encryption:e?.encryption}}function Y(e,t){return{memorySize:e?.memorySize??t.compute.memorySize,timeout:e?.timeout??t.compute.timeout}}function q(e){const{encryption:t,...r}=e;return{...r,...t&&{encryption:{storageKey:t}}}}function G(e,t,r){const{domain:o,database:n,compute:i,cdn:a,environment:s,tierPreset:c}=r,f=c?Q(n,c):n,m=c?Y(i,c):i,u={type:e,name:t,domain:o,database:f?q(f):void 0,compute:m?{server:m}:void 0,cdn:a?{domainNames:a.domainNames,certificateArn:a.certificateArn}:void 0,environment:s},d=p.safeParse(u);return d.success?d.data:new Error(`Invalid pattern config: ${d.error.message}`)}function oe(e,t){const r=[S(e),I(e),v(e)];if(z(e))r.push(F(e),C(e));else{const n=x(e);r.push(C(e),A(e),N(e),$(e),U(e),B(e,n),j(e))}const o=r.join("");if(e.customCodeBlocks&&e.customCodeBlocks.length>0){const n=E(o,e.customCodeBlocks,t?.resourceMapping);return n.success?g(n.content):l(new Error(`Custom code injection failed: ${n.error??"unknown error"}`))}return g(o)}export{oe as generateInfrastructureFromPlan,ne as planApplicationResources,re as planOpenNextResources};
1
+ import{TIER_PRESETS as m,getDefaultDatabaseTypeForTier as C,applyTierDefaultsToServices as g}from"../presets/tierPresets.js";import{COMPUTE_TYPE as b,DEFAULT_CONTAINER_PORT as l}from"../schemas/constants.js";import{success as u,failure as P}from"../types/Result.js";import{injectCustomCodeBlocks as k}from"../ast/astCodeInjection.js";import{toVariableName as d,toValidDatabaseName as D,generateImports as h,generateAppInit as T,generateTags as E,generateNetworkCode as f,generateDatabaseCode as R,generateClickHouseCode as I,generateS3Code as S,generateDynamoDBCode as p,generateSQSCode as w,generateComputeCode as A,generateCDNCode as B,collectCdnReferencedResources as U,usesPatternApproach as j,generatePatternCodeWithComments as x}from"../generation/index.js";function L(e,n,r=!0,s,t){const a={appName:e,type:n,database:[],s3:[],compute:[]};if(n==="custom")return a;const o=n,c=m[o];return{...a,database:y(e,c,o,r,t),compute:F(e,c,o,r,s),network:c.network,backup:c.backup}}function y(e,n,r,s,t){const a=C(r),o=n.database[a];return!s||o===null?[]:[{name:e,type:a,databaseName:D(e),variableName:`${d(e)}Database`,...o,...t?.snapshotIdentifier!==void 0&&{snapshotIdentifier:t.snapshotIdentifier},...t?.snapshotUsername!==void 0&&{snapshotUsername:t.snapshotUsername}}]}function _(e,n){if(!(e===void 0&&n===void 0))return{scaling:{...e!==void 0&&{minCapacity:e},...n!==void 0&&{maxCapacity:n}}}}function $(e,n){const{minCapacity:r,maxCapacity:s,...t}=e,a=n?.containerPort??l,o=n?.docker;return{...t,...o?.path!==void 0&&{docker:{path:o.path,...o.context!==void 0&&{context:o.context},...o.target!==void 0&&{target:o.target}}},...n?.needsDatabaseConnection!==void 0&&{needsDatabaseConnection:n.needsDatabaseConnection},containers:[{port:a}],..._(r,s)}}function F(e,n,r,s,t){const a=n.compute.ecs,o=t&&t.length>0?g(r,t):a.services.map((c,i)=>({...c,name:i===0?"api":`service-${i+1}`}));return[{name:e,type:b.ECS,needsConnection:s,connectedDatabase:s?[e]:void 0,variableName:`${d(e)}Compute`,cluster:a.cluster,services:o.map((c,i)=>$(c,t?.[i]))}]}function Q(e,n){const r=[h(e),T(e),E(e)];if(j(e))r.push(x(e),f(e));else{const t=U(e);r.push(f(e),R(e),I(e),S(e),p(e),w(e),A(e,t),B(e))}const s=r.join("");if(e.customCodeBlocks&&e.customCodeBlocks.length>0){const t=k(s,e.customCodeBlocks,n?.resourceMapping);return t.success?u(t.content):P(new Error(`Custom code injection failed: ${t.error??"unknown error"}`))}return u(s)}export{Q as generateInfrastructureFromPlan,L as planApplicationResources};
@@ -0,0 +1,35 @@
1
+ /**
2
+ * ClickHouse tier preset interface.
3
+ *
4
+ * Parallel to `DatabaseTierPreset` rather than extending it — RDS-specific
5
+ * fields (multiAz, proxy, readReplica, readers, writer) do not apply to
6
+ * ClickHouse per the 2026-05-05 ClickHouse Database Factory promotion design
7
+ * (D24).
8
+ *
9
+ * The R2 cold tier from the original construct was dropped per D12; only the
10
+ * S3 cold tier (`{ mode: "s3" }`) is valid.
11
+ */
12
+ export interface ClickHouseTierPreset {
13
+ /** EC2 instance type (default per tier). */
14
+ instanceType?: string;
15
+ /**
16
+ * Cold tier configuration. `false` disables; `{ mode: "s3" }` enables an
17
+ * S3-backed cold tier per D12.
18
+ */
19
+ coldTier?: {
20
+ mode: "s3";
21
+ } | false;
22
+ /**
23
+ * OPTIMIZE TABLE sweep schedule (cron expression). `false` disables the
24
+ * sidecar entirely. Tier 3 prop per D19 — schedule passes through to
25
+ * `app.addSchedule(...)` after the EventBridge promotion lands per D20.
26
+ */
27
+ optimiseSchedule?: string | false;
28
+ /**
29
+ * BACKUP DATABASE TO S3 schedule (cron expression). `false` disables the
30
+ * sidecar entirely. Tier 3 prop per D19.
31
+ */
32
+ backupSchedule?: string | false;
33
+ /** Backup bucket lifecycle retention in days. */
34
+ backupRetentionDays?: number;
35
+ }
File without changes
@@ -14,7 +14,7 @@
14
14
  * Type definitions live in ./tierTypes.ts and are re-exported here.
15
15
  */
16
16
  import { type TierName, type DatabaseType } from "../schemas/sharedTypes.js";
17
- import type { TierProxyConfig, TierReadReplicaConfig, TierCredentialsConfig, TierAuroraReadersConfig, TierDatabaseInsightsConfig, TierEncryptionConfig, DatabaseTierPreset, TierEc2CapacityConfig, TierClusterConfig, TierEcsServiceConfig, EcsTierPreset, LambdaTierPreset, TierNatConfig, TierFlowLogConfig, TierGatewayEndpointsConfig, TierInterfaceEndpointsConfig, TierVpcEndpointsConfig, NetworkTierPreset, TierPreset, UserServiceConfig } from "./tierTypes.js";
17
+ import type { TierProxyConfig, TierReadReplicaConfig, TierCredentialsConfig, TierAuroraReadersConfig, TierDatabaseInsightsConfig, TierEncryptionConfig, DatabaseTierPreset, ClickHouseTierPreset, TierEc2CapacityConfig, TierClusterConfig, TierEcsServiceConfig, EcsTierPreset, LambdaTierPreset, TierNatConfig, TierFlowLogConfig, TierGatewayEndpointsConfig, TierInterfaceEndpointsConfig, TierVpcEndpointsConfig, NetworkTierPreset, TierPreset, UserServiceConfig } from "./tierTypes.js";
18
18
  export type { TierProxyConfig, TierReadReplicaConfig, TierCredentialsConfig, TierAuroraReadersConfig, TierDatabaseInsightsConfig, TierEncryptionConfig, DatabaseTierPreset, TierEc2CapacityConfig, TierClusterConfig, TierEcsServiceConfig, EcsTierPreset, LambdaTierPreset, TierNatConfig, TierFlowLogConfig, TierGatewayEndpointsConfig, TierInterfaceEndpointsConfig, TierVpcEndpointsConfig, NetworkTierPreset, TierPreset, UserServiceConfig, };
19
19
  /**
20
20
  * Tier names - ordered from least to most capable/expensive.
@@ -26,14 +26,10 @@ export { TIER_NAMES, type TierName, CUSTOM_TIER, APP_TYPES, type AppType, } from
26
26
  * Master configuration for all tiers
27
27
  */
28
28
  export declare const TIER_PRESETS: Record<TierName, TierPreset>;
29
- export declare function getDatabasePreset(tier: TierName, databaseType: DatabaseType): DatabaseTierPreset | null;
30
- /**
31
- * Get ECS preset for a specific tier
32
- */
29
+ export declare function getDatabasePreset(tier: TierName, databaseType: "ClickHouse"): ClickHouseTierPreset | null;
30
+ export declare function getDatabasePreset(tier: TierName, databaseType: Exclude<DatabaseType, "ClickHouse">): DatabaseTierPreset | null;
31
+ export declare function getDatabasePreset(tier: TierName, databaseType: DatabaseType): DatabaseTierPreset | ClickHouseTierPreset | null;
33
32
  export declare function getEcsPreset(tier: TierName): EcsTierPreset;
34
- /**
35
- * Get network preset for a specific tier
36
- */
37
33
  export declare function getNetworkPreset(tier: TierName): NetworkTierPreset;
38
34
  export declare function getAvailableTiersForDatabase(databaseType: DatabaseType): TierName[];
39
35
  /**
@@ -44,10 +40,7 @@ export declare function getTierOptionsForDatabase(databaseType: DatabaseType): A
44
40
  value: TierName;
45
41
  description: string;
46
42
  }>;
47
- /**
48
- * Get the default database type for a tier
49
- */
50
- export declare function getDefaultDatabaseTypeForTier(tier: TierName): DatabaseType;
43
+ export declare function getDefaultDatabaseTypeForTier(tier: TierName): Extract<DatabaseType, "Instance" | "Aurora">;
51
44
  /**
52
45
  * Apply tier defaults to user-provided services.
53
46
  * Takes user service names and applies the tier's cpu, memory, scaling,
@@ -1 +1 @@
1
- import{TIER_NAMES as p}from"../schemas/sharedTypes.js";import{TIER_NAMES as v,CUSTOM_TIER as w,APP_TYPES as M}from"../schemas/sharedTypes.js";const r=Object.freeze({tinkerer:{displayName:"Tinkerer",description:"Free tier eligible, minimal cost for experimentation",database:{Instance:{instanceType:"t4g.micro",multiAz:!1,proxy:!1,readReplica:!1,publiclyAccessible:!0},Aurora:null,GlobalAurora:null},compute:{ecs:{services:[{name:"service",capacityProvider:"EC2",desiredCount:1,minCapacity:1,maxCapacity:1,ec2Config:{instanceType:"t4g.micro",amiHardwareType:"ARM",minCapacity:1,maxCapacity:1,memoryLimitMiB:400}}],cluster:{directAccess:!0}},lambda:{timeout:30,memory:128}},network:{maxAzs:2,natGateways:!1,flowLogs:!1},backup:!1},lightweight:{displayName:"Lightweight",description:"Streamlined single-AZ deployment for cost efficiency",database:{Instance:{instanceType:"t4g.small",multiAz:!1},Aurora:{readers:!1},GlobalAurora:null},compute:{ecs:{services:[{name:"service",capacityProvider:"FARGATE_SPOT",cpu:256,memoryLimitMiB:512,desiredCount:1,minCapacity:1,maxCapacity:3}]},lambda:{timeout:30,memory:256}},network:{maxAzs:2,natGateways:{count:1},flowLogs:!1},backup:!1},standard:{displayName:"Standard",description:"Production-ready with sensible defaults",database:{Instance:{instanceType:"t4g.large"},Aurora:{readers:{count:1}},GlobalAurora:{readers:{count:1}}},compute:{ecs:{services:[{name:"service",capacityProvider:"FARGATE",cpu:512,memoryLimitMiB:1024,desiredCount:2,minCapacity:2,maxCapacity:5}]},lambda:{timeout:60,memory:256}},network:{maxAzs:3,natGateways:{count:1},flowLogs:{},vpcEndpoints:{interface:{ecr:!0}}},backup:!1},resilient:{displayName:"Resilient",description:"High availability with enhanced monitoring and scaling",database:{Instance:{instanceType:"r7g.large",encryption:{storageKey:{useCMK:!0}},databaseInsights:{mode:"advanced",encryptionKey:{useCMK:!0}},proxy:{requireTLS:!0}},Aurora:{readers:{count:2},encryption:{storageKey:{useCMK:!0}},databaseInsights:{mode:"advanced",encryptionKey:{useCMK:!0}},proxy:{requireTLS:!0},backupRetention:30},GlobalAurora:{readers:{count:2},encryption:{storageKey:{useCMK:!0}},databaseInsights:{mode:"advanced",encryptionKey:{useCMK:!0}},proxy:{requireTLS:!0},backupRetention:30,enableGlobalWriteForwarding:!0}},compute:{ecs:{services:[{name:"service",capacityProvider:"FARGATE",cpu:1024,memoryLimitMiB:2048,desiredCount:4,minCapacity:4,maxCapacity:20}]},lambda:{timeout:120,memory:512}},network:{maxAzs:3,natGateways:{count:3},flowLogs:{retentionDays:90},vpcEndpoints:{interface:{ecr:!0,secretsManager:!0}}},backup:{tier:"resilient"}},enterprise:{displayName:"Enterprise",description:"Maximum capability with all features enabled",database:{Instance:{instanceType:"r7g.xlarge",encryption:{storageKey:{useCMK:!0}},databaseInsights:{mode:"advanced",encryptionKey:{useCMK:!0}},proxy:{requireTLS:!0},readReplica:{}},Aurora:{readers:{count:2},encryption:{storageKey:{useCMK:!0}},databaseInsights:{mode:"advanced",encryptionKey:{useCMK:!0}},proxy:{requireTLS:!0},backupRetention:35},GlobalAurora:{readers:{count:2},encryption:{storageKey:{useCMK:!0}},databaseInsights:{mode:"advanced",encryptionKey:{useCMK:!0}},proxy:{requireTLS:!0},backupRetention:35,enableGlobalWriteForwarding:!0}},compute:{ecs:{services:[{name:"service",capacityProvider:"FARGATE",cpu:2048,memoryLimitMiB:4096,desiredCount:6,minCapacity:6,maxCapacity:100}]},lambda:{timeout:300,memory:1024}},network:{maxAzs:3,natGateways:{count:3},flowLogs:{destination:"s3",retentionDays:365},vpcEndpoints:{interface:{ecr:!0,secretsManager:!0,kms:!0,cloudwatchLogs:!0}}},backup:{tier:"enterprise"}}});function y(e,a){return r[e].database[a]}function g(e){return r[e].compute.ecs}function b(e){return r[e].network}function m(e){return p.filter(a=>r[a].database[e]!==null)}function f(e){return m(e).map(a=>({label:r[a].displayName,value:a,description:r[a].description}))}function C(e){switch(e){case"tinkerer":case"lightweight":case"standard":return"Instance";case"resilient":case"enterprise":return"Aurora"}}function A(e,a){const n=r[e].compute.ecs,t=n.services[0],u=!n.cluster?.directAccess&&n.cluster?.loadBalancer!==!1;return a.map((i,o)=>{const c=o===0;let s;return u&&(i.routing?s=i.routing:a.length>1&&(s={path:c?"/*":`/${i.name.toLowerCase()}/*`,...c?{}:{priority:100+o}})),{name:i.name,capacityProvider:t.capacityProvider,ec2Config:t.ec2Config,cpu:t.cpu,memoryLimitMiB:t.memoryLimitMiB,desiredCount:t.desiredCount,minCapacity:t.minCapacity,maxCapacity:t.maxCapacity,routing:s}})}export{M as APP_TYPES,w as CUSTOM_TIER,v as TIER_NAMES,r as TIER_PRESETS,A as applyTierDefaultsToServices,m as getAvailableTiersForDatabase,y as getDatabasePreset,C as getDefaultDatabaseTypeForTier,g as getEcsPreset,b as getNetworkPreset,f as getTierOptionsForDatabase};
1
+ import{TIER_NAMES as d}from"../schemas/sharedTypes.js";import{TIER_NAMES as h,CUSTOM_TIER as L,APP_TYPES as M}from"../schemas/sharedTypes.js";const i="service",c="0 4 * * ? *",u="0 5 * * ? *",r=Object.freeze({tinkerer:{displayName:"Tinkerer",description:"Free tier eligible, minimal cost for experimentation",database:{Instance:{instanceType:"t4g.micro",multiAz:!1,proxy:!1,readReplica:!1,publiclyAccessible:!0},Aurora:null,GlobalAurora:null,ClickHouse:null},compute:{ecs:{services:[{name:i,capacityProvider:"EC2",desiredCount:1,minCapacity:1,maxCapacity:1,ec2Config:{instanceType:"t4g.micro",amiHardwareType:"ARM",minCapacity:1,maxCapacity:1,memoryLimitMiB:400}}],cluster:{directAccess:!0}},lambda:{timeout:30,memory:128}},network:{maxAzs:2,natGateways:!1,flowLogs:!1},backup:!1},lightweight:{displayName:"Lightweight",description:"Streamlined single-AZ deployment for cost efficiency",database:{Instance:{instanceType:"t4g.small",multiAz:!1},Aurora:{readers:!1},GlobalAurora:null,ClickHouse:null},compute:{ecs:{services:[{name:i,capacityProvider:"FARGATE_SPOT",cpu:256,memoryLimitMiB:512,desiredCount:1,minCapacity:1,maxCapacity:3}]},lambda:{timeout:30,memory:256}},network:{maxAzs:2,natGateways:{count:1},flowLogs:!1},backup:!1},standard:{displayName:"Standard",description:"Production-ready with sensible defaults",database:{Instance:{instanceType:"t4g.large"},Aurora:{readers:{count:1}},GlobalAurora:{readers:{count:1}},ClickHouse:{instanceType:"t4g.medium",coldTier:{mode:"s3"},optimiseSchedule:c,backupSchedule:u,backupRetentionDays:14}},compute:{ecs:{services:[{name:i,capacityProvider:"FARGATE",cpu:512,memoryLimitMiB:1024,desiredCount:2,minCapacity:2,maxCapacity:5}]},lambda:{timeout:60,memory:256}},network:{maxAzs:3,natGateways:{count:1},flowLogs:{},vpcEndpoints:{interface:{ecr:!0}}},backup:!1},resilient:{displayName:"Resilient",description:"High availability with enhanced monitoring and scaling",database:{Instance:{instanceType:"r7g.large",encryption:{storageKey:{useCMK:!0}},databaseInsights:{mode:"advanced",encryptionKey:{useCMK:!0}},proxy:{requireTLS:!0}},Aurora:{readers:{count:2},encryption:{storageKey:{useCMK:!0}},databaseInsights:{mode:"advanced",encryptionKey:{useCMK:!0}},proxy:{requireTLS:!0},backupRetention:30},GlobalAurora:{readers:{count:2},encryption:{storageKey:{useCMK:!0}},databaseInsights:{mode:"advanced",encryptionKey:{useCMK:!0}},proxy:{requireTLS:!0},backupRetention:30,enableGlobalWriteForwarding:!0},ClickHouse:{instanceType:"m6g.large",coldTier:{mode:"s3"},optimiseSchedule:c,backupSchedule:u,backupRetentionDays:14}},compute:{ecs:{services:[{name:i,capacityProvider:"FARGATE",cpu:1024,memoryLimitMiB:2048,desiredCount:4,minCapacity:4,maxCapacity:20}]},lambda:{timeout:120,memory:512}},network:{maxAzs:3,natGateways:{count:3},flowLogs:{retentionDays:90},vpcEndpoints:{interface:{ecr:!0,secretsManager:!0}}},backup:{tier:"resilient"}},enterprise:{displayName:"Enterprise",description:"Maximum capability with all features enabled",database:{Instance:{instanceType:"r7g.xlarge",encryption:{storageKey:{useCMK:!0}},databaseInsights:{mode:"advanced",encryptionKey:{useCMK:!0}},proxy:{requireTLS:!0},readReplica:{}},Aurora:{readers:{count:2},encryption:{storageKey:{useCMK:!0}},databaseInsights:{mode:"advanced",encryptionKey:{useCMK:!0}},proxy:{requireTLS:!0},backupRetention:35},GlobalAurora:{readers:{count:2},encryption:{storageKey:{useCMK:!0}},databaseInsights:{mode:"advanced",encryptionKey:{useCMK:!0}},proxy:{requireTLS:!0},backupRetention:35,enableGlobalWriteForwarding:!0},ClickHouse:{instanceType:"m6g.xlarge",coldTier:{mode:"s3"},optimiseSchedule:c,backupSchedule:u,backupRetentionDays:30}},compute:{ecs:{services:[{name:i,capacityProvider:"FARGATE",cpu:2048,memoryLimitMiB:4096,desiredCount:6,minCapacity:6,maxCapacity:100}]},lambda:{timeout:300,memory:1024}},network:{maxAzs:3,natGateways:{count:3},flowLogs:{destination:"s3",retentionDays:365},vpcEndpoints:{interface:{ecr:!0,secretsManager:!0,kms:!0,cloudwatchLogs:!0}}},backup:{tier:"enterprise"}}});function C(e,t){return r[e].database[t]}function f(e){return r[e].compute.ecs}function T(e){return r[e].network}function y(e){return d.filter(t=>r[t].database[e]!==null)}function A(e){return y(e).map(t=>({label:r[t].displayName,value:t,description:r[t].description}))}function x(e){switch(e){case"tinkerer":case"lightweight":case"standard":return"Instance";case"resilient":case"enterprise":return"Aurora"}}function k(e,t){const s=r[e].compute.ecs,a=s.services[0],m=!s.cluster?.directAccess&&s.cluster?.loadBalancer!==!1;return t.map((n,p)=>{const l=p===0;let o;return m&&(n.routing?o=n.routing:t.length>1&&(o={path:l?"/*":`/${n.name.toLowerCase()}/*`,...l?{}:{priority:100+p}})),{name:n.name,capacityProvider:a.capacityProvider,ec2Config:a.ec2Config,cpu:a.cpu,memoryLimitMiB:a.memoryLimitMiB,desiredCount:a.desiredCount,minCapacity:a.minCapacity,maxCapacity:a.maxCapacity,routing:o}})}export{M as APP_TYPES,L as CUSTOM_TIER,h as TIER_NAMES,r as TIER_PRESETS,k as applyTierDefaultsToServices,y as getAvailableTiersForDatabase,C as getDatabasePreset,x as getDefaultDatabaseTypeForTier,f as getEcsPreset,T as getNetworkPreset,A as getTierOptionsForDatabase};