@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.
- package/dist/.minified +1 -1
- package/dist/src/ast/astClickHouseParser.d.ts +25 -0
- package/dist/src/ast/astClickHouseParser.js +1 -0
- package/dist/src/ast/astComputeParser.js +1 -1
- package/dist/src/ast/astComputeParserHelpers.js +1 -1
- package/dist/src/ast/astDatabaseParser.d.ts +5 -2
- package/dist/src/ast/astDatabaseParser.js +1 -1
- package/dist/src/ast/astInfrastructureParser.d.ts +6 -0
- package/dist/src/ast/astInfrastructureParser.js +1 -1
- package/dist/src/ast/astPlanConverter.js +2 -2
- package/dist/src/ast/astScheduleParser.d.ts +18 -0
- package/dist/src/ast/astScheduleParser.js +1 -0
- package/dist/src/ast/astTestHelpers.d.ts +40 -6
- package/dist/src/codemod/edits/crossPlanConnection.d.ts +2 -6
- package/dist/src/codemod/edits/vpcPeer.d.ts +2 -6
- package/dist/src/codemod/edits/vpcPeerAccepter.d.ts +2 -5
- package/dist/src/codemod/edits/vpcPeerAccepter.js +1 -1
- package/dist/src/codemod/index.d.ts +1 -1
- package/dist/src/codemod/llmFallback/prompt.js +13 -13
- package/dist/src/codemod/llmFallback/tierRunner.js +1 -1
- package/dist/src/codemod/types.d.ts +5 -0
- package/dist/src/detection/index.d.ts +148 -0
- package/dist/src/detection/index.js +1 -0
- package/dist/src/generation/common.d.ts +22 -0
- package/dist/src/generation/common.js +5 -4
- package/dist/src/generation/compute/ec2.d.ts +2 -0
- package/dist/src/generation/compute/ec2.js +4 -0
- package/dist/src/generation/compute/ecs.d.ts +2 -0
- package/dist/src/generation/compute/ecs.js +42 -0
- package/dist/src/generation/compute/lambda.d.ts +3 -0
- package/dist/src/generation/compute/lambda.js +26 -0
- package/dist/src/generation/compute/shared.d.ts +22 -0
- package/dist/src/generation/compute/shared.js +4 -0
- package/dist/src/generation/compute.d.ts +4 -5
- package/dist/src/generation/compute.js +6 -86
- package/dist/src/generation/database.d.ts +11 -0
- package/dist/src/generation/database.js +23 -12
- package/dist/src/generation/index.d.ts +1 -1
- package/dist/src/generation/index.js +1 -1
- package/dist/src/generation/infrastructure.js +5 -5
- package/dist/src/generation/storage.js +30 -30
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/planning/resourceAddition.d.ts +5 -1
- package/dist/src/planning/resourceAddition.js +1 -1
- package/dist/src/planning/resourcePlanning.js +1 -1
- package/dist/src/presets/clickhouseTierPreset.d.ts +35 -0
- package/dist/src/presets/clickhouseTierPreset.js +0 -0
- package/dist/src/presets/tierPresets.d.ts +5 -12
- package/dist/src/presets/tierPresets.js +1 -1
- package/dist/src/presets/tierTypes.d.ts +9 -19
- package/dist/src/schemas/applicationSchemas.d.ts +51 -8
- package/dist/src/schemas/applicationSchemas.js +1 -1
- package/dist/src/schemas/baseSchemas.d.ts +16 -0
- package/dist/src/schemas/baseSchemas.js +2 -2
- package/dist/src/schemas/computeSchemas.d.ts +108 -14
- package/dist/src/schemas/computeSchemas.js +1 -1
- package/dist/src/schemas/constants.d.ts +14 -0
- package/dist/src/schemas/constants.js +1 -1
- package/dist/src/schemas/databaseSchemas.d.ts +80 -0
- package/dist/src/schemas/databaseSchemas.js +1 -1
- package/dist/src/schemas/networkSchemas.d.ts +7 -6
- package/dist/src/schemas/networkSchemas.js +1 -1
- package/dist/src/schemas/patternSchemas.js +1 -1
- package/dist/src/schemas/sharedTypes.d.ts +1 -1
- package/dist/src/schemas/sharedTypes.js +1 -1
- package/dist/src/validation/patterns.d.ts +1 -1
- package/dist/src/validation/patterns.js +1 -1
- package/dist/src/validation/validationMessages.d.ts +5 -4
- package/dist/src/validation/validationMessages.js +1 -1
- package/dist/src/validation/validationPatterns.d.ts +14 -0
- package/dist/src/validation/validationPatterns.js +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/package.json +19 -13
- package/dist/src/codemod/drift/__tests__/fixtures.d.ts +0 -55
- package/dist/src/codemod/drift/__tests__/fixtures.js +0 -2
- package/dist/src/codemod/llmFallback/__tests__/fixtures.d.ts +0 -5
- package/dist/src/codemod/llmFallback/__tests__/fixtures.js +0 -7
- package/dist/src/codemod/telemetry/__tests__/errorKinds.fixture.d.ts +0 -1
- package/dist/src/codemod/telemetry/__tests__/errorKinds.fixture.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{toVariableName as
|
|
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
|
|
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=
|
|
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
|
|
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,
|
|
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
|
|
2
|
-
`:"",
|
|
3
|
-
StorageFactory.build(
|
|
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+=`${
|
|
7
|
-
StorageFactory.build(
|
|
6
|
+
`:t+=`${m}${y}app.addStorage(
|
|
7
|
+
StorageFactory.build(${r(i.name)}, {})
|
|
8
8
|
);
|
|
9
|
-
`}return t}function
|
|
10
|
-
const ${
|
|
11
|
-
DatabaseFactory.build(
|
|
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:
|
|
15
|
-
type:
|
|
14
|
+
name: ${r(n.partitionKey.name)},
|
|
15
|
+
type: ${r(n.partitionKey.type)},
|
|
16
16
|
}`,n.sortKey&&(t+=`,
|
|
17
17
|
sortKey: {
|
|
18
|
-
name:
|
|
19
|
-
type:
|
|
20
|
-
}`),n.globalSecondaryIndexes&&n.globalSecondaryIndexes.length>0){const
|
|
21
|
-
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:
|
|
24
|
-
type:
|
|
25
|
-
},`;return
|
|
23
|
+
name: ${r(a.partitionKey.name)},
|
|
24
|
+
type: ${r(a.partitionKey.type)},
|
|
25
|
+
},`;return a.sortKey&&(d+=`
|
|
26
26
|
sortKey: {
|
|
27
|
-
name:
|
|
28
|
-
type:
|
|
29
|
-
},`),
|
|
30
|
-
}`,
|
|
27
|
+
name: ${r(a.sortKey.name)},
|
|
28
|
+
type: ${r(a.sortKey.type)},
|
|
29
|
+
},`),d+=`
|
|
30
|
+
}`,d}).join(`,
|
|
31
31
|
`);t+=`,
|
|
32
32
|
globalSecondaryIndexes: [
|
|
33
|
-
${
|
|
33
|
+
${s}
|
|
34
34
|
]`}n.ttlAttribute&&(t+=`,
|
|
35
|
-
ttlAttribute:
|
|
36
|
-
stream: true`),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
|
|
40
|
-
${
|
|
41
|
-
MessagingFactory.build(
|
|
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:
|
|
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+=
|
|
46
|
+
contentBasedDeduplication: true`),t+=u(n.extraProperties),t+=`
|
|
47
47
|
})
|
|
48
48
|
);
|
|
49
|
-
`}return t}export{
|
|
49
|
+
`}return t}export{K as generateDynamoDBCode,x as generateS3Code,S as generateSQSCode,g as s3NeedsVariable,$ as sqsNeedsVariable};
|
package/dist/src/index.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
30
|
-
|
|
31
|
-
|
|
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
|
|
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?:
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
497
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
2
|
-
`)}export{
|
|
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};
|