@fjall/generator 0.96.0 → 0.99.3

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 (81) 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/astComputeParser.js +1 -1
  5. package/dist/src/ast/astComputeParserHelpers.js +1 -1
  6. package/dist/src/ast/astDatabaseParser.d.ts +5 -2
  7. package/dist/src/ast/astDatabaseParser.js +1 -1
  8. package/dist/src/ast/astInfrastructureParser.d.ts +6 -0
  9. package/dist/src/ast/astInfrastructureParser.js +1 -1
  10. package/dist/src/ast/astPlanConverter.js +2 -2
  11. package/dist/src/ast/astScheduleParser.d.ts +18 -0
  12. package/dist/src/ast/astScheduleParser.js +1 -0
  13. package/dist/src/ast/astTestHelpers.d.ts +40 -6
  14. package/dist/src/codemod/edits/crossPlanConnection.d.ts +2 -6
  15. package/dist/src/codemod/edits/vpcPeer.d.ts +2 -6
  16. package/dist/src/codemod/edits/vpcPeerAccepter.d.ts +2 -5
  17. package/dist/src/codemod/edits/vpcPeerAccepter.js +1 -1
  18. package/dist/src/codemod/index.d.ts +1 -1
  19. package/dist/src/codemod/llmFallback/prompt.js +13 -13
  20. package/dist/src/codemod/llmFallback/tierRunner.js +1 -1
  21. package/dist/src/codemod/types.d.ts +5 -0
  22. package/dist/src/detection/index.d.ts +148 -0
  23. package/dist/src/detection/index.js +1 -0
  24. package/dist/src/generation/common.d.ts +22 -0
  25. package/dist/src/generation/common.js +5 -4
  26. package/dist/src/generation/compute/ec2.d.ts +2 -0
  27. package/dist/src/generation/compute/ec2.js +4 -0
  28. package/dist/src/generation/compute/ecs.d.ts +2 -0
  29. package/dist/src/generation/compute/ecs.js +42 -0
  30. package/dist/src/generation/compute/lambda.d.ts +3 -0
  31. package/dist/src/generation/compute/lambda.js +26 -0
  32. package/dist/src/generation/compute/shared.d.ts +22 -0
  33. package/dist/src/generation/compute/shared.js +4 -0
  34. package/dist/src/generation/compute.d.ts +4 -5
  35. package/dist/src/generation/compute.js +6 -86
  36. package/dist/src/generation/database.d.ts +11 -0
  37. package/dist/src/generation/database.js +23 -12
  38. package/dist/src/generation/index.d.ts +1 -1
  39. package/dist/src/generation/index.js +1 -1
  40. package/dist/src/generation/infrastructure.js +5 -5
  41. package/dist/src/generation/storage.js +30 -30
  42. package/dist/src/index.d.ts +1 -1
  43. package/dist/src/index.js +1 -1
  44. package/dist/src/planning/resourceAddition.d.ts +5 -1
  45. package/dist/src/planning/resourceAddition.js +1 -1
  46. package/dist/src/planning/resourcePlanning.js +1 -1
  47. package/dist/src/presets/clickhouseTierPreset.d.ts +35 -0
  48. package/dist/src/presets/clickhouseTierPreset.js +0 -0
  49. package/dist/src/presets/tierPresets.d.ts +5 -12
  50. package/dist/src/presets/tierPresets.js +1 -1
  51. package/dist/src/presets/tierTypes.d.ts +9 -19
  52. package/dist/src/schemas/applicationSchemas.d.ts +51 -8
  53. package/dist/src/schemas/applicationSchemas.js +1 -1
  54. package/dist/src/schemas/baseSchemas.d.ts +16 -0
  55. package/dist/src/schemas/baseSchemas.js +2 -2
  56. package/dist/src/schemas/computeSchemas.d.ts +108 -14
  57. package/dist/src/schemas/computeSchemas.js +1 -1
  58. package/dist/src/schemas/constants.d.ts +14 -0
  59. package/dist/src/schemas/constants.js +1 -1
  60. package/dist/src/schemas/databaseSchemas.d.ts +80 -0
  61. package/dist/src/schemas/databaseSchemas.js +1 -1
  62. package/dist/src/schemas/networkSchemas.d.ts +7 -6
  63. package/dist/src/schemas/networkSchemas.js +1 -1
  64. package/dist/src/schemas/patternSchemas.js +1 -1
  65. package/dist/src/schemas/sharedTypes.d.ts +1 -1
  66. package/dist/src/schemas/sharedTypes.js +1 -1
  67. package/dist/src/validation/patterns.d.ts +1 -1
  68. package/dist/src/validation/patterns.js +1 -1
  69. package/dist/src/validation/validationMessages.d.ts +5 -4
  70. package/dist/src/validation/validationMessages.js +1 -1
  71. package/dist/src/validation/validationPatterns.d.ts +14 -0
  72. package/dist/src/validation/validationPatterns.js +1 -1
  73. package/dist/src/version.d.ts +1 -1
  74. package/dist/src/version.js +1 -1
  75. package/package.json +19 -13
  76. package/dist/src/codemod/drift/__tests__/fixtures.d.ts +0 -55
  77. package/dist/src/codemod/drift/__tests__/fixtures.js +0 -2
  78. package/dist/src/codemod/llmFallback/__tests__/fixtures.d.ts +0 -5
  79. package/dist/src/codemod/llmFallback/__tests__/fixtures.js +0 -7
  80. package/dist/src/codemod/telemetry/__tests__/errorKinds.fixture.d.ts +0 -1
  81. package/dist/src/codemod/telemetry/__tests__/errorKinds.fixture.js +0 -1
@@ -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};
@@ -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 +1 @@
1
- import{TIER_PRESETS as m,getDefaultDatabaseTypeForTier as C,applyTierDefaultsToServices as b}from"../presets/tierPresets.js";import{COMPUTE_TYPE as g}from"../schemas/constants.js";import{success as u,failure as l}from"../types/Result.js";import{injectCustomCodeBlocks as P}from"../ast/astCodeInjection.js";import{toVariableName as d,toValidDatabaseName as k,generateImports as h,generateAppInit as D,generateTags as E,generateNetworkCode as f,generateDatabaseCode as R,generateS3Code as S,generateDynamoDBCode as T,generateSQSCode as I,generateComputeCode as w,generateCDNCode as B,collectCdnReferencedResources as j,usesPatternApproach as y,generatePatternCodeWithComments as U}from"../generation/index.js";function N(e,n,r=!0,o,t){const s={appName:e,type:n,database:[],s3:[],compute:[]};if(n==="custom")return s;const c=n,a=m[c];return{...s,database:$(e,a,c,r,t),compute:A(e,a,c,r,o),network:a.network,backup:a.backup}}function $(e,n,r,o,t){const s=C(r),c=n.database[s];return!o||c===null?[]:[{name:e,type:s,databaseName:k(e),variableName:`${d(e)}Database`,...c,...t?.snapshotIdentifier!==void 0&&{snapshotIdentifier:t.snapshotIdentifier},...t?.snapshotUsername!==void 0&&{snapshotUsername:t.snapshotUsername}}]}function p(e,n){if(!(e===void 0&&n===void 0))return{scaling:{...e!==void 0&&{minCapacity:e},...n!==void 0&&{maxCapacity:n}}}}function v(e,n){const{minCapacity:r,maxCapacity:o,...t}=e,s=n?.containerPort??3e3;return{...t,dockerfilePath:n?.dockerfilePath,needsDatabaseConnection:n?.needsDatabaseConnection,containers:[{port:s}],...p(r,o)}}function A(e,n,r,o,t){const s=n.compute.ecs,c=t&&t.length>0?b(r,t):s.services.map((a,i)=>({...a,name:i===0?"api":`service-${i+1}`}));return[{name:e,type:g.ECS,needsConnection:o,connectedDatabase:o?[e]:void 0,variableName:`${d(e)}Compute`,cluster:s.cluster,services:c.map((a,i)=>v(a,t?.[i]))}]}function Q(e,n){const r=[h(e),D(e),E(e)];if(y(e))r.push(U(e),f(e));else{const t=j(e);r.push(f(e),R(e),S(e),T(e),I(e),w(e,t),B(e))}const o=r.join("");if(e.customCodeBlocks&&e.customCodeBlocks.length>0){const t=P(o,e.customCodeBlocks,n?.resourceMapping);return t.success?u(t.content):l(new Error(`Custom code injection failed: ${t.error??"unknown error"}`))}return u(o)}export{Q as generateInfrastructureFromPlan,N as planApplicationResources};
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};
@@ -5,7 +5,10 @@
5
5
  * consumers. Extracted from tierPresets.ts for maintainability.
6
6
  */
7
7
  import type { EcsCapacityProvider, BackupVaultTier } from "../schemas/sharedTypes.js";
8
- import type { WarmPool } from "../schemas/computeSchemas.js";
8
+ import type { WarmPool, EcsRoutingConfig, ApplicationServiceRouting, EcsClusterConfig } from "../schemas/computeSchemas.js";
9
+ import type { DockerBuildPartial } from "@fjall/util/manifest/schemas";
10
+ import type { ClickHouseTierPreset } from "./clickhouseTierPreset.js";
11
+ export type { ClickHouseTierPreset } from "./clickhouseTierPreset.js";
9
12
  /**
10
13
  * Proxy configuration for tier presets
11
14
  * Presence = enabled. Use `false` to explicitly disable.
@@ -131,7 +134,7 @@ export interface TierClusterConfig {
131
134
  * - "public": Internet-facing ALB (default)
132
135
  * - "internal": VPC-only ALB
133
136
  */
134
- loadBalancer?: false | "public" | "internal";
137
+ loadBalancer?: EcsClusterConfig["loadBalancer"];
135
138
  }
136
139
  /**
137
140
  * Service configuration for ECS tier presets.
@@ -161,15 +164,7 @@ export interface TierEcsServiceConfig {
161
164
  /** Maximum capacity for autoscaling. Default: 5 */
162
165
  maxCapacity?: number;
163
166
  /** Routing rules for this service on the cluster's ALB */
164
- routing?: {
165
- path?: string;
166
- host?: string;
167
- priority?: number;
168
- } | Array<{
169
- path?: string;
170
- host?: string;
171
- priority?: number;
172
- }>;
167
+ routing?: Pick<EcsRoutingConfig, "path" | "host" | "priority"> | Array<Pick<EcsRoutingConfig, "path" | "host" | "priority">>;
173
168
  }
174
169
  /**
175
170
  * ECS tier preset configuration.
@@ -273,6 +268,7 @@ export interface TierPreset {
273
268
  Instance: DatabaseTierPreset | null;
274
269
  Aurora: DatabaseTierPreset | null;
275
270
  GlobalAurora: DatabaseTierPreset | null;
271
+ ClickHouse: ClickHouseTierPreset | null;
276
272
  };
277
273
  /** Compute presets */
278
274
  compute: {
@@ -291,14 +287,8 @@ export interface TierPreset {
291
287
  */
292
288
  export interface UserServiceConfig {
293
289
  name: string;
294
- dockerfilePath?: string;
290
+ docker?: DockerBuildPartial;
295
291
  containerPort?: number;
296
292
  needsDatabaseConnection?: boolean;
297
- routing?: {
298
- path: string;
299
- priority?: number;
300
- } | Array<{
301
- path: string;
302
- priority?: number;
303
- }>;
293
+ routing?: ApplicationServiceRouting | ApplicationServiceRouting[];
304
294
  }
@@ -271,8 +271,8 @@ export declare const ApplicationResourcePlanSchema: z.ZodObject<{
271
271
  }, z.core.$strict>]>>;
272
272
  flowLogs: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
273
273
  destination: z.ZodOptional<z.ZodEnum<{
274
- cloudwatch: "cloudwatch";
275
274
  s3: "s3";
275
+ cloudwatch: "cloudwatch";
276
276
  }>>;
277
277
  retentionDays: z.ZodOptional<z.ZodNumber>;
278
278
  trafficType: z.ZodOptional<z.ZodEnum<{
@@ -314,8 +314,8 @@ export declare const ApplicationResourcePlanSchema: z.ZodObject<{
314
314
  }, z.core.$strict>]>>;
315
315
  flowLogs: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
316
316
  destination: z.ZodOptional<z.ZodEnum<{
317
- cloudwatch: "cloudwatch";
318
317
  s3: "s3";
318
+ cloudwatch: "cloudwatch";
319
319
  }>>;
320
320
  retentionDays: z.ZodOptional<z.ZodNumber>;
321
321
  trafficType: z.ZodOptional<z.ZodEnum<{
@@ -347,6 +347,7 @@ export declare const ApplicationResourcePlanSchema: z.ZodObject<{
347
347
  Aurora: "Aurora";
348
348
  Instance: "Instance";
349
349
  GlobalAurora: "GlobalAurora";
350
+ ClickHouse: "ClickHouse";
350
351
  }>;
351
352
  databaseName: z.ZodString;
352
353
  instanceType: z.ZodOptional<z.ZodString>;
@@ -488,13 +489,24 @@ export declare const ApplicationResourcePlanSchema: z.ZodObject<{
488
489
  connectedMessaging: z.ZodOptional<z.ZodArray<z.ZodString>>;
489
490
  cluster: z.ZodOptional<z.ZodObject<{
490
491
  domain: z.ZodOptional<z.ZodString>;
491
- loadBalancer: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodLiteral<"public">, z.ZodLiteral<"internal">]>>;
492
+ loadBalancer: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodEnum<{
493
+ public: "public";
494
+ internal: "internal";
495
+ }>]>>;
492
496
  directAccess: z.ZodOptional<z.ZodBoolean>;
497
+ extraProperties: z.ZodOptional<z.ZodArray<z.ZodObject<{
498
+ key: z.ZodString;
499
+ sourceText: z.ZodString;
500
+ }, z.core.$strict>>>;
493
501
  }, z.core.$strict>>;
494
502
  services: z.ZodOptional<z.ZodArray<z.ZodObject<{
495
503
  name: z.ZodString;
496
- dockerfilePath: z.ZodOptional<z.ZodString>;
497
- dockerTarget: z.ZodOptional<z.ZodString>;
504
+ docker: z.ZodOptional<z.ZodObject<{
505
+ path: z.ZodString;
506
+ context: z.ZodOptional<z.ZodString>;
507
+ target: z.ZodOptional<z.ZodString>;
508
+ buildArgs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
509
+ }, z.core.$strict>>;
498
510
  needsDatabaseConnection: z.ZodOptional<z.ZodBoolean>;
499
511
  needsStorageConnection: z.ZodOptional<z.ZodBoolean>;
500
512
  needsMessagingConnection: z.ZodOptional<z.ZodBoolean>;
@@ -572,6 +584,10 @@ export declare const ApplicationResourcePlanSchema: z.ZodObject<{
572
584
  minSize: z.ZodOptional<z.ZodNumber>;
573
585
  reuseOnScaleIn: z.ZodOptional<z.ZodBoolean>;
574
586
  }, z.core.$strict>>;
587
+ extraProperties: z.ZodOptional<z.ZodArray<z.ZodObject<{
588
+ key: z.ZodString;
589
+ sourceText: z.ZodString;
590
+ }, z.core.$strict>>>;
575
591
  }, z.core.$strict>>;
576
592
  ssmSecretsPath: z.ZodOptional<z.ZodString>;
577
593
  extraProperties: z.ZodOptional<z.ZodArray<z.ZodObject<{
@@ -585,7 +601,12 @@ export declare const ApplicationResourcePlanSchema: z.ZodObject<{
585
601
  http5xxThreshold: z.ZodOptional<z.ZodNumber>;
586
602
  }, z.core.$strict>]>>;
587
603
  }, z.core.$strict>>>;
588
- dockerfilePath: z.ZodOptional<z.ZodString>;
604
+ docker: z.ZodOptional<z.ZodObject<{
605
+ path: z.ZodOptional<z.ZodString>;
606
+ context: z.ZodOptional<z.ZodOptional<z.ZodString>>;
607
+ target: z.ZodOptional<z.ZodOptional<z.ZodString>>;
608
+ buildArgs: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>>;
609
+ }, z.core.$strict>>;
589
610
  deployment: z.ZodOptional<z.ZodEnum<{
590
611
  code: "code";
591
612
  container: "container";
@@ -700,6 +721,23 @@ export declare const ApplicationResourcePlanSchema: z.ZodObject<{
700
721
  sourceText: z.ZodString;
701
722
  }, z.core.$strict>>>;
702
723
  }, z.core.$strict>>>;
724
+ clickhouse: z.ZodOptional<z.ZodArray<z.ZodObject<{
725
+ name: z.ZodString;
726
+ type: z.ZodLiteral<"ClickHouse">;
727
+ databaseName: z.ZodString;
728
+ instanceType: z.ZodOptional<z.ZodString>;
729
+ coldTier: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
730
+ mode: z.ZodLiteral<"s3">;
731
+ }, z.core.$strict>, z.ZodLiteral<false>]>>;
732
+ optimiseSchedule: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<false>]>>;
733
+ backupSchedule: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<false>]>>;
734
+ backupRetentionDays: z.ZodOptional<z.ZodNumber>;
735
+ variableName: z.ZodOptional<z.ZodString>;
736
+ extraProperties: z.ZodOptional<z.ZodArray<z.ZodObject<{
737
+ key: z.ZodString;
738
+ sourceText: z.ZodString;
739
+ }, z.core.$strict>>>;
740
+ }, z.core.$strict>>>;
703
741
  sqs: z.ZodOptional<z.ZodArray<z.ZodObject<{
704
742
  name: z.ZodString;
705
743
  queueType: z.ZodDefault<z.ZodEnum<{
@@ -827,8 +865,8 @@ export declare const ApplicationGeneratorSchema: z.ZodObject<{
827
865
  }, z.core.$strict>]>>;
828
866
  flowLogs: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
829
867
  destination: z.ZodOptional<z.ZodEnum<{
830
- cloudwatch: "cloudwatch";
831
868
  s3: "s3";
869
+ cloudwatch: "cloudwatch";
832
870
  }>>;
833
871
  retentionDays: z.ZodOptional<z.ZodNumber>;
834
872
  trafficType: z.ZodOptional<z.ZodEnum<{
@@ -855,7 +893,12 @@ export declare const ApplicationGeneratorSchema: z.ZodObject<{
855
893
  }, z.core.$strict>]>>;
856
894
  services: z.ZodOptional<z.ZodArray<z.ZodObject<{
857
895
  name: z.ZodString;
858
- dockerfilePath: z.ZodOptional<z.ZodString>;
896
+ docker: z.ZodOptional<z.ZodObject<{
897
+ path: z.ZodOptional<z.ZodString>;
898
+ context: z.ZodOptional<z.ZodOptional<z.ZodString>>;
899
+ target: z.ZodOptional<z.ZodOptional<z.ZodString>>;
900
+ buildArgs: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>>;
901
+ }, z.core.$strict>>;
859
902
  containerPort: z.ZodOptional<z.ZodNumber>;
860
903
  needsDatabaseConnection: z.ZodOptional<z.ZodBoolean>;
861
904
  routing: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
@@ -1 +1 @@
1
- import{z as o}from"zod";import{VALIDATION_MESSAGES as a}from"../validation/patterns.js";import{AppNameSchema as t,AppTypeSchema as e,PatternSchema as r,CustomCodeBlockSchema as n,BackupConfigSchema as i,TunnelConfigSchema as m,ResourceNameSchema as p}from"./baseSchemas.js";import{DatabaseResourcePlanSchema as c}from"./databaseSchemas.js";import{NetworkResourcePlanSchema as s,AdditionalNetworkResourcePlanSchema as l,NetworkConfigSchema as S}from"./networkSchemas.js";import{S3ResourcePlanSchema as u}from"./storageSchemas.js";import{SQSResourcePlanSchema as g}from"./messagingSchemas.js";import{CDNResourcePlanSchema as h}from"./cdnSchemas.js";import{ComputeResourcePlanSchema as d,ApplicationServiceConfigSchema as f}from"./computeSchemas.js";import{DynamoDBResourcePlanSchema as A}from"./databaseSchemas.js";import{PatternConfigSchema as C,PatternTierSchema as P,CustomPatternDatabaseSchema as y,CustomPatternComputeSchema as R}from"./patternSchemas.js";const v=o.object({appName:t,type:e,pattern:r.optional(),patternConfig:C.optional(),owner:o.string().optional(),tags:o.record(o.string(),o.string()).optional(),vpcId:o.string().optional(),network:s.optional(),backup:i.optional(),tunnel:m.optional(),additionalNetworks:o.array(l).optional(),database:o.array(c),s3:o.array(u),compute:o.array(d),dynamodb:o.array(A).optional(),sqs:o.array(g).optional(),cdn:h.optional(),customCodeBlocks:o.array(n).optional(),additionalManagedImports:o.array(o.object({moduleSpecifier:o.string(),namedImports:o.array(o.string()),defaultImport:o.string().optional()}).strict()).optional()}).strict(),x=o.object({name:t,type:e,pattern:r.optional(),patternTier:P.optional(),patternDomain:o.string().optional(),customDatabase:y.optional(),customCompute:R.optional(),region:o.string().optional(),owner:o.string().optional(),includeDatabase:o.boolean().optional(),databaseName:o.string().min(1,a.DATABASE.NAME.REQUIRED).max(63,a.DATABASE.NAME.MAX_LENGTH).optional(),vpcId:o.string().optional(),network:S.optional(),services:o.array(f).optional(),snapshotIdentifier:o.string().optional(),snapshotUsername:o.string().optional()}).strict(),G=o.object({name:p,localResource:o.string().min(1),remoteApp:o.string().min(1),remoteResource:o.string().min(1),permission:o.enum(["read","write","read-write"]),remoteArn:o.string().optional()}).strict();export{x as ApplicationGeneratorSchema,v as ApplicationResourcePlanSchema,G as CrossPlanConnectionResourcePlanSchema};
1
+ import{z as o}from"zod";import{VALIDATION_MESSAGES as a}from"../validation/patterns.js";import{AppNameSchema as t,AppTypeSchema as e,PatternSchema as r,CustomCodeBlockSchema as n,BackupConfigSchema as i,TunnelConfigSchema as m,ResourceNameSchema as p}from"./baseSchemas.js";import{DatabaseResourcePlanSchema as c,ClickHouseResourcePlanSchema as s}from"./databaseSchemas.js";import{NetworkResourcePlanSchema as l,AdditionalNetworkResourcePlanSchema as S,NetworkConfigSchema as u}from"./networkSchemas.js";import{S3ResourcePlanSchema as h}from"./storageSchemas.js";import{SQSResourcePlanSchema as g}from"./messagingSchemas.js";import{CDNResourcePlanSchema as d}from"./cdnSchemas.js";import{ComputeResourcePlanSchema as f,ApplicationServiceConfigSchema as A}from"./computeSchemas.js";import{DynamoDBResourcePlanSchema as C}from"./databaseSchemas.js";import{PatternConfigSchema as P,PatternTierSchema as y,CustomPatternDatabaseSchema as R,CustomPatternComputeSchema as b}from"./patternSchemas.js";const x=o.object({appName:t,type:e,pattern:r.optional(),patternConfig:P.optional(),owner:o.string().optional(),tags:o.record(o.string(),o.string()).optional(),vpcId:o.string().optional(),network:l.optional(),backup:i.optional(),tunnel:m.optional(),additionalNetworks:o.array(S).optional(),database:o.array(c),s3:o.array(h),compute:o.array(f),dynamodb:o.array(C).optional(),clickhouse:o.array(s).optional(),sqs:o.array(g).optional(),cdn:d.optional(),customCodeBlocks:o.array(n).optional(),additionalManagedImports:o.array(o.object({moduleSpecifier:o.string(),namedImports:o.array(o.string()),defaultImport:o.string().optional()}).strict()).optional()}).strict(),G=o.object({name:t,type:e,pattern:r.optional(),patternTier:y.optional(),patternDomain:o.string().optional(),customDatabase:R.optional(),customCompute:b.optional(),region:o.string().optional(),owner:o.string().optional(),includeDatabase:o.boolean().optional(),databaseName:o.string().min(1,a.DATABASE.NAME.REQUIRED).max(63,a.DATABASE.NAME.MAX_LENGTH).optional(),vpcId:o.string().optional(),network:u.optional(),services:o.array(A).optional(),snapshotIdentifier:o.string().optional(),snapshotUsername:o.string().optional()}).strict(),H=o.object({name:p,localResource:o.string().min(1),remoteApp:o.string().min(1),remoteResource:o.string().min(1),permission:o.enum(["read","write","read-write"]),remoteArn:o.string().optional()}).strict();export{G as ApplicationGeneratorSchema,x as ApplicationResourcePlanSchema,H as CrossPlanConnectionResourcePlanSchema};
@@ -1,4 +1,5 @@
1
1
  import { z } from "zod";
2
+ export type { AppType } from "./constants.js";
2
3
  export declare const optionalOrDisabled: <T extends z.ZodTypeAny>(schema: T) => z.ZodUnion<[z.ZodLiteral<false>, T]>;
3
4
  /** Reusable capacity validation: ensures minCapacity <= maxCapacity. */
4
5
  export declare const CAPACITY_REFINEMENT: {
@@ -186,6 +187,7 @@ export declare const TunnelConfigSchema: z.ZodUnion<readonly [z.ZodObject<{
186
187
  instanceType: z.ZodOptional<z.ZodString>;
187
188
  }, z.core.$strict>, z.ZodLiteral<false>]>;
188
189
  export declare const OrganisationNameSchema: z.ZodString;
190
+ export type OrganisationName = z.infer<typeof OrganisationNameSchema>;
189
191
  export declare const EmailSchema: z.ZodString;
190
192
  export declare const RegionSchema: z.ZodString;
191
193
  export declare const OrganisationGeneratorSchema: z.ZodObject<{
@@ -202,6 +204,11 @@ export declare const OrganisationGeneratorSchema: z.ZodObject<{
202
204
  force: z.ZodOptional<z.ZodBoolean>;
203
205
  }, z.core.$strict>;
204
206
  export declare function getZodErrorMessage(error: z.ZodError<unknown>): string;
207
+ export type ResourceName = z.infer<typeof ResourceNameSchema>;
208
+ export type BucketName = z.infer<typeof BucketNameSchema>;
209
+ export type DatabaseName = z.infer<typeof DatabaseNameSchema>;
210
+ export type AppName = z.infer<typeof AppNameSchema>;
211
+ export type Port = z.infer<typeof PortSchema>;
205
212
  export type IdentifierValue = z.infer<typeof IdentifierValueSchema>;
206
213
  export type ExpressionValue = z.infer<typeof ExpressionValueSchema>;
207
214
  export type CallValue = z.infer<typeof CallValueSchema>;
@@ -212,3 +219,12 @@ export type AstStatementType = z.infer<typeof AstStatementTypeSchema>;
212
219
  export type CustomCodeBlock = z.infer<typeof CustomCodeBlockSchema>;
213
220
  export type ExtraProperty = z.infer<typeof ExtraPropertySchema>;
214
221
  export type OrganisationGeneratorOptions = z.infer<typeof OrganisationGeneratorSchema>;
222
+ export type EnvironmentRecord = z.infer<typeof EnvironmentRecordSchema>;
223
+ export type SecretImport = z.infer<typeof SecretImportSchema>;
224
+ export type SecretsImportRecord = z.infer<typeof SecretsImportRecordSchema>;
225
+ export type MetadataRecord = z.infer<typeof MetadataRecordSchema>;
226
+ export type Pattern = z.infer<typeof PatternSchema>;
227
+ export type BackupConfig = z.infer<typeof BackupConfigSchema>;
228
+ export type TunnelConfig = z.infer<typeof TunnelConfigSchema>;
229
+ export type Email = z.infer<typeof EmailSchema>;
230
+ export type Region = z.infer<typeof RegionSchema>;
@@ -1,2 +1,2 @@
1
- import{z as e}from"zod";import{VALIDATION_PATTERNS as o,VALIDATION_MESSAGES as t}from"../validation/patterns.js";import{APP_TYPES as a,PATTERN_TYPE_VALUES as i,MIN_PORT as c,MAX_PORT as m,BACKUP_VAULT_TIERS as p}from"./constants.js";import{regions as E}from"../aws/regions.js";const O=n=>e.union([e.literal(!1),n]),b={check:n=>n.minCapacity!==void 0&&n.maxCapacity!==void 0?n.minCapacity<=n.maxCapacity:!0,params:{message:t.CAPACITY_CONSTRAINT.MIN_LTE_MAX,path:["maxCapacity"]}},P=n=>e.number().int(t.MEMORY_LIMIT.INTEGER).min(n,n===128?t.MEMORY_LIMIT.MIN_128:t.MEMORY_LIMIT.MIN_512).max(30720,t.MEMORY_LIMIT.MAX),L=e.string().min(1,t.REQUIRED.RESOURCE_NAME).max(63,t.MAX_LENGTH.RESOURCE_NAME).regex(o.RESOURCE_NAME,t.RESOURCE_NAME),D=e.string().min(1,t.REQUIRED.BUCKET_NAME).max(63,t.MAX_LENGTH.BUCKET_NAME).regex(o.BUCKET_NAME,t.BUCKET_NAME),y=e.string().min(1,t.REQUIRED.DATABASE_NAME).max(63,t.MAX_LENGTH.DATABASE_NAME).regex(o.DATABASE_NAME,t.DATABASE_NAME),U=e.string().min(2,t.IDENTIFIER_MIN_LENGTH).max(50,t.MAX_LENGTH.APP_NAME).regex(o.IDENTIFIER,t.IDENTIFIER).refine(n=>!n.endsWith("-"),{message:t.IDENTIFIER_NO_TRAILING_HYPHEN}).refine(n=>!n.includes("--"),{message:t.IDENTIFIER_NO_CONSECUTIVE_HYPHENS}),G=e.number().int(t.PORT.INTEGER).min(c,t.PORT.MIN).max(m,t.PORT.MAX),H=e.object({key:e.string(),sourceText:e.string()}).strict(),I=e.object({__identifier:e.string()}).strict(),N=e.object({__expression:e.string()}).strict(),T=e.object({__call:e.string()}).strict(),A=e.union([I,N,T]),_=e.union([e.string(),e.number(),e.boolean(),A]),j=e.record(e.string(),_),g=e.object({id:e.string(),name:e.string(),field:e.string().optional()}).strict(),B=e.record(e.string(),g),Y=e.record(e.string(),e.unknown()),F=e.enum(a).describe(`Application type must be one of: ${a.join(", ")}`),V=e.enum(i).describe(`OpenNext deployment pattern: ${i.join(", ")}`),l=e.enum(["before-imports","after-imports","after-app-init","after-tags","after-resource","end-of-file"]),x=e.enum(["import","app-init","tags","database","compute","storage","network","messaging","cdn","pattern","vpc-peer","vpc-peer-accepter","cross-plan-connection","custom"]),X=e.object({sourceText:e.string(),position:l,afterManagedResource:e.object({type:x,name:e.string().optional()}).strict().optional(),originalLine:e.number().int().optional(),leadingComments:e.array(e.string()).optional(),orphaned:e.boolean().optional(),orphanedComment:e.string().optional()}).strict(),k=e.union([e.object({tier:e.enum(p)}).strict(),e.literal(!1)]),K=e.union([e.object({instanceType:e.string().optional()}).strict(),e.literal(!1)]),R=e.string().min(2,t.IDENTIFIER_MIN_LENGTH).max(50,t.MAX_LENGTH.ORGANISATION_NAME).regex(o.IDENTIFIER,t.IDENTIFIER).refine(n=>!n.endsWith("-"),{message:t.IDENTIFIER_NO_TRAILING_HYPHEN}).refine(n=>!n.includes("--"),{message:t.IDENTIFIER_NO_CONSECUTIVE_HYPHENS}),S=e.string().regex(o.EMAIL,t.EMAIL),s=e.string().refine(n=>E.includes(n),{message:t.REGION}),$=e.object({name:R,email:S,accountName:e.string().optional(),primaryRegion:s.optional().default("us-east-1"),secondaryRegions:e.array(s).optional(),security:e.enum(["foundation","compliance","hardened"]).optional(),force:e.boolean().optional()}).strict();function v(n){return n.issues.map(r=>`${r.path.length>0?`${r.path.join(".")}: `:""}${r.message}`).join(`
2
- `)}export{U as AppNameSchema,F as AppTypeSchema,x as AstStatementTypeSchema,k as BackupConfigSchema,D as BucketNameSchema,b as CAPACITY_REFINEMENT,T as CallValueSchema,X as CustomCodeBlockSchema,l as CustomCodePositionSchema,y as DatabaseNameSchema,S as EmailSchema,j as EnvironmentRecordSchema,_ as EnvironmentValueSchema,N as ExpressionValueSchema,H as ExtraPropertySchema,I as IdentifierValueSchema,Y as MetadataRecordSchema,$ as OrganisationGeneratorSchema,R as OrganisationNameSchema,V as PatternSchema,G as PortSchema,s as RegionSchema,L as ResourceNameSchema,g as SecretImportSchema,B as SecretsImportRecordSchema,A as SpecialValueSchema,K as TunnelConfigSchema,v as getZodErrorMessage,P as memoryLimitMiBSchema,O as optionalOrDisabled};
1
+ import{z as e}from"zod";import{VALIDATION_PATTERNS as o,VALIDATION_MESSAGES as t}from"../validation/patterns.js";import{APP_TYPES as i,PATTERN_TYPE_VALUES as s,MIN_PORT as p,MAX_PORT as E,BACKUP_VAULT_TIERS as A,GOVERNANCE_PRESETS as N}from"./constants.js";import{regions as _}from"../aws/regions.js";const P=n=>e.union([e.literal(!1),n]),L={check:n=>n.minCapacity!==void 0&&n.maxCapacity!==void 0?n.minCapacity<=n.maxCapacity:!0,params:{message:t.CAPACITY_CONSTRAINT.MIN_LTE_MAX,path:["maxCapacity"]}},y=n=>e.number().int(t.MEMORY_LIMIT.INTEGER).min(n,n===128?t.MEMORY_LIMIT.MIN_128:t.MEMORY_LIMIT.MIN_512).max(30720,t.MEMORY_LIMIT.MAX),D=e.string().min(1,t.REQUIRED.RESOURCE_NAME).max(63,t.MAX_LENGTH.RESOURCE_NAME).regex(o.RESOURCE_NAME,t.RESOURCE_NAME),U=e.string().min(1,t.REQUIRED.BUCKET_NAME).max(63,t.MAX_LENGTH.BUCKET_NAME).regex(o.BUCKET_NAME,t.BUCKET_NAME),V=e.string().min(1,t.REQUIRED.DATABASE_NAME).max(63,t.MAX_LENGTH.DATABASE_NAME).regex(o.DATABASE_NAME,t.DATABASE_NAME);function c(n){return e.string().min(2,t.IDENTIFIER_MIN_LENGTH).max(50,n).regex(o.IDENTIFIER,t.IDENTIFIER).refine(r=>!r.endsWith("-"),{message:t.IDENTIFIER_NO_TRAILING_HYPHEN}).refine(r=>!r.includes("--"),{message:t.IDENTIFIER_NO_CONSECUTIVE_HYPHENS})}const j=c(t.MAX_LENGTH.APP_NAME),G=e.number().int(t.PORT.INTEGER).min(p,t.PORT.MIN).max(E,t.PORT.MAX),B=e.object({key:e.string(),sourceText:e.string()}).strict(),g=e.object({__identifier:e.string()}).strict(),T=e.object({__expression:e.string()}).strict(),I=e.object({__call:e.string()}).strict(),S=e.union([g,T,I]),l=e.union([e.string(),e.number(),e.boolean(),S]),H=e.record(e.string().regex(o.ENV_VAR_NAME,t.ENV_VAR_NAME),l),x=e.object({id:e.string(),name:e.string(),field:e.string().optional()}).strict(),Y=e.record(e.string(),x),X=e.record(e.string(),e.unknown()),k=e.enum(i).describe(`Application type must be one of: ${i.join(", ")}`),F=e.enum(s).describe(`OpenNext deployment pattern: ${s.join(", ")}`),M=e.enum(["before-imports","after-imports","after-app-init","after-tags","after-resource","end-of-file"]),R=e.enum(["import","app-init","tags","database","compute","storage","network","messaging","cdn","pattern","vpc-peer","vpc-peer-accepter","cross-plan-connection","custom"]),K=e.object({sourceText:e.string(),position:M,afterManagedResource:e.object({type:R,name:e.string().optional()}).strict().optional(),originalLine:e.number().int().optional(),leadingComments:e.array(e.string()).optional(),orphaned:e.boolean().optional(),orphanedComment:e.string().optional()}).strict(),$=e.union([e.object({tier:e.enum(A)}).strict(),e.literal(!1)]),v=e.union([e.object({instanceType:e.string().optional()}).strict(),e.literal(!1)]),u=c(t.MAX_LENGTH.ORGANISATION_NAME),h=e.string().regex(o.EMAIL,t.EMAIL),m=e.string().refine(n=>_.includes(n),{message:t.REGION}),Q=e.object({name:u,email:h,accountName:e.string().optional(),primaryRegion:m.optional().default("us-east-1"),secondaryRegions:e.array(m).optional(),security:e.enum(N).optional(),force:e.boolean().optional()}).strict();function w(n){return n.issues.map(a=>`${a.path.length>0?`${a.path.join(".")}: `:""}${a.message}`).join(`
2
+ `)}export{j as AppNameSchema,k as AppTypeSchema,R as AstStatementTypeSchema,$ as BackupConfigSchema,U as BucketNameSchema,L as CAPACITY_REFINEMENT,I as CallValueSchema,K as CustomCodeBlockSchema,M as CustomCodePositionSchema,V as DatabaseNameSchema,h as EmailSchema,H as EnvironmentRecordSchema,l as EnvironmentValueSchema,T as ExpressionValueSchema,B as ExtraPropertySchema,g as IdentifierValueSchema,X as MetadataRecordSchema,Q as OrganisationGeneratorSchema,u as OrganisationNameSchema,F as PatternSchema,G as PortSchema,m as RegionSchema,D as ResourceNameSchema,x as SecretImportSchema,Y as SecretsImportRecordSchema,S as SpecialValueSchema,v as TunnelConfigSchema,w as getZodErrorMessage,y as memoryLimitMiBSchema,P as optionalOrDisabled};