@fjall/generator 2.16.0 → 2.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/.minified CHANGED
@@ -1 +1 @@
1
- 139 files minified at 2026-06-14T08:04:20.305Z
1
+ 139 files minified at 2026-06-18T09:54:30.278Z
@@ -1 +1 @@
1
- import*as c from"typescript";import{constIncludes as R}from"../schemas/constants.js";import{asBoolean as p,asNumber as u,asString as o,asStringArray as x,captureExtraProperties as I,collectFromAst as A,extractVariableName as S,isCallRef as b,isFactoryBuildCall as h,isFactoryMethodCall as E,omitUndefined as D,parseObjectLiteral as w,parseOptionalConfig as d,parseBooleanOrConfig as g,resolveTemplateLiteral as N,typed as l}from"./astCommonParser.js";import{extractDynamoDBFields as v}from"./astDynamoDBParser.js";import{extractClickHouseFields as C}from"./astClickHouseParser.js";import{convertDynamoDBResources as H}from"./astDynamoDBParser.js";import{convertClickHouseResources as K}from"./astClickHouseParser.js";function P(r){const e=o(r.databaseEngine);if(e==="postgresql"||e==="mysql")return e;const i=r.engine;if(b(i)){const t=String(i.__call);if(t.includes("postgres")||t.includes("auroraPostgres"))return"postgresql";if(t.includes("mysql")||t.includes("auroraMysql"))return"mysql"}}function W(r){const e=r.engine;if(b(e))return String(e.__call)}const F=new Set(["type","databaseName","databaseEngine","engine","vpc","port","deletionProtection","instanceType","multiAz","publiclyAccessible","enableSecretRotation","encryption","databaseInsights","proxy","readReplica","credentials","writer","readers","backupRetention","preferredMaintenanceWindow","primaryRegion","secondaryRegions","globalClusterIdentifier","enableGlobalWriteForwarding","snapshotIdentifier","allocatedStorage","monitoringInterval","snapshotUsername"]);function T(r,e,i){if(i.arguments.length<2)return null;const t=i.arguments[0],a=i.arguments[1];if(!c.isStringLiteral(t)&&!c.isTemplateExpression(t))return null;const s=c.isStringLiteral(t)?t.text:N(r,t);if(!c.isObjectLiteralExpression(a))return null;const n=w(a),m={resourceName:s,type:o(n.type)??"",databaseName:o(n.databaseName)??"",databaseEngine:P(n),engineExpression:W(n),port:u(n.port),deletionProtection:p(n.deletionProtection),instanceType:o(n.instanceType),multiAz:p(n.multiAz),publiclyAccessible:p(n.publiclyAccessible),enableSecretRotation:p(n.enableSecretRotation),encryption:d(n.encryption,l()),databaseInsights:g(n.databaseInsights,l()),proxy:g(n.proxy,l()),readReplica:g(n.readReplica,l()),credentials:d(n.credentials,l()),writer:d(n.writer,l()),readers:g(n.readers,l()),backupRetention:u(n.backupRetention),preferredMaintenanceWindow:o(n.preferredMaintenanceWindow),primaryRegion:o(n.primaryRegion),secondaryRegions:x(n.secondaryRegions),globalClusterIdentifier:o(n.globalClusterIdentifier),enableGlobalWriteForwarding:p(n.enableGlobalWriteForwarding),allocatedStorage:u(n.allocatedStorage),monitoringInterval:u(n.monitoringInterval),snapshotIdentifier:o(n.snapshotIdentifier),snapshotUsername:o(n.snapshotUsername),node:e},y=S(e);y&&(m.variableName=y);const f=I(n,F);return f.length>0&&(m.extraProperties=f),m}function G(r){return A(r,e=>{if(!c.isCallExpression(e)||!E(e,"addDatabase"))return null;const i=e.arguments[0];return h(i,"DatabaseFactory")?T(r,e,i):null})}function L(r){const e=[],i=[],t=[];for(const a of r)if(a.type==="DynamoDB"){const s=v(a);s&&i.push(s)}else if(a.type==="ClickHouse"){const s=C(a);s&&t.push(s)}else e.push(a);return{databases:e,dynamodb:i,clickhouse:t}}const k=["Instance","Aurora","GlobalAurora"];function z(r){return r.filter(e=>e.type!=="DynamoDB").map(e=>({name:e.resourceName,type:R(k,e.type)?e.type:"Instance",databaseName:e.databaseName,...D({port:e.port,deletionProtection:e.deletionProtection,instanceType:e.instanceType,multiAz:e.multiAz,publiclyAccessible:e.publiclyAccessible,enableSecretRotation:e.enableSecretRotation,encryption:e.encryption,databaseInsights:e.databaseInsights,proxy:e.proxy,readReplica:e.readReplica,credentials:e.credentials,writer:e.writer,readers:e.readers,backupRetention:e.backupRetention,preferredMaintenanceWindow:e.preferredMaintenanceWindow,primaryRegion:e.primaryRegion,secondaryRegions:e.secondaryRegions,globalClusterIdentifier:e.globalClusterIdentifier,enableGlobalWriteForwarding:e.enableGlobalWriteForwarding,allocatedStorage:e.allocatedStorage,monitoringInterval:e.monitoringInterval,variableName:e.variableName,databaseEngine:e.databaseEngine,engineExpression:e.engineExpression,extraProperties:e.extraProperties})}))}export{K as convertClickHouseResources,z as convertDatabaseResources,H as convertDynamoDBResources,G as findDatabaseResources,L as splitDatabaseResources};
1
+ import*as c from"typescript";import{constIncludes as b,DATABASE_ENGINES as x}from"../schemas/constants.js";import{asBoolean as p,asNumber as u,asString as o,asStringArray as A,captureExtraProperties as I,collectFromAst as E,extractVariableName as S,isCallRef as R,isFactoryBuildCall as h,isFactoryMethodCall as D,omitUndefined as N,parseObjectLiteral as w,parseOptionalConfig as d,parseBooleanOrConfig as g,resolveTemplateLiteral as v,typed as l}from"./astCommonParser.js";import{extractDynamoDBFields as C}from"./astDynamoDBParser.js";import{extractClickHouseFields as P}from"./astClickHouseParser.js";import{convertDynamoDBResources as j}from"./astDynamoDBParser.js";import{convertClickHouseResources as V}from"./astClickHouseParser.js";function T(r){const e=o(r.databaseEngine);if(e!==void 0&&b(x,e))return e;const i=r.engine;if(R(i)){const t=String(i.__call);if(t.includes("postgres")||t.includes("auroraPostgres"))return"postgresql";if(t.includes("mysql")||t.includes("auroraMysql"))return"mysql"}}function W(r){const e=r.engine;if(R(e))return String(e.__call)}const B=new Set(["type","databaseName","databaseEngine","engine","vpc","port","deletionProtection","instanceType","multiAz","publiclyAccessible","enableSecretRotation","encryption","databaseInsights","proxy","readReplica","credentials","writer","readers","backupRetention","preferredMaintenanceWindow","primaryRegion","secondaryRegions","globalClusterIdentifier","enableGlobalWriteForwarding","snapshotIdentifier","allocatedStorage","monitoringInterval","snapshotUsername"]);function F(r,e,i){if(i.arguments.length<2)return null;const t=i.arguments[0],a=i.arguments[1];if(!c.isStringLiteral(t)&&!c.isTemplateExpression(t))return null;const s=c.isStringLiteral(t)?t.text:v(r,t);if(!c.isObjectLiteralExpression(a))return null;const n=w(a),m={resourceName:s,type:o(n.type)??"",databaseName:o(n.databaseName)??"",databaseEngine:T(n),engineExpression:W(n),port:u(n.port),deletionProtection:p(n.deletionProtection),instanceType:o(n.instanceType),multiAz:p(n.multiAz),publiclyAccessible:p(n.publiclyAccessible),enableSecretRotation:p(n.enableSecretRotation),encryption:d(n.encryption,l()),databaseInsights:g(n.databaseInsights,l()),proxy:g(n.proxy,l()),readReplica:g(n.readReplica,l()),credentials:d(n.credentials,l()),writer:d(n.writer,l()),readers:g(n.readers,l()),backupRetention:u(n.backupRetention),preferredMaintenanceWindow:o(n.preferredMaintenanceWindow),primaryRegion:o(n.primaryRegion),secondaryRegions:A(n.secondaryRegions),globalClusterIdentifier:o(n.globalClusterIdentifier),enableGlobalWriteForwarding:p(n.enableGlobalWriteForwarding),allocatedStorage:u(n.allocatedStorage),monitoringInterval:u(n.monitoringInterval),snapshotIdentifier:o(n.snapshotIdentifier),snapshotUsername:o(n.snapshotUsername),node:e},f=S(e);f&&(m.variableName=f);const y=I(n,B);return y.length>0&&(m.extraProperties=y),m}function z(r){return E(r,e=>{if(!c.isCallExpression(e)||!D(e,"addDatabase"))return null;const i=e.arguments[0];return h(i,"DatabaseFactory")?F(r,e,i):null})}function O(r){const e=[],i=[],t=[];for(const a of r)if(a.type==="DynamoDB"){const s=C(a);s&&i.push(s)}else if(a.type==="ClickHouse"){const s=P(a);s&&t.push(s)}else e.push(a);return{databases:e,dynamodb:i,clickhouse:t}}const k=["Instance","Aurora","GlobalAurora"];function q(r){return r.filter(e=>e.type!=="DynamoDB").map(e=>({name:e.resourceName,type:b(k,e.type)?e.type:"Instance",databaseName:e.databaseName,...N({port:e.port,deletionProtection:e.deletionProtection,instanceType:e.instanceType,multiAz:e.multiAz,publiclyAccessible:e.publiclyAccessible,enableSecretRotation:e.enableSecretRotation,encryption:e.encryption,databaseInsights:e.databaseInsights,proxy:e.proxy,readReplica:e.readReplica,credentials:e.credentials,writer:e.writer,readers:e.readers,backupRetention:e.backupRetention,preferredMaintenanceWindow:e.preferredMaintenanceWindow,primaryRegion:e.primaryRegion,secondaryRegions:e.secondaryRegions,globalClusterIdentifier:e.globalClusterIdentifier,enableGlobalWriteForwarding:e.enableGlobalWriteForwarding,allocatedStorage:e.allocatedStorage,monitoringInterval:e.monitoringInterval,variableName:e.variableName,databaseEngine:e.databaseEngine,engineExpression:e.engineExpression,extraProperties:e.extraProperties})}))}export{V as convertClickHouseResources,q as convertDatabaseResources,j as convertDynamoDBResources,z as findDatabaseResources,O as splitDatabaseResources};
@@ -1,5 +1,6 @@
1
1
  import * as ts from "typescript";
2
2
  import { type Result } from "../types/Result.js";
3
+ import { type DnsRecordType } from "../dns/types.js";
3
4
  /** One-of match for a single `new Domain(...)` call in an infrastructure file. */
4
5
  export interface DomainCallMatch {
5
6
  readonly callExpression: ts.NewExpression;
@@ -45,7 +46,7 @@ export type ParsedFjallTarget = {
45
46
  };
46
47
  export interface ParsedStandardRecord {
47
48
  readonly kind: "standard";
48
- readonly type: "A" | "AAAA" | "CNAME" | "MX" | "TXT" | "NS" | "SRV" | "CAA";
49
+ readonly type: DnsRecordType;
49
50
  readonly name: string;
50
51
  readonly value: string | string[];
51
52
  readonly ttl?: number;
@@ -1 +1 @@
1
- import*as l from"typescript";import{parseObjectLiteral as x,asString as c,asStringUnion as A,asStringArray as k,asBoolean as y,asNumber as N,isCallRef as $,isParsedObject as g}from"./astCommonParser.js";import{success as a,failure as u}from"../types/Result.js";const h=["route53","external-delegated","external-records"],T=["A","AAAA","CNAME","MX","TXT","NS","SRV","CAA"],I=["A","AAAA"];function J(e){const n=[],t=i=>{if(l.isNewExpression(i)&&E(i.expression)){const d=j(i);d!==void 0&&n.push(d)}l.forEachChild(i,t)};if(t(e),n.length===0)return a(void 0);if(n.length>1)return u(new Error(`Expected exactly one 'new Domain(...)' call per infrastructure file, found ${n.length}`));const r=n[0];return r?a(r):a(void 0)}function E(e){return l.isIdentifier(e)&&e.text==="Domain"}function j(e){const n=e.arguments;if(!n||n.length<3)return;const t=n[0],r=n[1],i=n[2];if(!t||!r||!i||!l.isObjectLiteralExpression(i))return;const d=v(e);if(d===void 0)return;const o=R(e),s=l.isStringLiteral(r)?r.text:void 0;return{callExpression:e,containingStatement:d,propsObjectLiteral:i,domainVarId:o,scopeArgumentText:t.getText(),constructIdLiteral:s}}function v(e){let n=e;for(;n!==void 0;){if(l.isExpressionStatement(n)||l.isVariableStatement(n))return n;n=n.parent}}function R(e){let n=e.parent;for(;n!==void 0;){if(l.isVariableDeclaration(n)&&l.isIdentifier(n.name)&&n.initializer===e)return n.name.text;n=n.parent}}function D(e){switch(e.kind){case"registrar_required":return"'registrar' property is required";case"registrar_unsupported":return`'registrar' must be one of ${h.join(", ")}, got ${JSON.stringify(e.value)}`;case"missing_field":return`'${e.field}' property is required`;case"invalid_literal":return`'${e.field}' ${e.reason}`}}function B(e){const n=x(e),t=A(n.registrar,h);if(t===void 0){const s=n.registrar;if(s===void 0)return u({kind:"registrar_required"});const f=typeof s=="string"?s:p(s);return u({kind:"registrar_unsupported",value:f})}const r=c(n.zoneName);if(r===void 0)return u({kind:"missing_field",field:"zoneName"});const i=L(n.records);if(!i.success)return i;const d=z(n.certificates);if(!d.success)return d;const o={zoneName:r,description:c(n.description),costAllocationEnvironment:c(n.costAllocationEnvironment),tags:M(n.tags),records:i.data,certificates:d.data};switch(t){case"route53":{const s=S(n.delegations);return s.success?a({...o,registrar:t,hostedZoneId:c(n.hostedZoneId),delegations:s.data}):s}case"external-delegated":{const s=c(n.delegatedSubdomain);if(s===void 0)return u({kind:"missing_field",field:"delegatedSubdomain"});const f=S(n.delegations);return f.success?a({...o,registrar:t,delegatedSubdomain:s,delegations:f.data}):f}case"external-records":return a({...o,registrar:t})}}function X(e){return D(e)}function L(e){if(e===void 0)return a([]);if(!Array.isArray(e))return u({kind:"invalid_literal",field:"records",reason:"must be an array"});const n=[];for(let t=0;t<e.length;t++){const r=e[t];if(!g(r))return u({kind:"invalid_literal",field:`records[${t}]`,reason:"must be an object literal"});const i=O(r,t);if(!i.success)return i;n.push(i.data)}return a(n)}function O(e,n){const t=c(e.type),r=c(e.name);if(t===void 0)return u({kind:"missing_field",field:`records[${n}].type`});if(r===void 0)return u({kind:"missing_field",field:`records[${n}].name`});if(e.target!==void 0){if(!I.some(f=>f===t))return u({kind:"invalid_literal",field:`records[${n}]`,reason:`alias records must have type 'A' or 'AAAA', got '${t}'`});const s=V(e.target);return a({kind:"alias",type:t,name:r,target:s})}if(!T.some(s=>s===t))return u({kind:"invalid_literal",field:`records[${n}]`,reason:`unsupported record type '${t}'`});const i=C(e.value);if(i===void 0)return u({kind:"invalid_literal",field:`records[${n}].value`,reason:`must be a string or array of strings (got ${JSON.stringify(e.value)})`});const d=N(e.ttl),o={kind:"standard",type:t,name:r,value:i,...d!==void 0?{ttl:d}:{}};return a(o)}function C(e){if(e===void 0)return;if(typeof e=="string")return e;const n=k(e);if(n!==void 0)return n}function V(e){if($(e))return Z(e);if(g(e)){const n=A(e.kind,["ecs","cdn","bucket","custom"]);if(n==="ecs"||n==="cdn"){const t=c(e.appName);if(t!==void 0)return{kind:n,appName:t}}if(n==="bucket"){const t=c(e.bucketName);if(t!==void 0)return{kind:n,bucketName:t}}if(n==="custom"){const t=c(e.dnsName),r=c(e.hostedZoneId);if(t!==void 0&&r!==void 0)return{kind:n,dnsName:t,hostedZoneId:r}}}return{kind:"unresolved",sourceText:p(e)}}function Z(e){const n=e.__call.trim(),t=n.match(/^([A-Za-z_][\w$]*)\s*\(([\s\S]*)\)\s*$/);if(!t)return{kind:"unresolved",sourceText:n};const r=t[1],i=t[2]??"",d=_(i);switch(r){case"fjallApp":{const o=m(d,0);return o===void 0?{kind:"dynamic",sourceText:n}:{kind:"ecs",appName:o}}case"fjallCdn":{const o=m(d,0);return o===void 0?{kind:"dynamic",sourceText:n}:{kind:"cdn",appName:o}}case"fjallBucket":{const o=m(d,0);return o===void 0?{kind:"dynamic",sourceText:n}:{kind:"bucket",bucketName:o}}case"aliasTo":{if(d.length>=2){const o=m(d,0),s=m(d,1);return o!==void 0&&s!==void 0?{kind:"custom",dnsName:o,hostedZoneId:s}:{kind:"dynamic",sourceText:n}}if(d.length===1){const o=d[0]?.trim()??"",s=b(o,"dnsName"),f=b(o,"hostedZoneId");return s!==void 0&&f!==void 0?{kind:"custom",dnsName:s,hostedZoneId:f}:{kind:"dynamic",sourceText:n}}return{kind:"unresolved",sourceText:n}}default:return{kind:"unresolved",sourceText:n}}}function _(e){const n=[];let t=0,r=null,i="";for(let o=0;o<e.length;o++){const s=e[o];if(r!==null){if(i+=s,s==="\\"&&o+1<e.length){const f=e[o+1];f!==void 0&&(i+=f,o+=1);continue}s===r&&(r=null);continue}if(s==='"'||s==="'"||s==="`"){r=s,i+=s;continue}if(s==="("||s==="{"||s==="["){t+=1,i+=s;continue}if(s===")"||s==="}"||s==="]"){t-=1,i+=s;continue}if(s===","&&t===0){n.push(i.trim()),i="";continue}i+=s}const d=i.trim();return d.length>0&&n.push(d),n}function m(e,n){const t=e[n];if(t===void 0)return;const r=t.trim();if(r.length<2)return;const i=r[0],d=r[r.length-1];if(i===d&&!(i!=='"'&&i!=="'"&&i!=="`"))return r.slice(1,-1)}function b(e,n){const t=e.trim().replace(/^\{|\}$/g,""),r=_(t);for(const i of r){const d=i.indexOf(":");if(d<0||i.slice(0,d).trim().replace(/["'`]/g,"")!==n)continue;const s=i.slice(d+1).trim();return m([s],0)}}function z(e){if(e===void 0)return a([]);if(!Array.isArray(e))return u({kind:"invalid_literal",field:"certificates",reason:"must be an array"});const n=[];for(let t=0;t<e.length;t++){const r=e[t];if(typeof r=="string"){n.push({domainName:r});continue}if(!g(r))return u({kind:"invalid_literal",field:`certificates[${t}]`,reason:"must be a string or object literal"});const i=c(r.domainName);if(i===void 0)return u({kind:"missing_field",field:`certificates[${t}].domainName`});const d=k(r.subjectAlternativeNames),o=y(r.transparencyLogging);n.push({domainName:i,...d!==void 0?{subjectAlternativeNames:d}:{},...o!==void 0?{transparencyLogging:o}:{}})}return a(n)}function S(e){if(e===void 0)return a([]);if(!Array.isArray(e))return u({kind:"invalid_literal",field:"delegations",reason:"must be an array"});const n=[];for(let t=0;t<e.length;t++){const r=e[t];if(!g(r))return u({kind:"invalid_literal",field:`delegations[${t}]`,reason:"must be an object literal"});const i=c(r.subdomain),d=c(r.toAccount);if(i===void 0)return u({kind:"missing_field",field:`delegations[${t}].subdomain`});if(d===void 0)return u({kind:"missing_field",field:`delegations[${t}].toAccount`});const o=y(r.auto);n.push({subdomain:i,toAccount:d,...o!==void 0?{auto:o}:{}})}return a(n)}function M(e){if(e===void 0||!g(e))return;const n={};for(const[t,r]of Object.entries(e)){const i=c(r);i!==void 0&&(n[t]=i)}return Object.keys(n).length===0?void 0:n}function p(e){if(e===void 0)return"undefined";if(e===null)return"null";if(typeof e=="string")return JSON.stringify(e);if(typeof e=="number"||typeof e=="boolean")return String(e);if(Array.isArray(e))return`[${e.map(n=>p(n)).join(", ")}]`;if(typeof e=="object"){if("__call"in e)return String(e.__call);if("__identifier"in e)return String(e.__identifier);if("__expression"in e)return String(e.__expression);if("__unknown"in e)return String(e.__unknown)}return String(e)}export{J as findDomainConstructCall,X as parseDomainErrorMessage,B as parseDomainProps,_ as splitTopLevelArgs};
1
+ import*as l from"typescript";import{parseObjectLiteral as x,asString as c,asStringUnion as y,asStringArray as k,asBoolean as h,asNumber as N,isCallRef as T,isParsedObject as g}from"./astCommonParser.js";import{success as a,failure as u}from"../types/Result.js";import{DnsRecordTypeSchema as $}from"../dns/types.js";import{DomainRegistrarSchema as I,AliasRecordTypeSchema as D,TYPED_FJALL_TARGET_KINDS as R}from"../dns/domainRecords.js";const _=I.options,E=$.options,L=D.options;function U(e){const n=[],t=i=>{if(l.isNewExpression(i)&&j(i.expression)){const o=v(i);o!==void 0&&n.push(o)}l.forEachChild(i,t)};if(t(e),n.length===0)return a(void 0);if(n.length>1)return u(new Error(`Expected exactly one 'new Domain(...)' call per infrastructure file, found ${n.length}`));const r=n[0];return r?a(r):a(void 0)}function j(e){return l.isIdentifier(e)&&e.text==="Domain"}function v(e){const n=e.arguments;if(!n||n.length<3)return;const t=n[0],r=n[1],i=n[2];if(!t||!r||!i||!l.isObjectLiteralExpression(i))return;const o=O(e);if(o===void 0)return;const d=C(e),s=l.isStringLiteral(r)?r.text:void 0;return{callExpression:e,containingStatement:o,propsObjectLiteral:i,domainVarId:d,scopeArgumentText:t.getText(),constructIdLiteral:s}}function O(e){let n=e;for(;n!==void 0;){if(l.isExpressionStatement(n)||l.isVariableStatement(n))return n;n=n.parent}}function C(e){let n=e.parent;for(;n!==void 0;){if(l.isVariableDeclaration(n)&&l.isIdentifier(n.name)&&n.initializer===e)return n.name.text;n=n.parent}}function Z(e){switch(e.kind){case"registrar_required":return"'registrar' property is required";case"registrar_unsupported":return`'registrar' must be one of ${_.join(", ")}, got ${JSON.stringify(e.value)}`;case"missing_field":return`'${e.field}' property is required`;case"invalid_literal":return`'${e.field}' ${e.reason}`}}function H(e){const n=x(e),t=y(n.registrar,_);if(t===void 0){const s=n.registrar;if(s===void 0)return u({kind:"registrar_required"});const f=typeof s=="string"?s:p(s);return u({kind:"registrar_unsupported",value:f})}const r=c(n.zoneName);if(r===void 0)return u({kind:"missing_field",field:"zoneName"});const i=V(n.records);if(!i.success)return i;const o=M(n.certificates);if(!o.success)return o;const d={zoneName:r,description:c(n.description),costAllocationEnvironment:c(n.costAllocationEnvironment),tags:Y(n.tags),records:i.data,certificates:o.data};switch(t){case"route53":{const s=S(n.delegations);return s.success?a({...d,registrar:t,hostedZoneId:c(n.hostedZoneId),delegations:s.data}):s}case"external-delegated":{const s=c(n.delegatedSubdomain);if(s===void 0)return u({kind:"missing_field",field:"delegatedSubdomain"});const f=S(n.delegations);return f.success?a({...d,registrar:t,delegatedSubdomain:s,delegations:f.data}):f}case"external-records":return a({...d,registrar:t})}}function Q(e){return Z(e)}function V(e){if(e===void 0)return a([]);if(!Array.isArray(e))return u({kind:"invalid_literal",field:"records",reason:"must be an array"});const n=[];for(let t=0;t<e.length;t++){const r=e[t];if(!g(r))return u({kind:"invalid_literal",field:`records[${t}]`,reason:"must be an object literal"});const i=P(r,t);if(!i.success)return i;n.push(i.data)}return a(n)}function P(e,n){const t=c(e.type),r=c(e.name);if(t===void 0)return u({kind:"missing_field",field:`records[${n}].type`});if(r===void 0)return u({kind:"missing_field",field:`records[${n}].name`});if(e.target!==void 0){if(!L.some(f=>f===t))return u({kind:"invalid_literal",field:`records[${n}]`,reason:`alias records must have type 'A' or 'AAAA', got '${t}'`});const s=q(e.target);return a({kind:"alias",type:t,name:r,target:s})}if(!E.some(s=>s===t))return u({kind:"invalid_literal",field:`records[${n}]`,reason:`unsupported record type '${t}'`});const i=z(e.value);if(i===void 0)return u({kind:"invalid_literal",field:`records[${n}].value`,reason:`must be a string or array of strings (got ${JSON.stringify(e.value)})`});const o=N(e.ttl),d={kind:"standard",type:t,name:r,value:i,...o!==void 0?{ttl:o}:{}};return a(d)}function z(e){if(e===void 0)return;if(typeof e=="string")return e;const n=k(e);if(n!==void 0)return n}function q(e){if(T(e))return J(e);if(g(e)){const n=y(e.kind,R);if(n==="ecs"||n==="cdn"){const t=c(e.appName);if(t!==void 0)return{kind:n,appName:t}}if(n==="bucket"){const t=c(e.bucketName);if(t!==void 0)return{kind:n,bucketName:t}}if(n==="custom"){const t=c(e.dnsName),r=c(e.hostedZoneId);if(t!==void 0&&r!==void 0)return{kind:n,dnsName:t,hostedZoneId:r}}}return{kind:"unresolved",sourceText:p(e)}}function J(e){const n=e.__call.trim(),t=n.match(/^([A-Za-z_][\w$]*)\s*\(([\s\S]*)\)\s*$/);if(!t)return{kind:"unresolved",sourceText:n};const r=t[1],i=t[2]??"",o=A(i);switch(r){case"fjallApp":{const d=m(o,0);return d===void 0?{kind:"dynamic",sourceText:n}:{kind:"ecs",appName:d}}case"fjallCdn":{const d=m(o,0);return d===void 0?{kind:"dynamic",sourceText:n}:{kind:"cdn",appName:d}}case"fjallBucket":{const d=m(o,0);return d===void 0?{kind:"dynamic",sourceText:n}:{kind:"bucket",bucketName:d}}case"aliasTo":{if(o.length>=2){const d=m(o,0),s=m(o,1);return d!==void 0&&s!==void 0?{kind:"custom",dnsName:d,hostedZoneId:s}:{kind:"dynamic",sourceText:n}}if(o.length===1){const d=o[0]?.trim()??"",s=b(d,"dnsName"),f=b(d,"hostedZoneId");return s!==void 0&&f!==void 0?{kind:"custom",dnsName:s,hostedZoneId:f}:{kind:"dynamic",sourceText:n}}return{kind:"unresolved",sourceText:n}}default:return{kind:"unresolved",sourceText:n}}}function A(e){const n=[];let t=0,r=null,i="";for(let d=0;d<e.length;d++){const s=e[d];if(r!==null){if(i+=s,s==="\\"&&d+1<e.length){const f=e[d+1];f!==void 0&&(i+=f,d+=1);continue}s===r&&(r=null);continue}if(s==='"'||s==="'"||s==="`"){r=s,i+=s;continue}if(s==="("||s==="{"||s==="["){t+=1,i+=s;continue}if(s===")"||s==="}"||s==="]"){t-=1,i+=s;continue}if(s===","&&t===0){n.push(i.trim()),i="";continue}i+=s}const o=i.trim();return o.length>0&&n.push(o),n}function m(e,n){const t=e[n];if(t===void 0)return;const r=t.trim();if(r.length<2)return;const i=r[0],o=r[r.length-1];if(i===o&&!(i!=='"'&&i!=="'"&&i!=="`"))return r.slice(1,-1)}function b(e,n){const t=e.trim().replace(/^\{|\}$/g,""),r=A(t);for(const i of r){const o=i.indexOf(":");if(o<0||i.slice(0,o).trim().replace(/["'`]/g,"")!==n)continue;const s=i.slice(o+1).trim();return m([s],0)}}function M(e){if(e===void 0)return a([]);if(!Array.isArray(e))return u({kind:"invalid_literal",field:"certificates",reason:"must be an array"});const n=[];for(let t=0;t<e.length;t++){const r=e[t];if(typeof r=="string"){n.push({domainName:r});continue}if(!g(r))return u({kind:"invalid_literal",field:`certificates[${t}]`,reason:"must be a string or object literal"});const i=c(r.domainName);if(i===void 0)return u({kind:"missing_field",field:`certificates[${t}].domainName`});const o=k(r.subjectAlternativeNames),d=h(r.transparencyLogging);n.push({domainName:i,...o!==void 0?{subjectAlternativeNames:o}:{},...d!==void 0?{transparencyLogging:d}:{}})}return a(n)}function S(e){if(e===void 0)return a([]);if(!Array.isArray(e))return u({kind:"invalid_literal",field:"delegations",reason:"must be an array"});const n=[];for(let t=0;t<e.length;t++){const r=e[t];if(!g(r))return u({kind:"invalid_literal",field:`delegations[${t}]`,reason:"must be an object literal"});const i=c(r.subdomain),o=c(r.toAccount);if(i===void 0)return u({kind:"missing_field",field:`delegations[${t}].subdomain`});if(o===void 0)return u({kind:"missing_field",field:`delegations[${t}].toAccount`});const d=h(r.auto);n.push({subdomain:i,toAccount:o,...d!==void 0?{auto:d}:{}})}return a(n)}function Y(e){if(e===void 0||!g(e))return;const n={};for(const[t,r]of Object.entries(e)){const i=c(r);i!==void 0&&(n[t]=i)}return Object.keys(n).length===0?void 0:n}function p(e){if(e===void 0)return"undefined";if(e===null)return"null";if(typeof e=="string")return JSON.stringify(e);if(typeof e=="number"||typeof e=="boolean")return String(e);if(Array.isArray(e))return`[${e.map(n=>p(n)).join(", ")}]`;if(typeof e=="object"){if("__call"in e)return String(e.__call);if("__identifier"in e)return String(e.__identifier);if("__expression"in e)return String(e.__expression);if("__unknown"in e)return String(e.__unknown)}return String(e)}export{U as findDomainConstructCall,Q as parseDomainErrorMessage,H as parseDomainProps,A as splitTopLevelArgs};
@@ -14,6 +14,7 @@ export interface ParsedSQSResource {
14
14
  visibilityTimeout?: number;
15
15
  retentionPeriod?: number;
16
16
  contentBasedDeduplication?: boolean;
17
+ removalPolicy?: string;
17
18
  extraProperties?: Array<{
18
19
  key: string;
19
20
  sourceText: string;
@@ -1 +1 @@
1
- import*as o from"typescript";import{asBoolean as d,asNumber as a,asString as l,captureExtraProperties as m,collectFromAst as p,extractVariableName as g,isFactoryBuildCall as x,isFactoryMethodCall as S,isParsedObject as y,omitUndefined as f,parseObjectLiteral as b}from"./astCommonParser.js";function N(t,e){if(e.arguments.length<2)return null;const i=e.arguments[0],s=e.arguments[1];if(!o.isStringLiteral(i)||!o.isObjectLiteralExpression(s))return null;const r=b(s),n={resourceName:i.text,queueType:l(r.queueType)??"standard",visibilityTimeout:a(r.visibilityTimeout),retentionPeriod:a(r.messageRetentionPeriod),contentBasedDeduplication:d(r.contentBasedDeduplication),node:t},c=g(t);c&&(n.variableName=c);const u=m(r,new Set(["type","queueType","visibilityTimeout","messageRetentionPeriod","contentBasedDeduplication"]));return u.length>0&&(n.extraProperties=u),n}function v(t){if(t!=null){if(t===!1)return!1;if(y(t))return f({enabled:d(t.enabled),maxReceiveCount:a(t.maxReceiveCount)})}}function B(t){return p(t,e=>{if(!o.isCallExpression(e)||!S(e,"addMessaging"))return null;const i=e.arguments[0];return x(i,"MessagingFactory")?N(e,i):null})}function D(t){if(t.length!==0)return t.map(e=>({name:e.resourceName,queueType:e.queueType==="fifo"?"fifo":"standard",...f({visibilityTimeout:e.visibilityTimeout,retentionPeriod:e.retentionPeriod,contentBasedDeduplication:e.contentBasedDeduplication,variableName:e.variableName,extraProperties:e.extraProperties})}))}export{D as convertSQSResources,B as findSQSResources,v as parseDeadLetterQueueConfig};
1
+ import*as o from"typescript";import{SqsRemovalPolicySchema as f}from"../schemas/messagingSchemas.js";import{asBoolean as u,asNumber as a,asString as m,captureExtraProperties as p,collectFromAst as S,extractVariableName as y,isFactoryBuildCall as g,isFactoryMethodCall as P,isParsedObject as x,omitUndefined as d,parseObjectLiteral as b}from"./astCommonParser.js";function v(e,t){if(t.arguments.length<2)return null;const n=t.arguments[0],s=t.arguments[1];if(!o.isStringLiteral(n)||!o.isObjectLiteralExpression(s))return null;const i=b(s),r={resourceName:n.text,queueType:m(i.queueType)??"standard",visibilityTimeout:a(i.visibilityTimeout),retentionPeriod:a(i.messageRetentionPeriod),contentBasedDeduplication:u(i.contentBasedDeduplication),removalPolicy:m(i.removalPolicy),node:e},c=y(e);c&&(r.variableName=c);const l=p(i,new Set(["type","queueType","visibilityTimeout","messageRetentionPeriod","contentBasedDeduplication","removalPolicy"]));return l.length>0&&(r.extraProperties=l),r}function Q(e){if(e!=null){if(e===!1)return!1;if(x(e))return d({enabled:u(e.enabled),maxReceiveCount:a(e.maxReceiveCount)})}}function h(e){return S(e,t=>{if(!o.isCallExpression(t)||!P(t,"addMessaging"))return null;const n=t.arguments[0];return g(n,"MessagingFactory")?v(t,n):null})}function D(e){if(e.length!==0)return e.map(t=>({name:t.resourceName,queueType:t.queueType==="fifo"?"fifo":"standard",...d({visibilityTimeout:t.visibilityTimeout,retentionPeriod:t.retentionPeriod,contentBasedDeduplication:t.contentBasedDeduplication,removalPolicy:T(t.removalPolicy),variableName:t.variableName,extraProperties:t.extraProperties})}))}const N=new Set(f.options);function R(e){return N.has(e)}function T(e){return e!==void 0&&R(e)?e:void 0}export{D as convertSQSResources,h as findSQSResources,Q as parseDeadLetterQueueConfig};
@@ -1 +1 @@
1
- import*as r from"typescript";import{constIncludes as L,BACKUP_VAULT_TIERS as z}from"../schemas/constants.js";import{asNumber as d,asString as p,collectFromAst as A,extractVariableName as N,findFirstInAst as a,isAppGetAppCall as u,isFactoryBuildCall as O,isFactoryMethodCall as k,isNamedProperty as f,isParsedObject as F,omitUndefined as l,parseObjectLiteral as c,parseBooleanOrConfig as m}from"./astCommonParser.js";const b=["cloudwatch","s3"];function T(n){if(n!==void 0)return b.includes(n)?n:void 0}function y(n){return{maxAzs:d(n.maxAzs),natGateways:m(n.natGateways,e=>({count:d(e.count)})),flowLogs:m(n.flowLogs,e=>({destination:p(e.destination),retentionDays:d(e.retentionDays)})),vpcEndpoints:F(n.vpcEndpoints)?n.vpcEndpoints:void 0}}function j(n,e){if(e.arguments.length<2)return null;const t=e.arguments[0],i=e.arguments[1];if(!r.isStringLiteral(t))return null;const o=t.text,s=r.isObjectLiteralExpression(i)?c(i):{},E=y(s),g={name:o,config:l({...E}),node:n},x=N(n);return x&&(g.variableName=x),g}function S(n){return a(n,e=>{if(!u(e)||e.arguments.length<=1)return;const t=e.arguments[1];if(r.isObjectLiteralExpression(t)){for(const i of t.properties)if(f(i,"network")&&r.isObjectLiteralExpression(i.initializer)){for(const o of i.initializer.properties)if(f(o,"useExisting")&&r.isStringLiteral(o.initializer))return o.initializer.text}}})}function K(n){return a(n,e=>{if(!u(e)||e.arguments.length<=1)return;const t=e.arguments[1];if(r.isObjectLiteralExpression(t)){for(const i of t.properties)if(f(i,"network")){if(i.initializer.kind===r.SyntaxKind.FalseKeyword)return;if(r.isObjectLiteralExpression(i.initializer)&&!i.initializer.properties.some(s=>f(s,"useExisting"))){const s=c(i.initializer);return y(s)}}}})}function v(n){return a(n,e=>{if(!u(e)||e.arguments.length<=1)return;const t=e.arguments[1];if(r.isObjectLiteralExpression(t)){for(const i of t.properties)if(f(i,"backup")){if(i.initializer.kind===r.SyntaxKind.FalseKeyword)return!1;if(r.isObjectLiteralExpression(i.initializer)){const o=c(i.initializer),s=p(o.tier);if(s)return{tier:s}}}}})}function D(n){return a(n,e=>{if(!u(e)||e.arguments.length<=1)return;const t=e.arguments[1];if(r.isObjectLiteralExpression(t)){for(const i of t.properties)if(f(i,"tunnel")){if(i.initializer.kind===r.SyntaxKind.FalseKeyword)return!1;if(i.initializer.kind===r.SyntaxKind.TrueKeyword)return!0;if(r.isObjectLiteralExpression(i.initializer)){const o=c(i.initializer),s=p(o.instanceType);return s?{instanceType:s}:{}}}}})}function G(n){return A(n,e=>{if(!r.isCallExpression(e)||!k(e,"addNetwork"))return null;const t=e.arguments[0];return O(t,"NetworkFactory")?j(e,t):null})}function w(n){const e=n.flowLogs;return{...l({maxAzs:n.maxAzs,natGateways:n.natGateways,vpcEndpoints:n.vpcEndpoints}),...e!==void 0&&{flowLogs:e===!1?!1:l({destination:T(e.destination),retentionDays:e.retentionDays})}}}function I(n){if(n)return w(n)}function B(n){if(n===void 0)return;if(n===!1)return!1;const e=n.tier;if(L(z,e))return{tier:e}}function U(n){if(n===void 0)return;if(n===!1)return!1;if(n===!0)return{};const e={};return n.instanceType&&(e.instanceType=n.instanceType),e}function P(n){if(!(!n||n.length===0))return n.map(e=>({name:e.name,...w(e.config)}))}export{w as buildNetworkFields,P as convertAdditionalNetworks,B as convertBackupConfig,I as convertNetworkConfig,U as convertTunnelConfig,v as findBackupConfig,K as findNetworkConfig,G as findNetworkResources,D as findTunnelConfig,S as findVpcId};
1
+ import*as r from"typescript";import{constIncludes as E,BACKUP_VAULT_TIERS as z}from"../schemas/constants.js";import{FlowLogDestinationSchema as A}from"../schemas/networkSchemas.js";import{asNumber as d,asString as p,collectFromAst as N,extractVariableName as O,findFirstInAst as f,isAppGetAppCall as u,isFactoryBuildCall as k,isFactoryMethodCall as F,isNamedProperty as a,isParsedObject as b,omitUndefined as l,parseObjectLiteral as c,parseBooleanOrConfig as x}from"./astCommonParser.js";const S=new Set(A.options);function T(n){if(n!==void 0)return S.has(n)?n:void 0}function w(n){return{maxAzs:d(n.maxAzs),natGateways:x(n.natGateways,e=>({count:d(e.count)})),flowLogs:x(n.flowLogs,e=>({destination:p(e.destination),retentionDays:d(e.retentionDays)})),vpcEndpoints:b(n.vpcEndpoints)?n.vpcEndpoints:void 0}}function h(n,e){if(e.arguments.length<2)return null;const t=e.arguments[0],i=e.arguments[1];if(!r.isStringLiteral(t))return null;const o=t.text,s=r.isObjectLiteralExpression(i)?c(i):{},L=w(s),g={name:o,config:l({...L}),node:n},m=O(n);return m&&(g.variableName=m),g}function v(n){return f(n,e=>{if(!u(e)||e.arguments.length<=1)return;const t=e.arguments[1];if(r.isObjectLiteralExpression(t)){for(const i of t.properties)if(a(i,"network")&&r.isObjectLiteralExpression(i.initializer)){for(const o of i.initializer.properties)if(a(o,"useExisting")&&r.isStringLiteral(o.initializer))return o.initializer.text}}})}function D(n){return f(n,e=>{if(!u(e)||e.arguments.length<=1)return;const t=e.arguments[1];if(r.isObjectLiteralExpression(t)){for(const i of t.properties)if(a(i,"network")){if(i.initializer.kind===r.SyntaxKind.FalseKeyword)return;if(r.isObjectLiteralExpression(i.initializer)&&!i.initializer.properties.some(s=>a(s,"useExisting"))){const s=c(i.initializer);return w(s)}}}})}function G(n){return f(n,e=>{if(!u(e)||e.arguments.length<=1)return;const t=e.arguments[1];if(r.isObjectLiteralExpression(t)){for(const i of t.properties)if(a(i,"backup")){if(i.initializer.kind===r.SyntaxKind.FalseKeyword)return!1;if(r.isObjectLiteralExpression(i.initializer)){const o=c(i.initializer),s=p(o.tier);if(s)return{tier:s}}}}})}function I(n){return f(n,e=>{if(!u(e)||e.arguments.length<=1)return;const t=e.arguments[1];if(r.isObjectLiteralExpression(t)){for(const i of t.properties)if(a(i,"tunnel")){if(i.initializer.kind===r.SyntaxKind.FalseKeyword)return!1;if(i.initializer.kind===r.SyntaxKind.TrueKeyword)return!0;if(r.isObjectLiteralExpression(i.initializer)){const o=c(i.initializer),s=p(o.instanceType);return s?{instanceType:s}:{}}}}})}function B(n){return N(n,e=>{if(!r.isCallExpression(e)||!F(e,"addNetwork"))return null;const t=e.arguments[0];return k(t,"NetworkFactory")?h(e,t):null})}function y(n){const e=n.flowLogs;return{...l({maxAzs:n.maxAzs,natGateways:n.natGateways,vpcEndpoints:n.vpcEndpoints}),...e!==void 0&&{flowLogs:e===!1?!1:l({destination:T(e.destination),retentionDays:e.retentionDays})}}}function U(n){if(n)return y(n)}function P(n){if(n===void 0)return;if(n===!1)return!1;const e=n.tier;if(E(z,e))return{tier:e}}function _(n){if(n===void 0)return;if(n===!1)return!1;if(n===!0)return{};const e={};return n.instanceType&&(e.instanceType=n.instanceType),e}function V(n){if(!(!n||n.length===0))return n.map(e=>({name:e.name,...y(e.config)}))}export{y as buildNetworkFields,V as convertAdditionalNetworks,P as convertBackupConfig,U as convertNetworkConfig,_ as convertTunnelConfig,G as findBackupConfig,D as findNetworkConfig,B as findNetworkResources,I as findTunnelConfig,v as findVpcId};
@@ -632,6 +632,7 @@ export declare function parseAndConvert(code: string): {
632
632
  visibilityTimeout?: number | undefined;
633
633
  retentionPeriod?: number | undefined;
634
634
  contentBasedDeduplication?: boolean | undefined;
635
+ removalPolicy?: "DESTROY" | "RETAIN" | undefined;
635
636
  variableName?: string | undefined;
636
637
  extraProperties?: {
637
638
  key: string;
@@ -13,6 +13,18 @@ export declare const TypedFjallTargetSchema: z.ZodDiscriminatedUnion<[z.ZodObjec
13
13
  dnsName: z.ZodString;
14
14
  hostedZoneId: z.ZodString;
15
15
  }, z.core.$strict>], "kind">;
16
+ export declare const TYPED_FJALL_TARGET_KINDS: ("custom" | "ecs" | "cdn" | "bucket")[];
17
+ export declare const AliasRecordTypeSchema: z.ZodEnum<{
18
+ A: "A";
19
+ AAAA: "AAAA";
20
+ }>;
21
+ export type AliasRecordType = z.infer<typeof AliasRecordTypeSchema>;
22
+ export declare const DomainRegistrarSchema: z.ZodEnum<{
23
+ route53: "route53";
24
+ "external-delegated": "external-delegated";
25
+ "external-records": "external-records";
26
+ }>;
27
+ export type DomainRegistrar = z.infer<typeof DomainRegistrarSchema>;
16
28
  export declare const ParsedStandardRecordSchema: z.ZodObject<{
17
29
  kind: z.ZodLiteral<"standard">;
18
30
  type: z.ZodEnum<{
@@ -1 +1 @@
1
- import{z as e}from"zod";const r=e.discriminatedUnion("kind",[e.object({kind:e.literal("ecs"),appName:e.string()}).strict(),e.object({kind:e.literal("cdn"),appName:e.string()}).strict(),e.object({kind:e.literal("bucket"),bucketName:e.string()}).strict(),e.object({kind:e.literal("custom"),dnsName:e.string(),hostedZoneId:e.string()}).strict()]),a=e.object({kind:e.literal("standard"),type:e.enum(["A","AAAA","CNAME","MX","TXT","NS","SRV","CAA"]),name:e.string(),value:e.union([e.string(),e.array(e.string())]),ttl:e.number().int().positive().optional()}).strict(),n=e.object({kind:e.literal("alias"),type:e.enum(["A","AAAA"]),name:e.string(),target:r}).strict(),i=e.discriminatedUnion("kind",[a,n]),o=e.object({domainName:e.string(),subjectAlternativeNames:e.array(e.string()).optional(),transparencyLogging:e.boolean().optional()}).strict(),s=e.object({subdomain:e.string(),toAccount:e.string(),auto:e.boolean().optional()}).strict(),c=e.object({zoneName:e.string(),registrar:e.enum(["route53","external-delegated","external-records"]),hostedZoneId:e.string().optional(),delegatedSubdomain:e.string().optional(),records:e.array(i),certificates:e.array(o),delegations:e.array(s)}).strict().refine(t=>t.registrar!=="external-delegated"||t.delegatedSubdomain!==void 0,{message:"external-delegated requires delegatedSubdomain"}).refine(t=>t.registrar!=="external-records"||t.delegations.length===0,{message:"external-records forbids delegations"});export{n as ParsedAliasRecordSchema,o as ParsedCertificateSchema,i as ParsedDnsRecordSchema,c as ParsedDomainRecordsSchema,a as ParsedStandardRecordSchema,s as ParsedSubdomainDelegationSchema,r as TypedFjallTargetSchema};
1
+ import{z as e}from"zod";const r=e.discriminatedUnion("kind",[e.object({kind:e.literal("ecs"),appName:e.string()}).strict(),e.object({kind:e.literal("cdn"),appName:e.string()}).strict(),e.object({kind:e.literal("bucket"),bucketName:e.string()}).strict(),e.object({kind:e.literal("custom"),dnsName:e.string(),hostedZoneId:e.string()}).strict()]),g=r.options.map(t=>t.shape.kind.value),a=e.enum(["A","AAAA"]),n=e.enum(["route53","external-delegated","external-records"]),i=e.object({kind:e.literal("standard"),type:e.enum(["A","AAAA","CNAME","MX","TXT","NS","SRV","CAA"]),name:e.string(),value:e.union([e.string(),e.array(e.string())]),ttl:e.number().int().positive().optional()}).strict(),o=e.object({kind:e.literal("alias"),type:a,name:e.string(),target:r}).strict(),s=e.discriminatedUnion("kind",[i,o]),d=e.object({domainName:e.string(),subjectAlternativeNames:e.array(e.string()).optional(),transparencyLogging:e.boolean().optional()}).strict(),c=e.object({subdomain:e.string(),toAccount:e.string(),auto:e.boolean().optional()}).strict(),m=e.object({zoneName:e.string(),registrar:n,hostedZoneId:e.string().optional(),delegatedSubdomain:e.string().optional(),records:e.array(s),certificates:e.array(d),delegations:e.array(c)}).strict().refine(t=>t.registrar!=="external-delegated"||t.delegatedSubdomain!==void 0,{message:"external-delegated requires delegatedSubdomain"}).refine(t=>t.registrar!=="external-records"||t.delegations.length===0,{message:"external-records forbids delegations"});export{a as AliasRecordTypeSchema,n as DomainRegistrarSchema,o as ParsedAliasRecordSchema,d as ParsedCertificateSchema,s as ParsedDnsRecordSchema,m as ParsedDomainRecordsSchema,i as ParsedStandardRecordSchema,c as ParsedSubdomainDelegationSchema,g as TYPED_FJALL_TARGET_KINDS,r as TypedFjallTargetSchema};
@@ -1,9 +1,9 @@
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}
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),l=e.database.length>0||n>0?`
2
+ `:"",m=p(i),y=a?`const ${s} = `:"",f=u(i.extraProperties);m||f?t+=`${l}${y}app.addStorage(
3
+ StorageFactory.build(${r(i.name)}, {${m}${f}
4
4
  })
5
5
  );
6
- `:t+=`${m}${y}app.addStorage(
6
+ `:t+=`${l}${y}app.addStorage(
7
7
  StorageFactory.build(${r(i.name)}, {})
8
8
  );
9
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+=`
@@ -36,14 +36,15 @@ const ${i} = app.addDatabase(
36
36
  stream: true`),t+=u(n.extraProperties),t+=`
37
37
  })
38
38
  );
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+=`
39
+ `}return t}function $(e,t){return t.compute.some(n=>n.connectedMessaging?.includes(e.name))}function P(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
40
  ${a}app.addMessaging(
41
41
  MessagingFactory.build(${r(n.name)}, {
42
42
  type: "queue",
43
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+=u(n.extraProperties),t+=`
46
+ contentBasedDeduplication: true`),n.removalPolicy!==void 0&&(t+=`,
47
+ removalPolicy: ${r(n.removalPolicy)}`),t+=u(n.extraProperties),t+=`
47
48
  })
48
49
  );
49
- `}return t}export{K as generateDynamoDBCode,x as generateS3Code,S as generateSQSCode,g as s3NeedsVariable,$ as sqsNeedsVariable};
50
+ `}return t}export{K as generateDynamoDBCode,x as generateS3Code,P as generateSQSCode,g as s3NeedsVariable,$ as sqsNeedsVariable};
@@ -759,6 +759,10 @@ export declare const ApplicationResourcePlanSchema: z.ZodObject<{
759
759
  visibilityTimeout: z.ZodOptional<z.ZodNumber>;
760
760
  retentionPeriod: z.ZodOptional<z.ZodNumber>;
761
761
  contentBasedDeduplication: z.ZodOptional<z.ZodBoolean>;
762
+ removalPolicy: z.ZodOptional<z.ZodEnum<{
763
+ DESTROY: "DESTROY";
764
+ RETAIN: "RETAIN";
765
+ }>>;
762
766
  variableName: z.ZodOptional<z.ZodString>;
763
767
  extraProperties: z.ZodOptional<z.ZodArray<z.ZodObject<{
764
768
  key: z.ZodString;
@@ -1,4 +1,15 @@
1
1
  import { z } from "zod";
2
+ /**
3
+ * Removal policy for a generated SQS queue. Unset, the SQSQueue wrapper applies
4
+ * DESTROY (a queue is a transient work medium); RETAIN is the opt-in for a
5
+ * durable queue whose contents are irreplaceable and must survive stack
6
+ * deletion. The parser derives its accept-set from this schema's `.options`.
7
+ */
8
+ export declare const SqsRemovalPolicySchema: z.ZodEnum<{
9
+ DESTROY: "DESTROY";
10
+ RETAIN: "RETAIN";
11
+ }>;
12
+ export type SqsRemovalPolicy = z.infer<typeof SqsRemovalPolicySchema>;
2
13
  /**
3
14
  * SQS queue resource plan schema (for OpenNext patterns)
4
15
  */
@@ -11,6 +22,10 @@ export declare const SQSResourcePlanSchema: z.ZodObject<{
11
22
  visibilityTimeout: z.ZodOptional<z.ZodNumber>;
12
23
  retentionPeriod: z.ZodOptional<z.ZodNumber>;
13
24
  contentBasedDeduplication: z.ZodOptional<z.ZodBoolean>;
25
+ removalPolicy: z.ZodOptional<z.ZodEnum<{
26
+ DESTROY: "DESTROY";
27
+ RETAIN: "RETAIN";
28
+ }>>;
14
29
  variableName: z.ZodOptional<z.ZodString>;
15
30
  extraProperties: z.ZodOptional<z.ZodArray<z.ZodObject<{
16
31
  key: z.ZodString;
@@ -1 +1 @@
1
- import{z as e}from"zod";import{VALIDATION_MESSAGES as o}from"../validation/patterns.js";import{ResourceNameSchema as t,ExtraPropertySchema as a}from"./baseSchemas.js";const n=e.object({name:t,queueType:e.enum(["standard","fifo"]).default("standard"),visibilityTimeout:e.number().int(o.SQS.VISIBILITY_TIMEOUT.INTEGER).min(0,o.SQS.VISIBILITY_TIMEOUT.MIN).max(43200,o.SQS.VISIBILITY_TIMEOUT.MAX).optional(),retentionPeriod:e.number().int(o.SQS.RETENTION_PERIOD.INTEGER).min(60,o.SQS.RETENTION_PERIOD.MIN).max(1209600,o.SQS.RETENTION_PERIOD.MAX).optional(),contentBasedDeduplication:e.boolean().optional(),variableName:e.string().optional(),extraProperties:e.array(a).optional()}).strict();export{n as SQSResourcePlanSchema};
1
+ import{z as o}from"zod";import{VALIDATION_MESSAGES as e}from"../validation/patterns.js";import{ResourceNameSchema as t,ExtraPropertySchema as a}from"./baseSchemas.js";const i=o.enum(["DESTROY","RETAIN"]),S=o.object({name:t,queueType:o.enum(["standard","fifo"]).default("standard"),visibilityTimeout:o.number().int(e.SQS.VISIBILITY_TIMEOUT.INTEGER).min(0,e.SQS.VISIBILITY_TIMEOUT.MIN).max(43200,e.SQS.VISIBILITY_TIMEOUT.MAX).optional(),retentionPeriod:o.number().int(e.SQS.RETENTION_PERIOD.INTEGER).min(60,e.SQS.RETENTION_PERIOD.MIN).max(1209600,e.SQS.RETENTION_PERIOD.MAX).optional(),contentBasedDeduplication:o.boolean().optional(),removalPolicy:i.optional(),variableName:o.string().optional(),extraProperties:o.array(a).optional()}).strict();export{S as SQSResourcePlanSchema,i as SqsRemovalPolicySchema};
@@ -5,6 +5,11 @@ export declare const NatConfigSchema: z.ZodObject<{
5
5
  export declare const NatConfigOrFalseSchema: z.ZodUnion<[z.ZodLiteral<false>, z.ZodObject<{
6
6
  count: z.ZodOptional<z.ZodNumber>;
7
7
  }, z.core.$strict>]>;
8
+ export declare const FlowLogDestinationSchema: z.ZodEnum<{
9
+ s3: "s3";
10
+ cloudwatch: "cloudwatch";
11
+ }>;
12
+ export type FlowLogDestination = z.infer<typeof FlowLogDestinationSchema>;
8
13
  export declare const FlowLogConfigSchema: z.ZodObject<{
9
14
  destination: z.ZodOptional<z.ZodEnum<{
10
15
  s3: "s3";
@@ -1 +1 @@
1
- import{z as o}from"zod";import{VALIDATION_PATTERNS as t,VALIDATION_MESSAGES as e}from"../validation/patterns.js";import{optionalOrDisabled as n,AppNameSchema as l,ResourceNameSchema as a,PortSchema as m}from"./baseSchemas.js";const R=o.object({count:o.number().int(e.NAT_GATEWAY.INTEGER).min(0,e.NAT_GATEWAY.MIN).max(3,e.NAT_GATEWAY.MAX).optional()}).strict().describe("NAT gateway configuration"),i=n(R),A=o.object({destination:o.enum(["cloudwatch","s3"]).optional(),retentionDays:o.number().int(e.RETENTION_DAYS.INTEGER).min(1,e.RETENTION_DAYS.MIN).max(365,e.RETENTION_DAYS.MAX).optional(),trafficType:o.enum(["ALL","ACCEPT","REJECT"]).optional()}).strict().describe("VPC flow log configuration"),c=n(A),N=o.object({s3:o.boolean().optional(),dynamodb:o.boolean().optional()}).strict().describe("Gateway VPC endpoints (FREE)"),S=n(N),C=o.object({ecr:o.boolean().optional(),secretsManager:o.boolean().optional(),kms:o.boolean().optional(),cloudwatchLogs:o.boolean().optional(),ssm:o.boolean().optional(),sts:o.boolean().optional()}).strict().describe("Interface VPC endpoints (cost per hour)"),_=n(C),I=o.object({gateway:S.optional(),interface:_.optional()}).strict().describe("VPC endpoints configuration"),s=n(I),p=o.object({maxAzs:o.number().int(e.MAX_AZS.INTEGER).min(1,e.MAX_AZS.MIN).max(3,e.MAX_AZS.MAX).optional(),natGateways:i.optional(),flowLogs:c.optional(),vpcEndpoints:s.optional(),cidrMask:o.number().int(e.CIDR_MASK.INTEGER).min(16,e.CIDR_MASK.MIN).max(28,e.CIDR_MASK.MAX).optional()}).strict(),E=o.string().min(1,e.REQUIRED.NETWORK_NAME).max(50,e.MAX_LENGTH.NETWORK_NAME).regex(t.RESOURCE_NAME,e.RESOURCE_NAME),D=p.extend({name:E}).strict(),h=n(p),O=o.object({appName:l,networkName:E.optional(),maxAzs:o.number().int(e.MAX_AZS.INTEGER).min(1,e.MAX_AZS.MIN).max(3,e.MAX_AZS.MAX).optional(),natGateways:i.optional(),flowLogs:c.optional(),vpcEndpoints:s.optional()}).strict(),d=t.CIDR,r=o.string().regex(d,e.CIDR),g=o.object({kind:o.literal("database"),resource:o.string().min(1,e.REQUIRED.RESOURCE_REFERENCE),name:a,allowedFromCidrs:o.array(r),access:o.enum(["read","write","readWrite"]).optional()}).strict(),x=o.object({kind:o.literal("ecsService"),resource:o.string().min(1,e.REQUIRED.RESOURCE_REFERENCE),serviceName:o.string().min(1,e.REQUIRED.SERVICE_NAME),name:a,allowedFromCidrs:o.array(r),port:m.optional()}).strict(),T=o.discriminatedUnion("kind",[g,x]),f=o.object({name:a,peerAppName:o.string().min(1,e.REQUIRED.APP_NAME),peerAccountId:o.string().regex(t.AWS_ACCOUNT_ID,e.AWS_ACCOUNT_ID),peerRegion:o.string().min(1,e.VPC_PEER.REGION_REQUIRED).optional(),peerVpcId:o.string().regex(t.VPC_ID,e.VPC_ID).optional(),peerVpcCidr:r.optional(),peerRoleArn:o.string().regex(t.ROLE_ARN,e.ROLE_ARN).optional(),peerRouteTableIds:o.array(o.string().min(1,e.VPC_PEER.ROUTE_TABLE_ID_REQUIRED)).optional(),localVpcName:o.string().min(1,e.REQUIRED.NETWORK_NAME).optional(),enableDnsResolution:o.boolean().optional()}).strict(),w=o.object({name:a,requesterAccountIds:o.array(o.string().regex(t.AWS_ACCOUNT_ID,e.AWS_ACCOUNT_ID)).min(1,e.VPC_PEER.MIN_REQUESTER_ACCOUNTS),localVpcName:o.string().min(1,e.REQUIRED.NETWORK_NAME).optional(),publishToSsm:o.boolean().optional(),exposedResources:o.array(T).optional()}).strict();export{D as AdditionalNetworkResourcePlanSchema,d as CIDR_REGEX,r as CidrStringSchema,g as DatabaseExposedResourceSchema,x as EcsServiceExposedResourceSchema,T as ExposedResourceSchema,c as FlowLogConfigOrFalseSchema,A as FlowLogConfigSchema,S as GatewayEndpointsConfigOrFalseSchema,N as GatewayEndpointsConfigSchema,_ as InterfaceEndpointsConfigOrFalseSchema,C as InterfaceEndpointsConfigSchema,i as NatConfigOrFalseSchema,R as NatConfigSchema,h as NetworkConfigSchema,O as NetworkGeneratorSchema,E as NetworkNameSchema,p as NetworkResourcePlanSchema,s as VpcEndpointsConfigOrFalseSchema,I as VpcEndpointsConfigSchema,w as VpcPeerAccepterResourcePlanSchema,f as VpcPeerResourcePlanSchema};
1
+ import{z as o}from"zod";import{VALIDATION_PATTERNS as t,VALIDATION_MESSAGES as e}from"../validation/patterns.js";import{optionalOrDisabled as n,AppNameSchema as l,ResourceNameSchema as a,PortSchema as m}from"./baseSchemas.js";const R=o.object({count:o.number().int(e.NAT_GATEWAY.INTEGER).min(0,e.NAT_GATEWAY.MIN).max(3,e.NAT_GATEWAY.MAX).optional()}).strict().describe("NAT gateway configuration"),i=n(R),A=o.enum(["cloudwatch","s3"]),N=o.object({destination:A.optional(),retentionDays:o.number().int(e.RETENTION_DAYS.INTEGER).min(1,e.RETENTION_DAYS.MIN).max(365,e.RETENTION_DAYS.MAX).optional(),trafficType:o.enum(["ALL","ACCEPT","REJECT"]).optional()}).strict().describe("VPC flow log configuration"),c=n(N),S=o.object({s3:o.boolean().optional(),dynamodb:o.boolean().optional()}).strict().describe("Gateway VPC endpoints (FREE)"),C=n(S),_=o.object({ecr:o.boolean().optional(),secretsManager:o.boolean().optional(),kms:o.boolean().optional(),cloudwatchLogs:o.boolean().optional(),ssm:o.boolean().optional(),sts:o.boolean().optional()}).strict().describe("Interface VPC endpoints (cost per hour)"),I=n(_),d=o.object({gateway:C.optional(),interface:I.optional()}).strict().describe("VPC endpoints configuration"),s=n(d),p=o.object({maxAzs:o.number().int(e.MAX_AZS.INTEGER).min(1,e.MAX_AZS.MIN).max(3,e.MAX_AZS.MAX).optional(),natGateways:i.optional(),flowLogs:c.optional(),vpcEndpoints:s.optional(),cidrMask:o.number().int(e.CIDR_MASK.INTEGER).min(16,e.CIDR_MASK.MIN).max(28,e.CIDR_MASK.MAX).optional()}).strict(),E=o.string().min(1,e.REQUIRED.NETWORK_NAME).max(50,e.MAX_LENGTH.NETWORK_NAME).regex(t.RESOURCE_NAME,e.RESOURCE_NAME),h=p.extend({name:E}).strict(),O=n(p),f=o.object({appName:l,networkName:E.optional(),maxAzs:o.number().int(e.MAX_AZS.INTEGER).min(1,e.MAX_AZS.MIN).max(3,e.MAX_AZS.MAX).optional(),natGateways:i.optional(),flowLogs:c.optional(),vpcEndpoints:s.optional()}).strict(),g=t.CIDR,r=o.string().regex(g,e.CIDR),x=o.object({kind:o.literal("database"),resource:o.string().min(1,e.REQUIRED.RESOURCE_REFERENCE),name:a,allowedFromCidrs:o.array(r),access:o.enum(["read","write","readWrite"]).optional()}).strict(),T=o.object({kind:o.literal("ecsService"),resource:o.string().min(1,e.REQUIRED.RESOURCE_REFERENCE),serviceName:o.string().min(1,e.REQUIRED.SERVICE_NAME),name:a,allowedFromCidrs:o.array(r),port:m.optional()}).strict(),b=o.discriminatedUnion("kind",[x,T]),w=o.object({name:a,peerAppName:o.string().min(1,e.REQUIRED.APP_NAME),peerAccountId:o.string().regex(t.AWS_ACCOUNT_ID,e.AWS_ACCOUNT_ID),peerRegion:o.string().min(1,e.VPC_PEER.REGION_REQUIRED).optional(),peerVpcId:o.string().regex(t.VPC_ID,e.VPC_ID).optional(),peerVpcCidr:r.optional(),peerRoleArn:o.string().regex(t.ROLE_ARN,e.ROLE_ARN).optional(),peerRouteTableIds:o.array(o.string().min(1,e.VPC_PEER.ROUTE_TABLE_ID_REQUIRED)).optional(),localVpcName:o.string().min(1,e.REQUIRED.NETWORK_NAME).optional(),enableDnsResolution:o.boolean().optional()}).strict(),P=o.object({name:a,requesterAccountIds:o.array(o.string().regex(t.AWS_ACCOUNT_ID,e.AWS_ACCOUNT_ID)).min(1,e.VPC_PEER.MIN_REQUESTER_ACCOUNTS),localVpcName:o.string().min(1,e.REQUIRED.NETWORK_NAME).optional(),publishToSsm:o.boolean().optional(),exposedResources:o.array(b).optional()}).strict();export{h as AdditionalNetworkResourcePlanSchema,g as CIDR_REGEX,r as CidrStringSchema,x as DatabaseExposedResourceSchema,T as EcsServiceExposedResourceSchema,b as ExposedResourceSchema,c as FlowLogConfigOrFalseSchema,N as FlowLogConfigSchema,A as FlowLogDestinationSchema,C as GatewayEndpointsConfigOrFalseSchema,S as GatewayEndpointsConfigSchema,I as InterfaceEndpointsConfigOrFalseSchema,_ as InterfaceEndpointsConfigSchema,i as NatConfigOrFalseSchema,R as NatConfigSchema,O as NetworkConfigSchema,f as NetworkGeneratorSchema,E as NetworkNameSchema,p as NetworkResourcePlanSchema,s as VpcEndpointsConfigOrFalseSchema,d as VpcEndpointsConfigSchema,P as VpcPeerAccepterResourcePlanSchema,w as VpcPeerResourcePlanSchema};
@@ -1 +1 @@
1
- export declare const GENERATOR_VERSION = "2.15.0";
1
+ export declare const GENERATOR_VERSION = "2.17.0";
@@ -1 +1 @@
1
- const E="2.15.0";export{E as GENERATOR_VERSION};
1
+ const E="2.17.0";export{E as GENERATOR_VERSION};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fjall/generator",
3
- "version": "2.16.0",
3
+ "version": "2.18.0",
4
4
  "description": "Pure infrastructure generation logic for Fjall",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
@@ -43,7 +43,7 @@
43
43
  },
44
44
  "license": "SEE LICENSE IN LICENSE",
45
45
  "dependencies": {
46
- "@fjall/util": "^2.16.0",
46
+ "@fjall/util": "^2.18.0",
47
47
  "ast-types": "^0.16.1",
48
48
  "recast": "^0.23.11",
49
49
  "ts-morph": "^28.0.0",
@@ -59,5 +59,5 @@
59
59
  "typescript-eslint": "^8.59.1",
60
60
  "vitest": "^4.1.5"
61
61
  },
62
- "gitHead": "2383b19f1e7db980ae603a6c75dca2c61b7a1d42"
62
+ "gitHead": "37008ca5469398c42a09e6babc8cc4192ab938b2"
63
63
  }