@fjall/generator 2.24.0 → 2.27.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
- 141 files minified at 2026-07-05T07:50:57.469Z
1
+ 142 files minified at 2026-07-07T01:04:31.721Z
@@ -85,7 +85,7 @@ export interface DatabaseTierPreset {
85
85
  publiclyAccessible?: boolean;
86
86
  encryption?: TierEncryptionConfig;
87
87
  databaseInsights?: TierDatabaseInsightsConfig | false;
88
- /** Database port. Default: 35255 (FJALL on phone keypad) */
88
+ /** Database port. Default: engine default (5432 postgresql / 3306 mysql) */
89
89
  port?: number;
90
90
  /** RDS Proxy configuration for connection pooling. */
91
91
  proxy?: TierProxyConfig | false;
@@ -63,10 +63,13 @@ export declare function constIncludes<T extends ReadonlyArray<string | number>>(
63
63
  export declare const MIN_PORT = 1;
64
64
  export declare const MAX_PORT = 65535;
65
65
  /**
66
- * Default database port: 35255 (FJALL on phone keypad)
67
- * Used when no explicit port is specified in tier presets or configuration.
66
+ * Engine-default database ports, used when no explicit port is specified in
67
+ * tier presets or configuration. These MUST stay the engine defaults: AWS RDS
68
+ * Proxy listens exclusively on the engine family's default port (CreateDBProxy
69
+ * has no port parameter), so a non-default fallback breaks every proxied tier.
70
+ * Single source of truth — the CDK constructs import this map.
68
71
  */
69
- export declare const DEFAULT_DATABASE_PORT = 35255;
72
+ export declare const ENGINE_DEFAULT_DATABASE_PORTS: Record<DatabaseEngine, number>;
70
73
  export declare const MIN_LAMBDA_MEMORY = 128;
71
74
  export declare const MAX_LAMBDA_MEMORY = 10240;
72
75
  export declare const MIN_LAMBDA_TIMEOUT = 1;
@@ -1 +1 @@
1
- const t=Object.freeze({RESOURCE_SUFFIXES:Object.freeze({storage:"Storage",database:"Database",cluster:"Cluster",function:"Function",instance:"Instance",compute:"Compute"})});import{DATABASE_TYPES as q}from"./sharedTypes.js";const g=["ecs","lambda","ec2"],x=Object.freeze({ECS:"ecs",LAMBDA:"lambda",EC2:"ec2"}),o=["code","container"],l=Object.freeze({CODE:"code",CONTAINER:"container"}),E=["ARM_64","X86_64"],c="ARM_64",A=["NONE","AWS_IAM"],T=["public","internal"],_=["CPU","MEMORY"],n=["ARM","STANDARD"],s=["Instance","Aurora"],S=["postgresql","mysql"],p=["foundation","compliance","hardened"];import{ECS_CAPACITY_PROVIDERS as y}from"./sharedTypes.js";const P="FARGATE",a=["payload","nextjs"],O=new Set(a);import{APP_TYPES as Z,CUSTOM_TIER as h}from"./sharedTypes.js";const R=["t3.nano","t3.micro","t3.small","t3.medium","t3.large","t3.xlarge","t3.2xlarge","t3a.nano","t3a.micro","t3a.small","t3a.medium","t3a.large","t3a.xlarge","t3a.2xlarge","t4g.nano","t4g.micro","t4g.small","t4g.medium","t4g.large","t4g.xlarge","t4g.2xlarge","c5.large","c5.xlarge","c5.2xlarge","c5.4xlarge","c5.9xlarge","c5.12xlarge","c5.18xlarge","c5.24xlarge","c5a.large","c5a.xlarge","c5a.2xlarge","c5a.4xlarge","c5a.8xlarge","c5a.12xlarge","c5a.16xlarge","c5a.24xlarge","c6g.medium","c6g.large","c6g.xlarge","c6g.2xlarge","c6g.4xlarge","c6g.8xlarge","c6g.12xlarge","c6g.16xlarge","r5.large","r5.xlarge","r5.2xlarge","r5.4xlarge","r5.8xlarge","r5.12xlarge","r5.16xlarge","r5.24xlarge","r5a.large","r5a.xlarge","r5a.2xlarge","r5a.4xlarge","r5a.8xlarge","r5a.12xlarge","r5a.16xlarge","r5a.24xlarge","r6g.medium","r6g.large","r6g.xlarge","r6g.2xlarge","r6g.4xlarge","r6g.8xlarge","r6g.12xlarge","r6g.16xlarge","i3.large","i3.xlarge","i3.2xlarge","i3.4xlarge","i3.8xlarge","i3.16xlarge","p3.2xlarge","p3.8xlarge","p3.16xlarge","g4dn.xlarge","g4dn.2xlarge","g4dn.4xlarge","g4dn.8xlarge","g4dn.12xlarge","g4dn.16xlarge","m5.large","m5.xlarge","m5.2xlarge","m5.4xlarge","m5.8xlarge","m5.12xlarge","m5.16xlarge","m5.24xlarge","m5a.large","m5a.xlarge","m5a.2xlarge","m5a.4xlarge","m5a.8xlarge","m5a.12xlarge","m5a.16xlarge","m5a.24xlarge"],C=[0,1,5,10,15,30,60];function m(e,r){return e.includes(r)}const I=1,M=65535,N=35255,D=128,L=10240,U=1,Y=900,i=1,d=1e3,u=100,F=100,f=1,B=!1,b=3e3,G="t4g.micro",H=30,X=["GET","POST","PUT","DELETE","HEAD","OPTIONS","PATCH"],V=["standard","assets","upload","website"],j=["AES256","KMS"];import{BACKUP_VAULT_TIERS as v}from"./sharedTypes.js";export{n as AMI_HARDWARE_TYPES,Z as APP_TYPES,v as BACKUP_VAULT_TIERS,E as COMPUTE_ARCHITECTURES,x as COMPUTE_TYPE,g as COMPUTE_TYPES,h as CUSTOM_TIER,S as DATABASE_ENGINES,q as DATABASE_TYPES,t as DEFAULTS,P as DEFAULT_CAPACITY_PROVIDER,c as DEFAULT_COMPUTE_ARCHITECTURE,b as DEFAULT_CONTAINER_PORT,N as DEFAULT_DATABASE_PORT,G as DEFAULT_EC2_INSTANCE_TYPE,H as DEFAULT_SECRET_ROTATION_DAYS,f as DEFAULT_WARM_POOL_MIN_SIZE,B as DEFAULT_WARM_POOL_REUSE_ON_SCALE_IN,l as DEPLOYMENT_TYPE,o as DEPLOYMENT_TYPES,R as EC2_INSTANCE_TYPES,y as ECS_CAPACITY_PROVIDERS,A as FUNCTION_URL_AUTH_TYPES,p as GOVERNANCE_PRESETS,X as HTTP_METHODS,T as LOAD_BALANCER_TYPES,d as MAX_ECS_CAPACITY,L as MAX_LAMBDA_MEMORY,Y as MAX_LAMBDA_TIMEOUT,M as MAX_PORT,u as MAX_SCALING_CAPACITY,F as MAX_WARM_POOL_SIZE,i as MIN_ECS_CAPACITY,D as MIN_LAMBDA_MEMORY,U as MIN_LAMBDA_TIMEOUT,I as MIN_PORT,s as PATTERN_DATABASE_TYPES,O as PATTERN_TYPES,a as PATTERN_TYPE_VALUES,j as S3_ENCRYPTION_TYPES,_ as SCALING_TYPES,V as STORAGE_PRESET_TYPES,C as VALID_MONITORING_INTERVALS,m as constIncludes};
1
+ const t=Object.freeze({RESOURCE_SUFFIXES:Object.freeze({storage:"Storage",database:"Database",cluster:"Cluster",function:"Function",instance:"Instance",compute:"Compute"})});import{DATABASE_TYPES as q}from"./sharedTypes.js";const g=["ecs","lambda","ec2"],x=Object.freeze({ECS:"ecs",LAMBDA:"lambda",EC2:"ec2"}),o=["code","container"],l=Object.freeze({CODE:"code",CONTAINER:"container"}),E=["ARM_64","X86_64"],c="ARM_64",A=["NONE","AWS_IAM"],T=["public","internal"],_=["CPU","MEMORY"],n=["ARM","STANDARD"],s=["Instance","Aurora"],S=["postgresql","mysql"],p=["foundation","compliance","hardened"];import{ECS_CAPACITY_PROVIDERS as w}from"./sharedTypes.js";const P="FARGATE",a=["payload","nextjs"],O=new Set(a);import{APP_TYPES as Z,CUSTOM_TIER as h}from"./sharedTypes.js";const R=["t3.nano","t3.micro","t3.small","t3.medium","t3.large","t3.xlarge","t3.2xlarge","t3a.nano","t3a.micro","t3a.small","t3a.medium","t3a.large","t3a.xlarge","t3a.2xlarge","t4g.nano","t4g.micro","t4g.small","t4g.medium","t4g.large","t4g.xlarge","t4g.2xlarge","c5.large","c5.xlarge","c5.2xlarge","c5.4xlarge","c5.9xlarge","c5.12xlarge","c5.18xlarge","c5.24xlarge","c5a.large","c5a.xlarge","c5a.2xlarge","c5a.4xlarge","c5a.8xlarge","c5a.12xlarge","c5a.16xlarge","c5a.24xlarge","c6g.medium","c6g.large","c6g.xlarge","c6g.2xlarge","c6g.4xlarge","c6g.8xlarge","c6g.12xlarge","c6g.16xlarge","r5.large","r5.xlarge","r5.2xlarge","r5.4xlarge","r5.8xlarge","r5.12xlarge","r5.16xlarge","r5.24xlarge","r5a.large","r5a.xlarge","r5a.2xlarge","r5a.4xlarge","r5a.8xlarge","r5a.12xlarge","r5a.16xlarge","r5a.24xlarge","r6g.medium","r6g.large","r6g.xlarge","r6g.2xlarge","r6g.4xlarge","r6g.8xlarge","r6g.12xlarge","r6g.16xlarge","i3.large","i3.xlarge","i3.2xlarge","i3.4xlarge","i3.8xlarge","i3.16xlarge","p3.2xlarge","p3.8xlarge","p3.16xlarge","g4dn.xlarge","g4dn.2xlarge","g4dn.4xlarge","g4dn.8xlarge","g4dn.12xlarge","g4dn.16xlarge","m5.large","m5.xlarge","m5.2xlarge","m5.4xlarge","m5.8xlarge","m5.12xlarge","m5.16xlarge","m5.24xlarge","m5a.large","m5a.xlarge","m5a.2xlarge","m5a.4xlarge","m5a.8xlarge","m5a.12xlarge","m5a.16xlarge","m5a.24xlarge"],C=[0,1,5,10,15,30,60];function m(e,r){return e.includes(r)}const I=1,M=65535,N=Object.freeze({postgresql:5432,mysql:3306}),D=128,L=10240,U=1,Y=900,i=1,d=1e3,u=100,F=100,f=1,b=!1,B=3e3,G="t4g.micro",H=30,X=["GET","POST","PUT","DELETE","HEAD","OPTIONS","PATCH"],V=["standard","assets","upload","website"],j=["AES256","KMS"];import{BACKUP_VAULT_TIERS as v}from"./sharedTypes.js";export{n as AMI_HARDWARE_TYPES,Z as APP_TYPES,v as BACKUP_VAULT_TIERS,E as COMPUTE_ARCHITECTURES,x as COMPUTE_TYPE,g as COMPUTE_TYPES,h as CUSTOM_TIER,S as DATABASE_ENGINES,q as DATABASE_TYPES,t as DEFAULTS,P as DEFAULT_CAPACITY_PROVIDER,c as DEFAULT_COMPUTE_ARCHITECTURE,B as DEFAULT_CONTAINER_PORT,G as DEFAULT_EC2_INSTANCE_TYPE,H as DEFAULT_SECRET_ROTATION_DAYS,f as DEFAULT_WARM_POOL_MIN_SIZE,b as DEFAULT_WARM_POOL_REUSE_ON_SCALE_IN,l as DEPLOYMENT_TYPE,o as DEPLOYMENT_TYPES,R as EC2_INSTANCE_TYPES,w as ECS_CAPACITY_PROVIDERS,N as ENGINE_DEFAULT_DATABASE_PORTS,A as FUNCTION_URL_AUTH_TYPES,p as GOVERNANCE_PRESETS,X as HTTP_METHODS,T as LOAD_BALANCER_TYPES,d as MAX_ECS_CAPACITY,L as MAX_LAMBDA_MEMORY,Y as MAX_LAMBDA_TIMEOUT,M as MAX_PORT,u as MAX_SCALING_CAPACITY,F as MAX_WARM_POOL_SIZE,i as MIN_ECS_CAPACITY,D as MIN_LAMBDA_MEMORY,U as MIN_LAMBDA_TIMEOUT,I as MIN_PORT,s as PATTERN_DATABASE_TYPES,O as PATTERN_TYPES,a as PATTERN_TYPE_VALUES,j as S3_ENCRYPTION_TYPES,_ as SCALING_TYPES,V as STORAGE_PRESET_TYPES,C as VALID_MONITORING_INTERVALS,m as constIncludes};
@@ -0,0 +1,151 @@
1
+ import { type BoundaryStatement } from "./securityBoundary.js";
2
+ /**
3
+ * Dev-tier IAM surface for the fast-dev-environments server-side gate
4
+ * (aiDocs plans/2026-07-05-fast-dev-environments-implementation.md §4.2 G3/G4).
5
+ *
6
+ * This module is the single source of truth for the THREE policy vehicles that
7
+ * render the same dev-tier documents (three-rendering parity — security-load-
8
+ * bearing coupled values):
9
+ * 1. the connector CDK construct
10
+ * (`components/infrastructure/lib/config/aws/oidcConnector.ts`) — consumes
11
+ * these builders directly, so construct⇔SSoT parity holds by construction;
12
+ * 2. the static Quick-Create template
13
+ * (`publicAssets/fjall/publicAssets/assets/oidc-connector.yaml`) — hand-
14
+ * mirrors the rendered JSON, locked by the deep-compare fixture in
15
+ * `components/infrastructure/lib/__tests__/devRoleParity.test.ts`;
16
+ * 3. the webapp `dev-gate-remediate` pass (Phase-2 Increment C) — imports
17
+ * these builders via the `@fjall/generator/schemas` subpath.
18
+ *
19
+ * Roles rendered ONLY in development-STAGE accounts (workload stage — never
20
+ * the account TIER axis):
21
+ * - `FjallDevDeploy{orgId}` — member-reachable, scoped dev policy (never
22
+ * AdministratorAccess), trusted by `org:{orgId}:dev:{accountId}:*` only.
23
+ * - `FjallDevProvisioner{orgId}` — worker-only IAM/master-secret privileges,
24
+ * trusted by the server-minted `org:{orgId}:dev-provisioner` subject.
25
+ * - `FjallDevSyncWriter{orgId}` — the §7 presigning principal, trusted by
26
+ * the server-minted `org:{orgId}:dev-sync` subject.
27
+ * - `FjallDevBoundary` — permissions boundary capping every role the
28
+ * provisioner creates (per-slot task roles). NOT attached to the trio
29
+ * themselves.
30
+ *
31
+ * Convention-scoping law: these documents are rendered at CONNECT time, before
32
+ * any app or substrate exists, so every resource scope is a naming/path/tag
33
+ * convention (`/fjall/dev/*`, `fjall-dev-*`, `fjall:dev=true`,
34
+ * `fjall-dev-sync-<accountId>-*`) — never a per-app instance ARN.
35
+ *
36
+ * Partition is hardcoded `aws` to match the Quick-Create template convention
37
+ * (`arn:aws:iam::aws:policy/AdministratorAccess`) — Fjall does not support
38
+ * GovCloud/China partitions.
39
+ */
40
+ export interface DevPolicyParams {
41
+ /**
42
+ * 12-digit AWS account number of the development-stage account. CDK passes
43
+ * `Stack.of(this).account` (concrete — the account stack always sets env);
44
+ * the static yaml renders with the literal `${AWS::AccountId}` inside
45
+ * `!Sub`; the remediation pass passes the connected account's
46
+ * `awsAccountId`.
47
+ */
48
+ accountId: string;
49
+ }
50
+ export declare function devDeployRoleName(fjallOrgId: string): string;
51
+ export declare function devProvisionerRoleName(fjallOrgId: string): string;
52
+ export declare function devSyncWriterRoleName(fjallOrgId: string): string;
53
+ /**
54
+ * Inline-policy names on the trio — coupled across all three rendering
55
+ * vehicles (the remediation pass's `PutRolePolicy` must target the same name
56
+ * the construct and yaml render, or it creates a SECOND policy alongside the
57
+ * stale one).
58
+ */
59
+ export declare const DEV_DEPLOY_POLICY_NAME = "FjallDevDeployPolicy";
60
+ export declare const DEV_PROVISIONER_POLICY_NAME = "FjallDevProvisionerPolicy";
61
+ export declare const DEV_SYNC_WRITER_POLICY_NAME = "FjallDevSyncWriterPolicy";
62
+ /**
63
+ * Deliberately NOT org-suffixed (unlike `deployBoundaryName`): the
64
+ * provisioner's `iam:PermissionsBoundary` condition needs an ARN writable at
65
+ * connect time, and the boundary content is org-independent (account
66
+ * conventions only). The `dev-gate-remediate` vehicle adopts on
67
+ * EntityAlreadyExists.
68
+ */
69
+ export declare const DEV_BOUNDARY_POLICY_NAME = "FjallDevBoundary";
70
+ export declare function devBoundaryPolicyArn(accountId: string): string;
71
+ /** Server-minted service subject for the worker-only provisioner role. */
72
+ export declare function devProvisionerSubject(fjallOrgId: string): string;
73
+ /** Server-minted service subject for the §7 presigning sync-writer role. */
74
+ export declare function devSyncSubject(fjallOrgId: string): string;
75
+ /**
76
+ * One statement of an OIDC federated trust (assume-role policy) document.
77
+ * Distinct from `BoundaryStatement` because trust statements carry a
78
+ * Principal.
79
+ */
80
+ export interface OidcTrustStatement {
81
+ Sid: string;
82
+ Effect: "Allow";
83
+ Principal: {
84
+ Federated: string;
85
+ };
86
+ Action: "sts:AssumeRoleWithWebIdentity";
87
+ Condition: Record<string, Record<string, string | string[]>>;
88
+ }
89
+ export interface OidcTrustParams {
90
+ fjallOrgId: string;
91
+ /** ARN of the account-global Fjall OIDC provider (token/`!Sub` reference). */
92
+ providerArn: string;
93
+ /** Issuer domain without scheme, e.g. `fjall.io`. */
94
+ issuerDomain: string;
95
+ }
96
+ /**
97
+ * G4 narrowed trust for `FjallDeploy{orgId}` — replaces the single bare
98
+ * `StringLike sub: org:{orgId}:*` (which matched EVERY subject including dev
99
+ * ones). Each condition class is its OWN Allow statement: conditions inside
100
+ * one statement AND together, so a single-statement rendering would match
101
+ * nothing.
102
+ *
103
+ * Dev subjects (`org:{orgId}:dev:…`) and the Phase-3 service subjects
104
+ * (`dev-provisioner`, `dev-sync`) match NONE of these — they have dedicated
105
+ * roles and must never assume the admin role.
106
+ */
107
+ export declare function buildNarrowedDeployTrustStatements(params: OidcTrustParams): OidcTrustStatement[];
108
+ /**
109
+ * Trust for `FjallDevDeploy{orgId}` — account-pinned: a bare `dev:*` would let
110
+ * a token minted for dev account A assume the role in dev account B, silently
111
+ * discarding G1's per-account intent in multi-dev-account orgs.
112
+ */
113
+ export declare function buildDevDeployTrustStatements(params: OidcTrustParams & DevPolicyParams): OidcTrustStatement[];
114
+ export declare function buildDevProvisionerTrustStatements(params: OidcTrustParams): OidcTrustStatement[];
115
+ export declare function buildDevSyncWriterTrustStatements(params: OidcTrustParams): OidcTrustStatement[];
116
+ /**
117
+ * `FjallDevDeploy{orgId}` identity policy — member-reachable, so it carries NO
118
+ * worker-only privileges (no IAM writes beyond resource-scoped PassRole, no
119
+ * master-secret read, no ECR deletes). The ECS/ELBv2/logs halves are each
120
+ * split into resource-tag-conditioned mutations, RequestTag-conditioned
121
+ * creates (+ the service's tag-on-create action), and unscoped reads — a
122
+ * single uniform tag-conditioned statement per service is not implementable
123
+ * (`ecs:RegisterTaskDefinition` supports only `aws:RequestTag`; several reads
124
+ * support no resource-level scoping at all).
125
+ */
126
+ export declare function buildDevDeployPolicyStatements({ accountId, }: DevPolicyParams): BoundaryStatement[];
127
+ /**
128
+ * `FjallDevProvisioner{orgId}` identity policy — worker-only. IAM CreateRole
129
+ * cannot constrain the trust-policy CONTENT of the role being created, so
130
+ * every IAM-write privilege lives here (a member-reachable CreateRole would
131
+ * let any org member mint a boundary-compliant role trusted by an arbitrary
132
+ * external account).
133
+ */
134
+ export declare function buildDevProvisionerPolicyStatements({ accountId, }: DevPolicyParams): BoundaryStatement[];
135
+ /**
136
+ * `FjallDevSyncWriter{orgId}` identity policy — the §7 presigning principal.
137
+ * The webapp assumes it per presign request with a per-slot-prefix inline
138
+ * session policy (server-enforceable — the webapp is the STS caller); this
139
+ * grant is the ceiling that session policy narrows. GetObject covers the
140
+ * CLI's presigned poll of the `.applied/<manifestId>` ack marker.
141
+ */
142
+ export declare function buildDevSyncWriterPolicyStatements({ accountId, }: DevPolicyParams): BoundaryStatement[];
143
+ /**
144
+ * `FjallDevBoundary` — permissions boundary for every role the provisioner
145
+ * creates (per-slot task roles). A boundary is an INTERSECTION: an allow-set
146
+ * omission fails silently at task start, so this document and the step-3
147
+ * role policy must be maintained as a pair. Allow-set is exactly what a slot
148
+ * task needs and nothing more — NO IAM actions at all, so even a role created
149
+ * through the conditioned path cannot mint further roles.
150
+ */
151
+ export declare function buildDevBoundaryStatements({ accountId, }: DevPolicyParams): BoundaryStatement[];
@@ -0,0 +1 @@
1
+ function u(e){return`FjallDevDeploy${e}`}function d(e){return`FjallDevProvisioner${e}`}function g(e){return`FjallDevSyncWriter${e}`}const f="FjallDevDeployPolicy",v="FjallDevProvisionerPolicy",A="FjallDevSyncWriterPolicy",s="FjallDevBoundary";function i(e){return`arn:aws:iam::${e}:policy/${s}`}function n(e){return`org:${e}:dev-provisioner`}function c(e){return`org:${e}:dev-sync`}function S(e){const{fjallOrgId:a,providerArn:t,issuerDomain:l}=e,o={[`${l}:aud`]:"sts.amazonaws.com"};return[{Sid:"FjallMachineSubject",Effect:"Allow",Principal:{Federated:t},Action:"sts:AssumeRoleWithWebIdentity",Condition:{StringEquals:{...o,[`${l}:sub`]:`org:${a}:*`}}},{Sid:"FjallUserSubjects",Effect:"Allow",Principal:{Federated:t},Action:"sts:AssumeRoleWithWebIdentity",Condition:{StringEquals:o,StringLike:{[`${l}:sub`]:`org:${a}:user:*`}}},{Sid:"FjallServiceSubjects",Effect:"Allow",Principal:{Federated:t},Action:"sts:AssumeRoleWithWebIdentity",Condition:{StringEquals:{...o,[`${l}:sub`]:[`org:${a}:discovery`,`org:${a}:connection`,`org:${a}:org-setup`]}}}]}function D(e){const{fjallOrgId:a,providerArn:t,issuerDomain:l,accountId:o}=e;return[{Sid:"FjallDevSubjectsThisAccount",Effect:"Allow",Principal:{Federated:t},Action:"sts:AssumeRoleWithWebIdentity",Condition:{StringEquals:{[`${l}:aud`]:"sts.amazonaws.com"},StringLike:{[`${l}:sub`]:`org:${a}:dev:${o}:*`}}}]}function r(e){const{providerArn:a,issuerDomain:t,sid:l,subject:o}=e;return[{Sid:l,Effect:"Allow",Principal:{Federated:a},Action:"sts:AssumeRoleWithWebIdentity",Condition:{StringEquals:{[`${t}:aud`]:"sts.amazonaws.com",[`${t}:sub`]:o}}}]}function R(e){return r({...e,sid:"FjallDevProvisionerSubject",subject:n(e.fjallOrgId)})}function m(e){return r({...e,sid:"FjallDevSyncSubject",subject:c(e.fjallOrgId)})}function j({accountId:e}){return[{Sid:"FjallDevEcsTaggedMutations",Effect:"Allow",Action:["ecs:UpdateService","ecs:DeleteService","ecs:RunTask","ecs:StopTask"],Resource:`arn:aws:ecs:*:${e}:*`,Condition:{StringEquals:{"aws:ResourceTag/fjall:dev":"true"}}},{Sid:"FjallDevEcsTaggedCreates",Effect:"Allow",Action:["ecs:RegisterTaskDefinition","ecs:CreateService"],Resource:"*",Condition:{StringEquals:{"aws:RequestTag/fjall:dev":"true"}}},{Sid:"FjallDevEcsTagOnCreate",Effect:"Allow",Action:["ecs:TagResource"],Resource:`arn:aws:ecs:*:${e}:*`,Condition:{StringEquals:{"ecs:CreateAction":["RegisterTaskDefinition","CreateService","RunTask"]}}},{Sid:"FjallDevEcsReads",Effect:"Allow",Action:["ecs:Describe*","ecs:List*"],Resource:"*"},{Sid:"FjallDevEcsDeregisterTaskDefinition",Effect:"Allow",Action:["ecs:DeregisterTaskDefinition"],Resource:`arn:aws:ecs:*:${e}:task-definition/fjall-dev-*`},{Sid:"FjallDevElbTaggedMutations",Effect:"Allow",Action:["elasticloadbalancing:ModifyRule","elasticloadbalancing:DeleteRule","elasticloadbalancing:ModifyTargetGroup","elasticloadbalancing:ModifyTargetGroupAttributes","elasticloadbalancing:DeleteTargetGroup","elasticloadbalancing:RegisterTargets","elasticloadbalancing:DeregisterTargets"],Resource:`arn:aws:elasticloadbalancing:*:${e}:*`,Condition:{StringEquals:{"aws:ResourceTag/fjall:dev":"true"}}},{Sid:"FjallDevElbTaggedCreates",Effect:"Allow",Action:["elasticloadbalancing:CreateTargetGroup","elasticloadbalancing:CreateRule"],Resource:`arn:aws:elasticloadbalancing:*:${e}:*`,Condition:{StringEquals:{"aws:RequestTag/fjall:dev":"true"}}},{Sid:"FjallDevElbTagOnCreate",Effect:"Allow",Action:["elasticloadbalancing:AddTags"],Resource:`arn:aws:elasticloadbalancing:*:${e}:*`,Condition:{StringEquals:{"elasticloadbalancing:CreateAction":["CreateTargetGroup","CreateRule"]}}},{Sid:"FjallDevElbReads",Effect:"Allow",Action:["elasticloadbalancing:Describe*"],Resource:"*"},{Sid:"FjallDevSsmDevTree",Effect:"Allow",Action:["ssm:GetParameter*","ssm:PutParameter","ssm:AddTagsToResource"],Resource:`arn:aws:ssm:*:${e}:parameter/fjall/dev/*`},{Sid:"FjallDevLogsTaggedMutations",Effect:"Allow",Action:["logs:PutRetentionPolicy","logs:DeleteLogGroup"],Resource:`arn:aws:logs:*:${e}:log-group:/fjall/dev/*`,Condition:{StringEquals:{"aws:ResourceTag/fjall:dev":"true"}}},{Sid:"FjallDevLogsTaggedCreate",Effect:"Allow",Action:["logs:CreateLogGroup","logs:TagResource"],Resource:`arn:aws:logs:*:${e}:log-group:/fjall/dev/*`,Condition:{StringEquals:{"aws:RequestTag/fjall:dev":"true"}}},{Sid:"FjallDevLogsRead",Effect:"Allow",Action:["logs:GetLogEvents","logs:DescribeLogStreams","logs:FilterLogEvents"],Resource:`arn:aws:logs:*:${e}:log-group:/fjall/dev/*`},{Sid:"FjallDevLogsDescribeGroups",Effect:"Allow",Action:["logs:DescribeLogGroups"],Resource:"*"},{Sid:"FjallDevKmsViaDevAlias",Effect:"Allow",Action:["kms:Encrypt","kms:Decrypt","kms:GenerateDataKey"],Resource:`arn:aws:kms:*:${e}:key/*`,Condition:{"ForAnyValue:StringLike":{"kms:ResourceAliases":"alias/fjall-dev-*"}}},{Sid:"FjallDevEcrAuthToken",Effect:"Allow",Action:["ecr:GetAuthorizationToken"],Resource:"*"},{Sid:"FjallDevEcrPushPull",Effect:"Allow",Action:["ecr:PutImage","ecr:InitiateLayerUpload","ecr:UploadLayerPart","ecr:CompleteLayerUpload","ecr:BatchCheckLayerAvailability","ecr:BatchGetImage","ecr:GetDownloadUrlForLayer","ecr:DescribeImages"],Resource:`arn:aws:ecr:*:${e}:repository/*`},{Sid:"FjallDevPassDevPathRoles",Effect:"Allow",Action:["iam:PassRole"],Resource:`arn:aws:iam::${e}:role/fjall/dev/*`}]}function w({accountId:e}){return[{Sid:"FjallDevProvisionerBoundedRoleWrites",Effect:"Allow",Action:["iam:CreateRole","iam:PutRolePolicy","iam:AttachRolePolicy"],Resource:`arn:aws:iam::${e}:role/fjall/dev/*`,Condition:{StringEquals:{"iam:PermissionsBoundary":i(e)}}},{Sid:"FjallDevProvisionerPathRoleOps",Effect:"Allow",Action:["iam:DeleteRole","iam:DeleteRolePolicy","iam:DetachRolePolicy","iam:ListRolePolicies","iam:TagRole"],Resource:`arn:aws:iam::${e}:role/fjall/dev/*`},{Sid:"FjallDevProvisionerListRoles",Effect:"Allow",Action:["iam:ListRoles"],Resource:"*"},{Sid:"FjallDevProvisionerDevMasterSecrets",Effect:"Allow",Action:["secretsmanager:GetSecretValue"],Resource:`arn:aws:secretsmanager:*:${e}:secret:fjall-dev-*`},{Sid:"FjallDevProvisionerDataApi",Effect:"Allow",Action:["rds-data:ExecuteStatement","rds-data:BatchExecuteStatement","rds-data:BeginTransaction","rds-data:CommitTransaction","rds-data:RollbackTransaction"],Resource:`arn:aws:rds:*:${e}:cluster:fjall-dev-*`},{Sid:"FjallDevProvisionerMetrics",Effect:"Allow",Action:["cloudwatch:GetMetricData"],Resource:"*"},{Sid:"FjallDevProvisionerOrphanDiscovery",Effect:"Allow",Action:["tag:GetResources"],Resource:"*"},{Sid:"FjallDevProvisionerSsmTeardown",Effect:"Allow",Action:["ssm:DeleteParameter*"],Resource:`arn:aws:ssm:*:${e}:parameter/fjall/dev/*`},{Sid:"FjallDevProvisionerLogsTeardown",Effect:"Allow",Action:["logs:DeleteLogGroup"],Resource:`arn:aws:logs:*:${e}:log-group:/fjall/dev/*`},{Sid:"FjallDevProvisionerTaggedTeardown",Effect:"Allow",Action:["ecs:UpdateService","ecs:StopTask","ecs:DeleteService","elasticloadbalancing:DeleteRule","elasticloadbalancing:DeleteTargetGroup","elasticloadbalancing:DeregisterTargets"],Resource:[`arn:aws:ecs:*:${e}:*`,`arn:aws:elasticloadbalancing:*:${e}:*`],Condition:{StringEquals:{"aws:ResourceTag/fjall:dev":"true"}}},{Sid:"FjallDevProvisionerImageJanitor",Effect:"Allow",Action:["ecr:ListImages","ecr:DescribeImages","ecr:BatchDeleteImage"],Resource:`arn:aws:ecr:*:${e}:repository/*`},{Sid:"FjallDevProvisionerSsmReadAll",Effect:"Allow",Action:["ssm:GetParameter*"],Resource:`arn:aws:ssm:*:${e}:parameter/*`},{Sid:"FjallDevProvisionerKmsDecryptViaSsm",Effect:"Allow",Action:["kms:Decrypt"],Resource:`arn:aws:kms:*:${e}:key/*`,Condition:{StringLike:{"kms:ViaService":"ssm.*.amazonaws.com"}}}]}function E({accountId:e}){return[{Sid:"FjallDevSyncPrefixReadWrite",Effect:"Allow",Action:["s3:GetObject","s3:PutObject"],Resource:`arn:aws:s3:::fjall-dev-sync-${e}-*/*`,Condition:{StringEquals:{"aws:ResourceAccount":e}}}]}function p({accountId:e}){return[{Sid:"FjallDevBoundarySsmDevRead",Effect:"Allow",Action:["ssm:GetParameter*"],Resource:`arn:aws:ssm:*:${e}:parameter/fjall/dev/*`},{Sid:"FjallDevBoundaryKmsDecryptDevAlias",Effect:"Allow",Action:["kms:Decrypt"],Resource:`arn:aws:kms:*:${e}:key/*`,Condition:{"ForAnyValue:StringLike":{"kms:ResourceAliases":"alias/fjall-dev-*"}}},{Sid:"FjallDevBoundarySyncPrefixReadWrite",Effect:"Allow",Action:["s3:GetObject","s3:PutObject"],Resource:`arn:aws:s3:::fjall-dev-sync-${e}-*/*`,Condition:{StringEquals:{"aws:ResourceAccount":e}}},{Sid:"FjallDevBoundarySlotLogs",Effect:"Allow",Action:["logs:CreateLogStream","logs:PutLogEvents"],Resource:`arn:aws:logs:*:${e}:log-group:/fjall/dev/*`},{Sid:"FjallDevBoundarySyncQueue",Effect:"Allow",Action:["sqs:ReceiveMessage","sqs:DeleteMessage","sqs:GetQueueUrl"],Resource:`arn:aws:sqs:*:${e}:fjall-dev-sync-${e}-*`}]}export{s as DEV_BOUNDARY_POLICY_NAME,f as DEV_DEPLOY_POLICY_NAME,v as DEV_PROVISIONER_POLICY_NAME,A as DEV_SYNC_WRITER_POLICY_NAME,p as buildDevBoundaryStatements,j as buildDevDeployPolicyStatements,D as buildDevDeployTrustStatements,w as buildDevProvisionerPolicyStatements,R as buildDevProvisionerTrustStatements,E as buildDevSyncWriterPolicyStatements,m as buildDevSyncWriterTrustStatements,S as buildNarrowedDeployTrustStatements,i as devBoundaryPolicyArn,u as devDeployRoleName,d as devProvisionerRoleName,n as devProvisionerSubject,c as devSyncSubject,g as devSyncWriterRoleName};
@@ -1,4 +1,5 @@
1
1
  export * from "./resourceSchemas.js";
2
2
  export * from "./constants.js";
3
3
  export * from "./securityBoundary.js";
4
+ export * from "./devRolePolicies.js";
4
5
  export { type AmiHardwareType, getArchitectureForInstanceType, validateArchitectureMatch, isArchitectureCompatible, } from "./instanceTypeArchitecture.js";
@@ -1 +1 @@
1
- export*from"./resourceSchemas.js";export*from"./constants.js";export*from"./securityBoundary.js";import{getArchitectureForInstanceType as i,validateArchitectureMatch as p,isArchitectureCompatible as a}from"./instanceTypeArchitecture.js";export{i as getArchitectureForInstanceType,a as isArchitectureCompatible,p as validateArchitectureMatch};
1
+ export*from"./resourceSchemas.js";export*from"./constants.js";export*from"./securityBoundary.js";export*from"./devRolePolicies.js";import{getArchitectureForInstanceType as i,validateArchitectureMatch as m,isArchitectureCompatible as a}from"./instanceTypeArchitecture.js";export{i as getArchitectureForInstanceType,a as isArchitectureCompatible,m as validateArchitectureMatch};
@@ -1 +1 @@
1
- export declare const GENERATOR_VERSION = "2.23.1";
1
+ export declare const GENERATOR_VERSION = "2.26.1";
@@ -1 +1 @@
1
- const E="2.23.1";export{E as GENERATOR_VERSION};
1
+ const E="2.26.1";export{E as GENERATOR_VERSION};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fjall/generator",
3
- "version": "2.24.0",
3
+ "version": "2.27.0",
4
4
  "description": "Pure infrastructure generation logic for Fjall",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
@@ -47,7 +47,7 @@
47
47
  },
48
48
  "license": "SEE LICENSE IN LICENSE",
49
49
  "dependencies": {
50
- "@fjall/util": "^2.24.0",
50
+ "@fjall/util": "^2.27.0",
51
51
  "ast-types": "^0.16.1",
52
52
  "recast": "^0.23.11",
53
53
  "ts-morph": "^28.0.0",
@@ -63,5 +63,5 @@
63
63
  "typescript-eslint": "^8.59.1",
64
64
  "vitest": "^4.1.5"
65
65
  },
66
- "gitHead": "616d7af846f0eebfa3409f5f47c98fbee836bad9"
66
+ "gitHead": "921ecd4f65f52c17037a8a24834d7e4c196b9347"
67
67
  }