@fjall/util 2.34.0 → 3.0.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 +1 -1
- package/dist/async/concurrency.js +1 -1
- package/dist/async/singleton.js +1 -1
- package/dist/async/sleep.js +1 -1
- package/dist/aws/CloudFormationFailureAnalyser.js +1 -1
- package/dist/aws/cloudformationTypes.js +1 -1
- package/dist/aws/deployProgress.js +1 -1
- package/dist/aws/driftSuspects.js +1 -1
- package/dist/aws/errors.js +1 -1
- package/dist/aws/ipamTags.js +1 -1
- package/dist/aws/maskFailureAnalysis.js +1 -1
- package/dist/buildConcurrency.js +1 -1
- package/dist/cdkTmpdirCleanup.js +1 -1
- package/dist/config.js +1 -1
- package/dist/constructMap.js +1 -1
- package/dist/docker/DockerCli.build.js +1 -1
- package/dist/docker/DockerCli.daemon.js +1 -1
- package/dist/docker/DockerCli.js +1 -1
- package/dist/docker/DockerCli.registry.js +3 -3
- package/dist/docker/abortHelpers.js +1 -1
- package/dist/docker/bakeGuard.js +1 -1
- package/dist/docker/buildArgInference.js +1 -1
- package/dist/docker/buildxArgvBuilder.js +1 -1
- package/dist/docker/buildxBuildMonitor.js +1 -1
- package/dist/docker/cacheRepository.js +1 -1
- package/dist/docker/dockerCliSchemas.js +1 -1
- package/dist/docker/ecrCredentialStore.js +1 -1
- package/dist/docker/metadataFileParser.js +1 -1
- package/dist/docker/projectBuildxResult.js +1 -1
- package/dist/docker/rawjsonParser.js +1 -1
- package/dist/docker/rawjsonToVertexEvent.js +1 -1
- package/dist/docker/result.js +1 -1
- package/dist/environments.js +1 -1
- package/dist/errorUtils.js +1 -1
- package/dist/fsHelpers.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/infra/deployArtefacts.js +1 -1
- package/dist/infra/deriveContentHashTag.js +1 -1
- package/dist/infra/domainExports.d.ts +28 -0
- package/dist/infra/domainExports.js +1 -1
- package/dist/infra/imageTags.js +1 -1
- package/dist/infra/regions.js +1 -1
- package/dist/insights/computePatternFingerprint.js +1 -1
- package/dist/logger.js +2 -2
- package/dist/manifest/io.js +1 -1
- package/dist/manifest/schemas.js +1 -1
- package/dist/mcpProtocol/index.js +1 -1
- package/dist/migration/clickhouseSqlUsers.js +1 -1
- package/dist/migration/compareSchemaVersion.js +1 -1
- package/dist/migration/pickLatestClickHouseMigration.js +1 -1
- package/dist/migration/pickLatestPrismaMigration.js +1 -1
- package/dist/migration/verifyExpectedSchemaVersion.js +1 -1
- package/dist/migration/verifyExpectedSchemaVersion.test.js +1 -1
- package/dist/naming/accountNameCollision.js +1 -1
- package/dist/naming/caseConversion.js +1 -1
- package/dist/naming/connectedAccountName.js +1 -1
- package/dist/naming/reservedAppNames.js +1 -1
- package/dist/patterns/patternTypes.js +1 -1
- package/dist/patterns/staticSiteForms.js +1 -1
- package/dist/repo/appPath.js +1 -1
- package/dist/repo/findInfrastructurePaths.js +1 -1
- package/dist/repo/findRepoRoot.js +1 -1
- package/dist/repo/gitRemoteParser.js +1 -1
- package/dist/repo/inferContainerFromCandidates.js +1 -1
- package/dist/repo/scanLocalRepository.js +1 -1
- package/dist/resourceCategorisation.js +1 -1
- package/dist/secrets.js +3 -3
- package/dist/securityHelpers.js +1 -1
- package/dist/targets.js +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{DNS_APEX as E,getDomainExportNames as o}from"./infra/domainExports.js";import{BACKUP_VAULT_NAME as
|
|
1
|
+
import{DNS_APEX as E,getDomainExportNames as o,isManagedDomainBinding as t}from"./infra/domainExports.js";import{BACKUP_VAULT_NAME as S}from"./infra/backupVault.js";import{APPROVAL_TOKEN_OUTPUT_PREFIX as A,TOKEN_STDERR_PREFIX as T}from"./deploy/approvalTokenOutput.js";import{imageTagParameterName as n}from"./infra/imageTags.js";import{toPascalCase as N,toKebab as m,toValidDatabaseName as s,toScreamingSnake as O,capitalise as P,getSafeZoneName as C,accountConstructKey as p,hasAsciiStableConstructKey as f}from"./naming/caseConversion.js";import{findAccountNameCollision as g}from"./naming/accountNameCollision.js";import{defaultConnectedAccountName as M,suffixedAccountName as D,REGION_SHORT_CODES as x,findTrailingRegionShortCode as u,regionSuffixRejectionMessage as d}from"./naming/connectedAccountName.js";import{normaliseError as l,getErrorMessage as L,hasErrorCode as V,getErrorCode as h,getErrorStack as F,formatErrorString as G}from"./errorUtils.js";import{singleton as H}from"./async/singleton.js";import{DANGEROUS_ENV_VARS as X,filterDangerousEnvVars as Y,maskSensitiveOutput as y,parseShellArgs as B,SCOPED_TOKEN_REGEX as K}from"./securityHelpers.js";import{sleep as k}from"./async/sleep.js";import{mapSettledWithConcurrency as z}from"./async/concurrency.js";import{ACCOUNT_STAGES_WITH_ROOT as q,STRUCTURAL_ENVIRONMENTS as w,ACCOUNT_STAGES as J,ACCOUNT_STAGE_LABELS as Q,isAccountStage as $,ACCOUNT_TIERS as ee,AccountTierSchema as re,isAccountTier as Ee,environmentToTier as oe,stageFromWireEnvironment as te,accountTier as _e,getEnvironmentLabel as Se,ACCOUNT_ROLES as ae}from"./environments.js";import{RESOURCE_CATEGORIES as Te,categoriseResource as Re,getExpectedDuration as ne,getFriendlyResourceType as ie}from"./resourceCategorisation.js";import{parseGitRemoteUrl as me}from"./repo/gitRemoteParser.js";import{abbreviateRegion as Oe,AWS_REGIONS_METADATA as Pe,DEFAULT_REGION as Ce,getRegionInfo as pe,MAX_SECONDARY_REGIONS as fe,OPT_IN_REGION_CODES as ce,optInRegionWarning as ge,regions as Ie,suggestRegionForTimezone as Me}from"./infra/regions.js";import{SCOPE_VALUES as xe,MACHINE_ONLY_SCOPES as ue,USER_GRANTABLE_SCOPES as de}from"./infra/tokenScopes.js";import{SECRET_NAME_PATTERN as le,SECRET_NAME_ERROR as Le,SSM_COMPONENT_PATTERN as Ve,SSM_COMPONENT_ERROR as he,SSM_STANDARD_MAX_VALUE_BYTES as Fe,SecretNamespaceSchema as Ge,buildNamespaceParts as ve,buildParameterPath as He,parseParameterPath as be,isManageablePath as Xe,parseDotEnv as Ye,escapeDotEnvValue as ye}from"./secrets.js";import{ConnectionWireSchema as Ke,ConnectionsListResponseSchema as We}from"./infra/connectionsWire.js";import{deriveRegionsFromOrgConfig as je,deriveTargets as ze,deriveAllTargets as Ze,environmentOrTier as qe,findTarget as we,generateTargetName as Je}from"./targets.js";import{buildAppConfigPath as $e}from"./repo/appPath.js";import{findInfrastructurePaths as rr,findBoundaryPath as Er,isInfrastructureFile as or}from"./repo/findInfrastructurePaths.js";import{inferContainerFromCandidates as _r}from"./repo/inferContainerFromCandidates.js";import{RESERVED_APP_NAMES as ar,RESERVED_APP_NAME_MESSAGE as Ar,isReservedAppName as Tr,RESERVED_APP_NAME_SUFFIX as Rr,RESERVED_APP_NAME_SUFFIX_MESSAGE as nr,hasReservedAppNameSuffix as ir}from"./naming/reservedAppNames.js";import{deriveContentHashTag as mr,CONTENT_HASH_TAG_PATTERN as sr}from"./infra/deriveContentHashTag.js";import{DEPLOY_MODES as Pr,DeployModeSchema as Cr,IMAGE_TAG_PATTERN as pr,ImageTagSchema as fr,ServiceArtefactSchema as cr,ServiceArtefactsSchema as gr,ARTEFACT_OUTPUT_FIELDS as Ir,artefactOutputKey as Mr}from"./infra/deployArtefacts.js";import{MIGRATION_SNAPSHOT_NAME_PREFIX as xr,EXPECTED_SCHEMA_VERSION_ENV as ur,EXPECTED_SCHEMA_VERSION_TOOL_ENV as dr,EXPECTED_CH_SCHEMA_VERSION_ENV as Ur,SCHEMA_ADMIN_USER_ENV as lr,SCHEMA_ADMIN_PASSWORD_ENV as Lr,PRISMA_MIGRATION_DIR_RE as Vr,CLICKHOUSE_MIGRATION_SKIP_RE as hr}from"./migration/constants.js";import{PHYSICAL_NAME_FALLBACK_PROPERTIES as Gr}from"./cfn/physicalNameProperties.js";import{PATTERN_TYPE_VALUES as Hr,PATTERN_TYPES as br,isPatternType as Xr,PATTERN_REGISTRY as Yr,DEPLOYABLE_PATTERN_TYPES as yr,OPENNEXT_PATTERN_TYPES as Br,isOpenNextPatternType as Kr,STATIC_SITE_ROUTING_VALUES as Wr}from"./patterns/patternTypes.js";import{DEFAULT_FORMS_FROM_LOCAL_PART as jr,defaultFormsFromAddress as zr,defaultFormsCorsOrigin as Zr,isAddressAtDomain as qr}from"./patterns/staticSiteForms.js";import{DEV_SUBSTRATE_PARAMS_SCHEMA_VERSION as Jr,DEV_SUBSTRATE_PARAMS_FILENAME as Qr,DevSubstrateSynthPropsSchema as $r,DevSubstrateParamsSchema as eE}from"./devSubstrate/params.js";import{DEV_SUBSTRATE_ENTRYPOINT_SOURCE as EE}from"./devSubstrate/entrypoint.js";export{ae as ACCOUNT_ROLES,J as ACCOUNT_STAGES,q as ACCOUNT_STAGES_WITH_ROOT,Q as ACCOUNT_STAGE_LABELS,ee as ACCOUNT_TIERS,A as APPROVAL_TOKEN_OUTPUT_PREFIX,Ir as ARTEFACT_OUTPUT_FIELDS,Pe as AWS_REGIONS_METADATA,re as AccountTierSchema,S as BACKUP_VAULT_NAME,hr as CLICKHOUSE_MIGRATION_SKIP_RE,sr as CONTENT_HASH_TAG_PATTERN,Ke as ConnectionWireSchema,We as ConnectionsListResponseSchema,X as DANGEROUS_ENV_VARS,jr as DEFAULT_FORMS_FROM_LOCAL_PART,Ce as DEFAULT_REGION,yr as DEPLOYABLE_PATTERN_TYPES,Pr as DEPLOY_MODES,EE as DEV_SUBSTRATE_ENTRYPOINT_SOURCE,Qr as DEV_SUBSTRATE_PARAMS_FILENAME,Jr as DEV_SUBSTRATE_PARAMS_SCHEMA_VERSION,E as DNS_APEX,Cr as DeployModeSchema,eE as DevSubstrateParamsSchema,$r as DevSubstrateSynthPropsSchema,Ur as EXPECTED_CH_SCHEMA_VERSION_ENV,ur as EXPECTED_SCHEMA_VERSION_ENV,dr as EXPECTED_SCHEMA_VERSION_TOOL_ENV,pr as IMAGE_TAG_PATTERN,fr as ImageTagSchema,ue as MACHINE_ONLY_SCOPES,fe as MAX_SECONDARY_REGIONS,xr as MIGRATION_SNAPSHOT_NAME_PREFIX,Br as OPENNEXT_PATTERN_TYPES,ce as OPT_IN_REGION_CODES,Yr as PATTERN_REGISTRY,br as PATTERN_TYPES,Hr as PATTERN_TYPE_VALUES,Gr as PHYSICAL_NAME_FALLBACK_PROPERTIES,Vr as PRISMA_MIGRATION_DIR_RE,x as REGION_SHORT_CODES,ar as RESERVED_APP_NAMES,Ar as RESERVED_APP_NAME_MESSAGE,Rr as RESERVED_APP_NAME_SUFFIX,nr as RESERVED_APP_NAME_SUFFIX_MESSAGE,Te as RESOURCE_CATEGORIES,Lr as SCHEMA_ADMIN_PASSWORD_ENV,lr as SCHEMA_ADMIN_USER_ENV,K as SCOPED_TOKEN_REGEX,xe as SCOPE_VALUES,Le as SECRET_NAME_ERROR,le as SECRET_NAME_PATTERN,he as SSM_COMPONENT_ERROR,Ve as SSM_COMPONENT_PATTERN,Fe as SSM_STANDARD_MAX_VALUE_BYTES,Wr as STATIC_SITE_ROUTING_VALUES,w as STRUCTURAL_ENVIRONMENTS,Ge as SecretNamespaceSchema,cr as ServiceArtefactSchema,gr as ServiceArtefactsSchema,T as TOKEN_STDERR_PREFIX,de as USER_GRANTABLE_SCOPES,Oe as abbreviateRegion,p as accountConstructKey,_e as accountTier,Mr as artefactOutputKey,$e as buildAppConfigPath,ve as buildNamespaceParts,He as buildParameterPath,P as capitalise,Re as categoriseResource,M as defaultConnectedAccountName,Zr as defaultFormsCorsOrigin,zr as defaultFormsFromAddress,Ze as deriveAllTargets,mr as deriveContentHashTag,je as deriveRegionsFromOrgConfig,ze as deriveTargets,qe as environmentOrTier,oe as environmentToTier,ye as escapeDotEnvValue,Y as filterDangerousEnvVars,g as findAccountNameCollision,Er as findBoundaryPath,rr as findInfrastructurePaths,we as findTarget,u as findTrailingRegionShortCode,G as formatErrorString,Je as generateTargetName,o as getDomainExportNames,Se as getEnvironmentLabel,h as getErrorCode,L as getErrorMessage,F as getErrorStack,ne as getExpectedDuration,ie as getFriendlyResourceType,pe as getRegionInfo,C as getSafeZoneName,f as hasAsciiStableConstructKey,V as hasErrorCode,ir as hasReservedAppNameSuffix,n as imageTagParameterName,_r as inferContainerFromCandidates,$ as isAccountStage,Ee as isAccountTier,qr as isAddressAtDomain,or as isInfrastructureFile,Xe as isManageablePath,t as isManagedDomainBinding,Kr as isOpenNextPatternType,Xr as isPatternType,Tr as isReservedAppName,z as mapSettledWithConcurrency,y as maskSensitiveOutput,l as normaliseError,ge as optInRegionWarning,Ye as parseDotEnv,me as parseGitRemoteUrl,be as parseParameterPath,B as parseShellArgs,d as regionSuffixRejectionMessage,Ie as regions,H as singleton,k as sleep,te as stageFromWireEnvironment,D as suffixedAccountName,Me as suggestRegionForTimezone,m as toKebab,N as toPascalCase,O as toScreamingSnake,s as toValidDatabaseName};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{z as i}from"zod";const
|
|
1
|
+
var o=Object.defineProperty;var n=(t,e)=>o(t,"name",{value:e,configurable:!0});import{z as i}from"zod";const r=["full","code-only","rollback","restart"],p=i.enum(r),a=/^[a-zA-Z0-9._-]+$/,s=i.string().min(1).max(128).regex(a),c=i.object({serviceName:i.string().min(1),imageTag:s,imageDigest:i.string().min(1).optional(),imageUri:i.string().min(1),ecrRepositoryArn:i.string().min(1).optional(),taskDefinitionArn:i.string().min(1).optional(),previousTaskDefinitionArn:i.string().min(1).optional(),functionArn:i.string().min(1).optional(),publishedVersion:i.string().min(1).optional()}).strict(),l=i.array(c),A=["TaskDefinition","PreviousTaskDefinition","ImageTag","ImageUri","EcrRepositoryArn","ImageDigest"];function T(t,e){return`${t}${e}`}n(T,"artefactOutputKey");export{A as ARTEFACT_OUTPUT_FIELDS,r as DEPLOY_MODES,p as DeployModeSchema,a as IMAGE_TAG_PATTERN,s as ImageTagSchema,c as ServiceArtefactSchema,l as ServiceArtefactsSchema,T as artefactOutputKey};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
var d=Object.defineProperty;var t=(e,s)=>d(e,"name",{value:s,configurable:!0});function g(e){return{success:!0,data:e}}t(g,"success");function r(e){return{success:!1,error:e}}t(r,"failure");const h="sha256:",n=12,E=new RegExp(`-sha-[0-9a-f]{${n}}$`);function T(e,s,c){if(!e.startsWith(h))return r(new Error(`expected sha256:... digest, got ${e.slice(0,32)}`));const o=e.slice(h.length);if(o.length<n)return r(new Error(`digest hex payload too short (need >=${n} chars, got ${o.length})`));const i=s.trim();if(i==="")return r(new Error("serviceName must be a non-empty string"));let a;if(c!==void 0){const u=c.trim();if(u==="")return r(new Error("target, when supplied, must be a non-empty string; omit the argument instead"));a=u.toLowerCase()}const f=o.slice(0,n).toLowerCase(),m=a!==void 0?`${i.toLowerCase()}-${a}`:i.toLowerCase();return g(`${m}-sha-${f}`)}t(T,"deriveContentHashTag");export{E as CONTENT_HASH_TAG_PATTERN,T as deriveContentHashTag};
|
|
@@ -7,15 +7,43 @@ export declare const DNS_APEX: "@";
|
|
|
7
7
|
export declare function getDomainExportNames(domainName: string): {
|
|
8
8
|
hostedZoneId: string;
|
|
9
9
|
certificateArn: string;
|
|
10
|
+
usEast1CertificateArn: string;
|
|
10
11
|
delegationRoleArn: string;
|
|
11
12
|
nameservers: string;
|
|
12
13
|
};
|
|
13
14
|
/**
|
|
14
15
|
* Props for importing zone and certificate from a managed domain stack.
|
|
15
16
|
* When set, app constructs use Fn.importValue() instead of creating inline.
|
|
17
|
+
* Export-name (bare-CDK) fallback: Fn.importValue resolves same-account,
|
|
18
|
+
* same-region only. CLI-driven deploys prefer {@link ManagedDomainBinding}.
|
|
16
19
|
*/
|
|
17
20
|
export interface ManagedDomainExports {
|
|
18
21
|
hostedZoneIdExport: string;
|
|
19
22
|
certificateArnExport: string;
|
|
20
23
|
zoneName: string;
|
|
21
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* Literal-value counterpart to {@link ManagedDomainExports} (D2, domain
|
|
27
|
+
* gold-plating). At deploy time the CLI resolves the domain stack's outputs
|
|
28
|
+
* via DescribeStacks in that stack's own region and injects concrete values
|
|
29
|
+
* into synth. Literal values carry no Fn.importValue constraint (they cross
|
|
30
|
+
* accounts and regions) and keep CDK's CloudFront certificate-region synth
|
|
31
|
+
* guard effective, because the ARNs stay inspectable rather than tokens.
|
|
32
|
+
*/
|
|
33
|
+
export interface ManagedDomainBinding {
|
|
34
|
+
zoneName: string;
|
|
35
|
+
/** Literal hosted-zone ID — the discriminant against `hostedZoneIdExport`. */
|
|
36
|
+
hostedZoneId: string;
|
|
37
|
+
/** Regional certificate ARN (ALB/ECS consumers). */
|
|
38
|
+
certificateArn?: string;
|
|
39
|
+
/** us-east-1 certificate ARN for CloudFront consumers (D3). */
|
|
40
|
+
usEast1CertificateArn?: string;
|
|
41
|
+
/** Parent DelegationRole ARN for child-writes NS delegation (D8), always literal. */
|
|
42
|
+
delegationRoleArn?: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Discriminate a `ManagedDomainExports | ManagedDomainBinding` union so
|
|
46
|
+
* constructs accepting `managedDomain` can branch: a binding carries the
|
|
47
|
+
* literal `hostedZoneId`; the export-name form carries `hostedZoneIdExport`.
|
|
48
|
+
*/
|
|
49
|
+
export declare function isManagedDomainBinding(value: ManagedDomainExports | ManagedDomainBinding): value is ManagedDomainBinding;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
var r=Object.defineProperty;var n=(t,e)=>r(t,"name",{value:e,configurable:!0});const a="@";function i(t){const e=t.replace(/\./g,"-");return{hostedZoneId:`${e}-hosted-zone-id`,certificateArn:`${e}-certificate-arn`,usEast1CertificateArn:`${e}-us-east-1-certificate-arn`,delegationRoleArn:`${e}-delegation-role-arn`,nameservers:`${e}-nameservers`}}n(i,"getDomainExportNames");function s(t){return typeof t.hostedZoneId=="string"}n(s,"isManagedDomainBinding");export{a as DNS_APEX,i as getDomainExportNames,s as isManagedDomainBinding};
|
package/dist/infra/imageTags.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{toPascalCase as
|
|
1
|
+
var m=Object.defineProperty;var e=(a,r)=>m(a,"name",{value:r,configurable:!0});import{toPascalCase as t}from"../naming/caseConversion.js";function i(a){return`${t(a)}ImageTag`}e(i,"imageTagParameterName");export{i as imageTagParameterName};
|
package/dist/infra/regions.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
var i=Object.defineProperty;var t=(e,a)=>i(e,"name",{value:a,configurable:!0});const r="us-east-2",d=10,o=Object.freeze([{code:"us-east-2",name:"US East",city:"Ohio",country:"USA",optIn:!1},{code:"us-west-2",name:"US West",city:"Oregon",country:"USA",optIn:!1},{code:"us-east-1",name:"US East",city:"N. Virginia",country:"USA",optIn:!1},{code:"eu-west-1",name:"EU West",city:"Ireland",country:"Ireland",optIn:!1},{code:"eu-central-1",name:"EU Central",city:"Frankfurt",country:"Germany",optIn:!1},{code:"ap-southeast-1",name:"Asia Pacific",city:"Singapore",country:"Singapore",optIn:!1},{code:"ap-northeast-1",name:"Asia Pacific",city:"Tokyo",country:"Japan",optIn:!1},{code:"ap-southeast-2",name:"Asia Pacific",city:"Sydney",country:"Australia",optIn:!1},{code:"us-west-1",name:"US West",city:"N. California",country:"USA",optIn:!1},{code:"ca-central-1",name:"Canada",city:"Central",country:"Canada",optIn:!1},{code:"af-south-1",name:"Africa",city:"Cape Town",country:"South Africa",optIn:!0},{code:"ap-east-1",name:"Asia Pacific",city:"Hong Kong",country:"Hong Kong",optIn:!0},{code:"ap-northeast-2",name:"Asia Pacific",city:"Seoul",country:"South Korea",optIn:!1},{code:"ap-northeast-3",name:"Asia Pacific",city:"Osaka",country:"Japan",optIn:!1},{code:"ap-south-1",name:"Asia Pacific",city:"Mumbai",country:"India",optIn:!1},{code:"ap-south-2",name:"Asia Pacific",city:"Hyderabad",country:"India",optIn:!0},{code:"ap-southeast-3",name:"Asia Pacific",city:"Jakarta",country:"Indonesia",optIn:!0},{code:"ap-southeast-4",name:"Asia Pacific",city:"Melbourne",country:"Australia",optIn:!0},{code:"eu-central-2",name:"EU Central",city:"Zurich",country:"Switzerland",optIn:!0},{code:"eu-north-1",name:"EU North",city:"Stockholm",country:"Sweden",optIn:!1},{code:"eu-south-1",name:"EU South",city:"Milan",country:"Italy",optIn:!0},{code:"eu-south-2",name:"EU South",city:"Spain",country:"Spain",optIn:!0},{code:"eu-west-2",name:"EU West",city:"London",country:"UK",optIn:!1},{code:"eu-west-3",name:"EU West",city:"Paris",country:"France",optIn:!1},{code:"me-central-1",name:"Middle East",city:"UAE",country:"UAE",optIn:!0},{code:"me-south-1",name:"Middle East",city:"Bahrain",country:"Bahrain",optIn:!0},{code:"sa-east-1",name:"South America",city:"S\xE3o Paulo",country:"Brazil",optIn:!1},{code:"ap-southeast-5",name:"Asia Pacific",city:"Kuala Lumpur",country:"Malaysia",optIn:!0},{code:"ap-southeast-6",name:"Asia Pacific",city:"Auckland",country:"New Zealand",optIn:!0},{code:"ap-southeast-7",name:"Asia Pacific",city:"Bangkok",country:"Thailand",optIn:!0},{code:"ap-east-2",name:"Asia Pacific",city:"Taipei",country:"Taiwan",optIn:!0},{code:"ca-west-1",name:"Canada West",city:"Calgary",country:"Canada",optIn:!0},{code:"il-central-1",name:"Israel",city:"Tel Aviv",country:"Israel",optIn:!0},{code:"mx-central-1",name:"Mexico",city:"Central",country:"Mexico",optIn:!0}]),m=Object.freeze(o.map(e=>e.code)),c=new Set(o.filter(e=>e.optIn).map(e=>e.code));function y(e){return`${e} is an opt-in region: it must be enabled in the AWS account (Account settings \u2192 Regions) before deployment will succeed.`}t(y,"optInRegionWarning");function f(e){return o.find(a=>a.code===e)}t(f,"getRegionInfo");function I(e){const a=e.split("-");return a.length===3&&a[0]&&a[1]&&a[2]?`${a[0]}${a[1][0]}${a[2]}`:e}t(I,"abbreviateRegion");const p=Object.freeze({"Europe/London":"eu-west-2","Europe/Jersey":"eu-west-2","Europe/Guernsey":"eu-west-2","Europe/Isle_of_Man":"eu-west-2","Europe/Dublin":"eu-west-1","Europe/Paris":"eu-west-3","Europe/Berlin":"eu-central-1","Europe/Amsterdam":"eu-central-1","Europe/Brussels":"eu-central-1","Europe/Luxembourg":"eu-central-1","Europe/Vienna":"eu-central-1","Europe/Prague":"eu-central-1","Europe/Warsaw":"eu-central-1","Europe/Budapest":"eu-central-1","Europe/Zurich":"eu-central-2","Europe/Stockholm":"eu-north-1","Europe/Oslo":"eu-north-1","Europe/Copenhagen":"eu-north-1","Europe/Helsinki":"eu-north-1","Europe/Tallinn":"eu-north-1","Europe/Riga":"eu-north-1","Europe/Vilnius":"eu-north-1","Europe/Rome":"eu-south-1","Europe/Malta":"eu-south-1","Europe/Athens":"eu-south-1","Europe/Madrid":"eu-south-2","Europe/Lisbon":"eu-south-2","America/New_York":"us-east-1","America/Detroit":"us-east-1","America/Toronto":"ca-central-1","America/Montreal":"ca-central-1","America/Halifax":"ca-central-1","America/Winnipeg":"ca-central-1","America/Chicago":"us-east-2","America/Indiana/Indianapolis":"us-east-2","America/Mexico_City":"us-east-2","America/Denver":"us-west-2","America/Phoenix":"us-west-2","America/Edmonton":"us-west-2","America/Vancouver":"us-west-2","America/Los_Angeles":"us-west-1","America/Tijuana":"us-west-1","America/Sao_Paulo":"sa-east-1","America/Argentina/Buenos_Aires":"sa-east-1","America/Santiago":"sa-east-1","America/Montevideo":"sa-east-1","America/Lima":"sa-east-1","America/Bogota":"us-east-1","Asia/Tokyo":"ap-northeast-1","Asia/Seoul":"ap-northeast-2","Asia/Hong_Kong":"ap-east-1","Asia/Shanghai":"ap-east-1","Asia/Taipei":"ap-east-1","Asia/Macau":"ap-east-1","Asia/Singapore":"ap-southeast-1","Asia/Kuala_Lumpur":"ap-southeast-1","Asia/Bangkok":"ap-southeast-1","Asia/Ho_Chi_Minh":"ap-southeast-1","Asia/Manila":"ap-southeast-1","Asia/Jakarta":"ap-southeast-3","Asia/Kolkata":"ap-south-1","Asia/Calcutta":"ap-south-1","Asia/Karachi":"ap-south-1","Asia/Dhaka":"ap-south-1","Asia/Colombo":"ap-south-1","Asia/Dubai":"me-central-1","Asia/Muscat":"me-central-1","Asia/Qatar":"me-south-1","Asia/Bahrain":"me-south-1","Asia/Riyadh":"me-south-1","Asia/Kuwait":"me-south-1","Asia/Jerusalem":"me-south-1","Australia/Sydney":"ap-southeast-2","Australia/Brisbane":"ap-southeast-2","Australia/Canberra":"ap-southeast-2","Australia/Melbourne":"ap-southeast-4","Australia/Hobart":"ap-southeast-4","Australia/Adelaide":"ap-southeast-4","Pacific/Auckland":"ap-southeast-2","Pacific/Honolulu":"us-west-1","Africa/Johannesburg":"af-south-1","Africa/Casablanca":"eu-south-2","Africa/Cairo":"me-south-1","Indian/Maldives":"ap-south-1"}),l=Object.freeze({Europe:"eu-central-1",America:"us-east-1",Asia:"ap-southeast-1",Australia:"ap-southeast-2",Pacific:"ap-southeast-2",Africa:"af-south-1",Atlantic:"eu-west-1",Indian:"ap-south-1"}),A=Object.freeze({"af-south-1":"eu-west-1","ap-east-1":"ap-southeast-1","ap-southeast-3":"ap-southeast-1","ap-southeast-4":"ap-southeast-2","eu-central-2":"eu-central-1","eu-south-1":"eu-central-1","eu-south-2":"eu-west-3","me-central-1":"ap-south-1","me-south-1":"ap-south-1"});function u(e){return c.has(e)?A[e]??r:e}t(u,"toDeployableRegion");function E(e){if(!e)return;const a=p[e];if(a!==void 0)return u(a);const n=e.split("/")[0];if(n===void 0)return;const s=l[n];return s===void 0?void 0:u(s)}t(E,"suggestRegionForTimezone");export{o as AWS_REGIONS_METADATA,r as DEFAULT_REGION,d as MAX_SECONDARY_REGIONS,c as OPT_IN_REGION_CODES,I as abbreviateRegion,f as getRegionInfo,y as optInRegionWarning,m as regions,E as suggestRegionForTimezone};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createHash as
|
|
1
|
+
var m=Object.defineProperty;var n=(e,t)=>m(e,"name",{value:t,configurable:!0});import{createHash as g}from"node:crypto";import{z as r}from"zod";const d=r.object({organisationId:r.string().min(1),category:r.string().min(1),resourceType:r.string().min(1),metricName:r.string().min(1),applicationId:r.string().min(1)}).strict();function $(e){const t=d.safeParse(e);if(!t.success)throw new Error(`Invalid pattern fingerprint input: ${t.error.message}`);const{organisationId:i,category:a,resourceType:o,metricName:s,applicationId:c}=t.data,p=`${i}|${a}|${o}|${s}|${c}`;return g("sha256").update(p).digest("hex")}n($,"computePatternFingerprint");export{d as FingerprintInputSchema,$ as computePatternFingerprint};
|
package/dist/logger.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const
|
|
2
|
-
`)};let n=
|
|
1
|
+
var g=Object.defineProperty;var o=(r,e)=>g(r,"name",{value:e,configurable:!0});const f=o(r=>{try{return JSON.stringify(r)}catch{return"[unserializable]"}},"safeStringify"),s=o((r,e,t,i)=>{const c=new Date().toISOString(),a=r.toUpperCase(),u=i?` ${f(i)}`:"";process.stderr.write(`[${c}] [${a}] [${e}] ${t}${u}
|
|
2
|
+
`)},"defaultWriter");let n=s;function L(r){n=r}o(L,"configureLogWriter");function l(){n=s}o(l,"resetLogWriter");const $={info(r,e,t){n("info",r,e,t)},warn(r,e,t){n("warn",r,e,t)},error(r,e,t){n("error",r,e,t)},debug(r,e,t){process.env.FJALL_DEBUG==="true"&&n("debug",r,e,t)},trace(r,e,t){process.env.FJALL_TRACE==="true"&&n("trace",r,e,t)},isDebugEnabled(){return process.env.FJALL_DEBUG==="true"}};export{L as configureLogWriter,$ as logger,l as resetLogWriter};
|
package/dist/manifest/io.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readFile as
|
|
1
|
+
var y=Object.defineProperty;var i=(t,e)=>y(t,"name",{value:e,configurable:!0});import{readFile as M,writeFile as h,unlink as b,rename as F,mkdir as k}from"fs/promises";import{readFileSync as w}from"fs";import{dirname as S,join as f}from"path";import{logger as s}from"../logger.js";import{fileExists as A}from"../fsHelpers.js";import{getErrorMessage as u}from"../errorUtils.js";import{recordToConstructMap as x}from"../constructMap.js";import{FjallManifestSchema as E,FJALL_MANIFEST_FILENAME as d,MANIFEST_SCHEMA_VERSION as v,normaliseDockerBuild as m}from"./schemas.js";function l(t){return f(t,d)}i(l,"getManifestFilePath");async function D(t){const e=l(t);if(!await A(e))return null;try{const n=await M(e,"utf-8"),r=JSON.parse(n),a=E.safeParse(r);return a.success||s.debug("FjallManifest","Manifest validation failed",{path:e,errors:a.error.issues.map(o=>`${o.path.join(".")}: ${o.message}`)}),a.success?a.data:null}catch(n){return s.debug("FjallManifest","Failed to read manifest file",{path:e,error:u(n)}),null}}i(D,"readManifestFile");async function _(t,e){const n=l(t),r=`${n}.${Date.now()}.tmp`;await k(S(n),{recursive:!0});try{await h(r,JSON.stringify(e,null,2),"utf-8"),await F(r,n)}catch(a){try{await b(r)}catch(o){s.debug("FjallManifest","Temp file cleanup failed (non-fatal)",{path:r,error:u(o)})}throw a}}i(_,"writeManifestFile");function C(t){return{version:v,generatedAt:new Date().toISOString(),appName:t,services:[],lambdas:[],stacks:{}}}i(C,"createEmptyManifest");async function R(t){const e=await D(t);return e?.resourceMap?x(e.resourceMap):new Map}i(R,"readConstructMap");function c(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}i(c,"isRecord");function p(t,e){const n=f(t,d);let r;try{r=w(n,"utf-8")}catch{s.debug("FjallManifest",`Manifest file not readable \u2014 no ${e} extracted`,{path:n});return}let a;try{a=JSON.parse(r)}catch{s.debug("FjallManifest",`Manifest is not valid JSON \u2014 no ${e} extracted`,{path:n});return}return c(a)?a:void 0}i(p,"readManifestRecord");function L(t){const e=p(t,"Docker services");if(e===void 0||!Array.isArray(e.services))return[];const n=[];for(const r of e.services){if(!c(r)||typeof r.name!="string")continue;const a=m(r.docker);a!==void 0&&n.push({name:r.name,docker:a,isLambda:!1})}return n}i(L,"parseDockerServicesFromManifest");function B(t){const e=new Map;for(const{name:n,imageKey:r,docker:a}of g(t)){const o=e.get(r);if(o===void 0){e.set(r,{name:r,docker:a,isLambda:!0});continue}if(JSON.stringify(o.docker)!==JSON.stringify(a))throw new Error(`Lambda functions sharing image key "${r}" declare different \`docker\` configs \u2014 every Lambda function sharing an \`image\` must build from the identical Dockerfile/context/target/buildArgs (offending function: "${n}").`)}return Array.from(e.values())}i(B,"parseLambdaDockerServicesFromManifest");function g(t){const e=p(t,"Lambda Docker entries");if(e===void 0||!Array.isArray(e.lambdas))return[];const n=[];for(const r of e.lambdas){if(!c(r)||typeof r.name!="string")continue;const a=m(r.docker);if(a===void 0)continue;const o=typeof r.imageKey=="string"&&r.imageKey.length>0?r.imageKey:r.name;n.push({name:r.name,imageKey:o,docker:a})}return n}i(g,"parseLambdaDockerEntriesFromManifest");function H(t){const e=L(t),n=g(t);return{ecsServices:e,lambdaEntries:n,declaresBuild:e.length>0||n.length>0}}i(H,"parseDockerDeclarationsFromManifest");export{C as createEmptyManifest,l as getManifestFilePath,H as parseDockerDeclarationsFromManifest,L as parseDockerServicesFromManifest,g as parseLambdaDockerEntriesFromManifest,B as parseLambdaDockerServicesFromManifest,R as readConstructMap,D as readManifestFile,_ as writeManifestFile};
|
package/dist/manifest/schemas.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{z as e}from"zod";import{PATTERN_TYPE_VALUES as
|
|
1
|
+
var y=Object.defineProperty;var i=(t,n)=>y(t,"name",{value:n,configurable:!0});import{z as e}from"zod";import{PATTERN_TYPE_VALUES as S}from"../patterns/patternTypes.js";const T="fjall-manifest.json",h=1,x=/^[A-Za-z0-9_.-]+$/,A=e.object({id:e.string().min(1,"buildSecret id cannot be empty").regex(x,"buildSecret id may contain only letters, digits, '_', '.', and '-' (no comma, '=', or whitespace, which would break the buildx --secret argv)"),ssm:e.string().min(1,"ssm parameter name cannot be empty").optional(),secretsManager:e.object({name:e.string().min(1,"secret name cannot be empty").optional(),arn:e.string().min(1,"secret arn cannot be empty").optional(),field:e.string().min(1,"secret field cannot be empty").optional()}).strict().refine(t=>t.name===void 0!=(t.arn===void 0),"secretsManager requires exactly one of name or arn").optional(),env:e.string().min(1,"env variable name cannot be empty").optional()}).strict().superRefine((t,n)=>{[t.ssm,t.secretsManager,t.env].filter(r=>r!==void 0).length!==1&&n.addIssue({code:e.ZodIssueCode.custom,message:"buildSecret requires exactly one source (ssm, secretsManager, or env)"})}),M=e.union([e.string(),e.object({ssm:e.string().min(1,"ssm parameter name cannot be empty").optional(),secretsManager:e.object({name:e.string().min(1,"secret name cannot be empty").optional(),arn:e.string().min(1,"secret arn cannot be empty").optional(),field:e.string().min(1,"secret field cannot be empty").optional()}).strict().refine(t=>t.name===void 0!=(t.arn===void 0),"secretsManager requires exactly one of name or arn").optional(),env:e.string().min(1,"env variable name cannot be empty").optional(),acknowledgePublic:e.boolean().optional()}).strict().superRefine((t,n)=>{[t.ssm,t.secretsManager,t.env].filter(r=>r!==void 0).length!==1&&n.addIssue({code:e.ZodIssueCode.custom,message:"buildArg value requires exactly one source (ssm, secretsManager, or env)"})})]),c=e.object({path:e.string(),context:e.string().min(1,"context cannot be empty").optional(),target:e.string().min(1,"target cannot be empty").optional(),buildArgs:e.record(e.string(),M).optional(),buildSecrets:e.array(A).optional()}).strict(),I=c.partial();function P(t,n){if(n===void 0)return t;const s=n.context??t.context,r=n.target??t.target,o=n.buildArgs??t.buildArgs,a=n.buildSecrets??t.buildSecrets;return{path:n.path??t.path,...s!==void 0&&{context:s},...r!==void 0&&{target:r},...o!==void 0&&{buildArgs:o},...a!==void 0&&{buildSecrets:a}}}i(P,"mergeDockerBuild");function m(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}i(m,"isRecord");function j(t){if(!m(t)||typeof t.path!="string"||t.path.length===0)return;const n=typeof t.context=="string"&&t.context.length>0?t.context:void 0,s=typeof t.target=="string"&&t.target.length>0?t.target:void 0,r=m(t.buildArgs)&&Object.keys(t.buildArgs).length>0?t.buildArgs:void 0,o=Array.isArray(t.buildSecrets)&&t.buildSecrets.length>0?t.buildSecrets:void 0,a={path:t.path,...n!==void 0&&{context:n},...s!==void 0&&{target:s},...r!==void 0&&{buildArgs:r},...o!==void 0&&{buildSecrets:o}},d=c.safeParse(a);return d.success?d.data:void 0}i(j,"normaliseDockerBuild");function _(t){if(t===void 0)return;const n=j(t);return n===void 0?void 0:JSON.stringify(n)}i(_,"dockerBuildFingerprint");const p=e.object({name:e.string(),clusterName:e.string().optional(),docker:c.optional(),containerPort:e.number().optional(),secrets:e.array(e.string()).optional(),ssmSecretsPath:e.string().optional(),importedSecretNames:e.array(e.string()).optional()}).strict(),g=e.object({type:e.enum(S),name:e.string(),source:e.string()}).strict(),l=e.object({repositoryName:e.string()}).strict(),u=e.object({name:e.string(),secrets:e.array(e.string()).optional(),ssmSecretsPath:e.string().optional(),importedSecretNames:e.array(e.string()).optional(),docker:c.optional(),imageKey:e.string().optional()}).strict(),f=e.object({templateHash:e.string(),synthTimestamp:e.string()}).strict(),b=e.object({constructPath:e.string().max(512),group:e.string().max(128),resourceType:e.string().max(256)}).strict(),B=e.object({version:e.literal(h),generatedAt:e.string(),appName:e.string(),services:e.array(p),lambdas:e.array(u),pattern:g.optional(),ecr:l.optional(),stacks:e.record(e.string(),f),resourceMap:e.record(e.string(),b).optional()}).strict();export{x as BUILDKIT_SECRET_ID_PATTERN,M as DockerBuildArgValueSchema,I as DockerBuildPartialSchema,c as DockerBuildSchema,A as DockerBuildSecretRefSchema,T as FJALL_MANIFEST_FILENAME,B as FjallManifestSchema,h as MANIFEST_SCHEMA_VERSION,l as ManifestEcrSchema,u as ManifestLambdaSchema,g as ManifestPatternSchema,p as ManifestServiceSchema,f as ManifestStackHashSchema,b as ResourceMapEntrySchema,_ as dockerBuildFingerprint,P as mergeDockerBuild,j as normaliseDockerBuild};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{z as t}from"zod";const
|
|
1
|
+
var p=Object.defineProperty;var a=(n,r)=>p(n,"name",{value:r,configurable:!0});import{z as t}from"zod";const g=2,v={AUTHENTICATION_REQUIRED:"AUTHENTICATION_REQUIRED",VALIDATION_ERROR:"VALIDATION_ERROR",INTERNAL_ERROR:"INTERNAL_ERROR",INVALID_SUBCOMMAND:"INVALID_SUBCOMMAND",INVALID_FRAME:"INVALID_FRAME"},s=1e3,e=t.literal(g),u=t.enum(["completed","error","skipped"]),d=t.object({v:e,kind:t.literal("step.start"),stepId:t.string().min(1),name:t.string().min(1),index:t.number().int().min(0),total:t.number().int().min(1)}).strict(),b=t.object({v:e,kind:t.literal("step.complete"),stepId:t.string().min(1),name:t.string().min(1),status:u,index:t.number().int().min(0),total:t.number().int().min(1),errorMessage:t.string().optional()}).strict(),h=t.object({v:e,kind:t.literal("warning"),message:t.string().min(1)}).strict(),R=t.object({code:t.string().min(1),message:t.string().min(1),details:t.record(t.string(),t.unknown()).optional()}).strict(),A=t.object({v:e,kind:t.literal("error"),error:R}).strict(),S=t.object({v:e,kind:t.literal("result"),data:t.unknown()}).strict(),I=t.object({v:e,kind:t.literal("auth.browser.required"),url:t.string().url(),externalId:t.string().min(1),region:t.string().min(1),environment:t.string().min(1),reason:t.string().min(1)}).strict(),x=t.object({v:e,kind:t.literal("auth.browser.complete"),awsAccountId:t.string().min(1),accountName:t.string().min(1),roleArn:t.string().min(1)}).strict(),k=t.discriminatedUnion("kind",[d,b,h,A,S,I,x]),c=t.object({path:t.string().min(1),sizeBytes:t.number().int().nonnegative(),collisionMode:t.enum(["create","overwrite"])}).strict(),m=t.object({type:t.enum(["register-application","create-activity","auto-link-repository","writeback-config-path"]),description:t.string().min(1)}).strict(),E=t.enum(["tinkerer","lightweight","standard","resilient","enterprise"]),N=t.enum(["lightweight","standard","resilient","enterprise","none"]),l=t.object({name:t.string().min(1),environment:t.string().min(1).nullable(),source:t.string().min(1)}).strict(),y=t.object({name:t.string().min(1),pattern:t.string().min(1).optional(),patternTier:E.optional(),patternDomain:t.string().min(1).optional(),network:N.optional(),template:t.string().min(1).optional(),docker:t.object({path:t.string().min(1).optional(),context:t.string().min(1).optional(),target:t.string().min(1).optional()}).strict().optional(),git:t.boolean().optional(),github:t.boolean().optional(),repoVisibility:t.enum(["private","public"]).optional(),intent:t.string().max(s).optional()}).strict(),w=t.object({planId:t.string().regex(/^[0-9a-f]{32}$/),normalisedPath:t.string().min(1),resolvedInputs:y,targetAccount:l.nullable(),targetAccountCandidates:t.array(l),filesToWrite:t.array(c),npmPackages:t.array(t.string().min(1)),registryActions:t.array(m),patternUnsupportedForDryRun:t.boolean().optional(),intent:t.string().max(s).optional(),framework:t.string().min(1).optional(),summary:t.string().min(1)}).strict(),f=t.object({filesToWrite:t.array(c),npmPackages:t.array(t.string().min(1)),registryActions:t.array(m),patternUnsupportedForDryRun:t.boolean().optional()}).strict(),O=t.object({path:t.string().min(1),name:t.string().min(1),mode:t.enum(["application","pattern"]),dependenciesInstalled:t.boolean().optional(),warning:t.string().optional(),dryRunArtefacts:f.optional()}).strict(),D=t.object({step:t.string().min(1),current:t.number().int().nonnegative(),total:t.number().int().positive().optional(),message:t.string().min(1)}).strict();function F(n){let r;try{r=JSON.parse(n)}catch(o){return{ok:!1,reason:"json",raw:n,error:o instanceof Error?o.message:String(o)}}const i=k.safeParse(r);return i.success?{ok:!0,frame:i.data}:{ok:!1,reason:"schema",raw:n,error:i.error.message}}a(F,"parseFrame");export{x as AuthBrowserCompleteFrameSchema,I as AuthBrowserRequiredFrameSchema,f as DryRunArtefactsSchema,A as ErrorFrameSchema,c as FileToWriteSchema,s as INTENT_MAX_LENGTH,v as MCP_ERROR_CODES,g as MCP_PROTOCOL_VERSION,k as McpProtocolFrameSchema,m as RegistryActionSchema,y as ResolvedInputsSchema,S as ResultFrameSchema,w as ScaffoldPlanSchema,D as ScaffoldProgressFrameSchema,O as ScaffoldResultDataSchema,b as StepCompleteFrameSchema,d as StepStartFrameSchema,l as TargetAccountSchema,h as WarningFrameSchema,F as parseFrame};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{z as
|
|
1
|
+
var o=Object.defineProperty;var a=(e,s)=>o(e,"name",{value:s,configurable:!0});import{z as r}from"zod";const _="CLICKHOUSE_MANAGED_USERS";function m(e){return`USER_${e.toUpperCase()}_PASSWORD`}a(m,"userPasswordEnvName");const t=/^[a-z][a-z0-9_]*$/,n=r.string().min(1).max(63).regex(t,"Must be lowercase snake_case"),c=r.array(n).min(0);export{_ as CLICKHOUSE_MANAGED_USERS_ENV,t as MANAGED_USER_NAME_PATTERN,n as ManagedUserNameSchema,c as ManagedUserNamesSchema,m as userPasswordEnvName};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{PRISMA_MIGRATION_DIR_RE as
|
|
1
|
+
var s=Object.defineProperty;var t=(n,r)=>s(n,"name",{value:r,configurable:!0});import{PRISMA_MIGRATION_DIR_RE as f,CLICKHOUSE_MIGRATION_FILE_RE as I}from"./constants.js";function o(n){return f.test(n)||I.test(n)}t(o,"isOrderableSchemaVersion");function u(n){const r=/^(\d+)/.exec(n);return r===null?null:r[1].length}t(u,"numericPrefixWidth");function m(n,r){if(o(n)&&o(r)){const i=u(n),e=u(r);return i!==null&&e!==null&&i===e?r>=n:r===n}return r===n}t(m,"isSchemaVersionSatisfied");export{o as isOrderableSchemaVersion,m as isSchemaVersionSatisfied};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readdirSync as
|
|
1
|
+
var n=Object.defineProperty;var o=(t,i)=>n(t,"name",{value:i,configurable:!0});import{readdirSync as l}from"node:fs";import{CLICKHOUSE_MIGRATION_SKIP_RE as s}from"./constants.js";function c(t){const i=l(t,{withFileTypes:!0}).filter(e=>e.isFile()).map(e=>e.name).filter(e=>e.endsWith(".sql")).filter(e=>!s.test(e)).sort(),r=i[i.length-1];if(r===void 0)throw new Error(`No ClickHouse migration files found under ${t} (looked for *.sql excluding *.dev.sql)`);return r}o(c,"pickLatestClickHouseMigration");export{c as pickLatestClickHouseMigration};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readdirSync as
|
|
1
|
+
var o=Object.defineProperty;var n=(t,i)=>o(t,"name",{value:i,configurable:!0});import{readdirSync as s}from"node:fs";import{PRISMA_MIGRATION_DIR_RE as a}from"./constants.js";function c(t){const i=s(t,{withFileTypes:!0}).filter(r=>r.isDirectory()).map(r=>r.name).filter(r=>a.test(r)).sort(),e=i[i.length-1];if(e===void 0)throw new Error(`No Prisma migration directories found under ${t}`);return e}n(c,"pickLatestPrismaMigration");export{c as pickLatestPrismaMigration};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isSchemaVersionSatisfied as
|
|
1
|
+
var s=Object.defineProperty;var c=(e,r)=>s(e,"name",{value:r,configurable:!0});import{isSchemaVersionSatisfied as a}from"./compareSchemaVersion.js";const u="SELECT migration_name FROM _prisma_migrations WHERE finished_at IS NOT NULL ORDER BY finished_at DESC LIMIT 1",l="migration_name";async function E(e){if(e.signal?.aborted)throw new Error("verifyExpectedSchemaVersion: aborted by signal before query");let r,n;if(e.tool==="prisma")r=u,n=l;else if(e.tool==="custom"){if(e.customQuery===void 0)throw new Error('verifyExpectedSchemaVersion: tool="custom" requires customQuery');r=e.customQuery.sql,n=e.customQuery.column}else throw new Error(`verifyExpectedSchemaVersion: unknown tool ${String(e.tool)}`);const i=(await e.client.query(r)).rows[0],o=i!==void 0?i[n]:void 0,t=typeof o=="string"?o:null;return{matches:t!==null&&a(e.expected,t),expected:e.expected,actual:t}}c(E,"verifyExpectedSchemaVersion");export{E as verifyExpectedSchemaVersion};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{describe as c,expect as a,it as s,vi as
|
|
1
|
+
var d=Object.defineProperty;var i=(t,e)=>d(t,"name",{value:e,configurable:!0});import{describe as c,expect as a,it as s,vi as u}from"vitest";import{verifyExpectedSchemaVersion as o}from"./verifyExpectedSchemaVersion.js";function n(t){const e=[];return{client:{query:u.fn(async l=>(e.push(l),{rows:t}))},queries:e}}i(n,"makeMockClient"),c("verifyExpectedSchemaVersion",()=>{c('tool: "prisma"',()=>{s("returns matches=true when actual === expected",async()=>{const{client:t,queries:e}=n([{migration_name:"20260520000000_add_widgets"}]),r=await o({tool:"prisma",expected:"20260520000000_add_widgets",client:t});a(r).toEqual({matches:!0,expected:"20260520000000_add_widgets",actual:"20260520000000_add_widgets"}),a(e).toHaveLength(1),a(e[0]).toContain("_prisma_migrations"),a(e[0]).toContain("finished_at IS NOT NULL"),a(e[0]).toContain("ORDER BY finished_at DESC LIMIT 1")}),s("returns matches=false with actual when DB trails image",async()=>{const{client:t}=n([{migration_name:"20260519000000_old"}]),e=await o({tool:"prisma",expected:"20260520000000_add_widgets",client:t});a(e).toEqual({matches:!1,expected:"20260520000000_add_widgets",actual:"20260519000000_old"})}),s("returns matches=true when DB is AHEAD (expand-only rollback)",async()=>{const{client:t}=n([{migration_name:"20260521000000_add_more_widgets"}]),e=await o({tool:"prisma",expected:"20260520000000_add_widgets",client:t});a(e).toEqual({matches:!0,expected:"20260520000000_add_widgets",actual:"20260521000000_add_more_widgets"})}),s("returns actual=null on empty result set",async()=>{const{client:t}=n([]),e=await o({tool:"prisma",expected:"20260520000000_add_widgets",client:t});a(e).toEqual({matches:!1,expected:"20260520000000_add_widgets",actual:null})}),s("returns actual=null when row's migration_name is not a string",async()=>{const{client:t}=n([{migration_name:12345}]),e=await o({tool:"prisma",expected:"x",client:t});a(e.actual).toBeNull(),a(e.matches).toBe(!1)})}),c('tool: "custom"',()=>{s("uses customQuery sql and column",async()=>{const{client:t,queries:e}=n([{hash:"deadbeef"}]),r=await o({tool:"custom",expected:"deadbeef",client:t,customQuery:{sql:"SELECT hash FROM __drizzle_migrations ORDER BY created_at DESC LIMIT 1",column:"hash"}});a(r.matches).toBe(!0),a(r.actual).toBe("deadbeef"),a(e[0]).toBe("SELECT hash FROM __drizzle_migrations ORDER BY created_at DESC LIMIT 1")}),s("stays strict for non-orderable versions even when actual sorts later",async()=>{const{client:t}=n([{hash:"ffffffff"}]),e=await o({tool:"custom",expected:"00000000",client:t,customQuery:{sql:"SELECT hash FROM __drizzle_migrations ORDER BY created_at DESC LIMIT 1",column:"hash"}});a(e.matches).toBe(!1),a(e.actual).toBe("ffffffff")}),s("throws when customQuery is omitted",async()=>{const{client:t}=n([]);await a(o({tool:"custom",expected:"x",client:t})).rejects.toThrow(/tool="custom" requires customQuery/)})}),c("abort signal",()=>{s("short-circuits before query when signal is already aborted",async()=>{const{client:t,queries:e}=n([{migration_name:"irrelevant"}]),r=new AbortController;r.abort(),await a(o({tool:"prisma",expected:"x",client:t,signal:r.signal})).rejects.toThrow(/aborted by signal before query/),a(e).toEqual([])})})});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{accountConstructKey as
|
|
1
|
+
var i=Object.defineProperty;var r=(o,n)=>i(o,"name",{value:n,configurable:!0});import{accountConstructKey as u}from"./caseConversion.js";function a(o){const n=new Map;for(const t of o){const e=u(t);if(e==="")return{kind:"empty-construct-key",name:t};const c=n.get(e);if(c!==void 0)return{kind:"duplicate-construct-key",name:t,existingName:c,constructKey:e};n.set(e,t)}return null}r(a,"findAccountNameCollision");export{a as findAccountNameCollision};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
var c=Object.defineProperty;var t=(e,r)=>c(e,"name",{value:r,configurable:!0});function u(e){return e.replace(/[-_](.)/g,(r,n)=>n.toUpperCase()).replace(/^./,r=>r.toUpperCase())}t(u,"toPascalCase");function o(e){return e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1-$2").replace(/([a-z\d])([A-Z])/g,"$1-$2").replace(/[\s_]+/g,"-").toLowerCase()}t(o,"toKebab");function i(e){return o(e).replace(/-/g,"_")}t(i,"toValidDatabaseName");function l(e){return o(e).replace(/-/g,"_").toUpperCase()}t(l,"toScreamingSnake");function s(e){return e.length===0?e:e.charAt(0).toUpperCase()+e.slice(1)}t(s,"capitalise");function g(e){return e.split(".").join("")}t(g,"getSafeZoneName");function a(e){return e.toLowerCase().replace(/[^a-z0-9]/g,"")}t(a,"accountConstructKey");function f(e){const r=e.replace(/\P{ASCII}/gu,"");return a(r)===a(e)&&a(e)!==""}t(f,"hasAsciiStableConstructKey");export{a as accountConstructKey,s as capitalise,g as getSafeZoneName,f as hasAsciiStableConstructKey,o as toKebab,u as toPascalCase,l as toScreamingSnake,i as toValidDatabaseName};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{abbreviateRegion as
|
|
1
|
+
var u=Object.defineProperty;var o=(e,t)=>u(e,"name",{value:t,configurable:!0});import{abbreviateRegion as c,AWS_REGIONS_METADATA as a}from"../infra/regions.js";import{toKebab as f}from"./caseConversion.js";function r(e){return f(e).replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}o(r,"slugifyAccountName");function m(e,t){const n=r(e),i=r(t);return n===""?i:i===""?n:`${n}-${i}`}o(m,"defaultConnectedAccountName");function p(e,t){const n=r(t);return n===""?e:`${e}-${n}`}o(p,"suffixedAccountName");const s=new Set(a.map(e=>c(e.code)));function x(e){const t=e.toLowerCase().split(/[-\s_]+/).filter(i=>i.length>0),n=t[t.length-1];if(n!==void 0&&s.has(n))return n}o(x,"findTrailingRegionShortCode");function A(e){return`Account name must not end with a region code ("-${e}") \u2014 the region is added automatically when deploying. Remove the "-${e}" suffix.`}o(A,"regionSuffixRejectionMessage");export{s as REGION_SHORT_CODES,m as defaultConnectedAccountName,x as findTrailingRegionShortCode,A as regionSuffixRejectionMessage,p as suffixedAccountName};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{toKebab as
|
|
1
|
+
var t=Object.defineProperty;var r=(e,o)=>t(e,"name",{value:o,configurable:!0});import{toKebab as n}from"./caseConversion.js";const a=["fjall","organisation","platform","account"],c="This application name is reserved for Fjall's organisation-tier infrastructure.";function p(e){return a.includes(e.toLowerCase())}r(p,"isReservedAppName");const i="-cache",A="Application names ending in '-cache' are reserved for Fjall build-cache repositories.";function S(e){return n(e).endsWith(i)}r(S,"hasReservedAppNameSuffix");export{a as RESERVED_APP_NAMES,c as RESERVED_APP_NAME_MESSAGE,i as RESERVED_APP_NAME_SUFFIX,A as RESERVED_APP_NAME_SUFFIX_MESSAGE,S as hasReservedAppNameSuffix,p as isReservedAppName};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
var c=Object.defineProperty;var e=(t,o)=>c(t,"name",{value:o,configurable:!0});const a=["payload","nextjs","staticsite"],s=new Set(a);function p(t){return typeof t=="string"&&s.has(t)}e(p,"isPatternType");const n={payload:{label:"Payload CMS",constructIdSuffix:"Payload",artefact:"opennext-lambda",stackPlacement:"compute",deployable:!0},nextjs:{label:"Next.js",constructIdSuffix:"Nextjs",artefact:"opennext-lambda",stackPlacement:"compute",deployable:!1},staticsite:{label:"Static site",constructIdSuffix:"StaticSite",artefact:"static-assets",stackPlacement:"cdn",deployable:!0}},E=a.filter(t=>n[t].deployable),l=a.filter(t=>n[t].artefact==="opennext-lambda"),T=new Set(l);function i(t){return t!=null&&T.has(t)}e(i,"isOpenNextPatternType");const P=["multipage","spa"];export{E as DEPLOYABLE_PATTERN_TYPES,l as OPENNEXT_PATTERN_TYPES,n as PATTERN_REGISTRY,s as PATTERN_TYPES,a as PATTERN_TYPE_VALUES,P as STATIC_SITE_ROUTING_VALUES,i as isOpenNextPatternType,p as isPatternType};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
var f=Object.defineProperty;var t=(r,e)=>f(r,"name",{value:e,configurable:!0});const i="noreply";function a(r){return`${i}@${r}`}t(a,"defaultFormsFromAddress");function d(r){return`https://${r}`}t(d,"defaultFormsCorsOrigin");function l(r,e){const n=r.split("@");if(n.length!==2)return!1;const[o,s]=n;return o===void 0||o===""||s===void 0?!1:s.toLowerCase()===e.toLowerCase()}t(l,"isAddressAtDomain");export{i as DEFAULT_FORMS_FROM_LOCAL_PART,d as defaultFormsCorsOrigin,a as defaultFormsFromAddress,l as isAddressAtDomain};
|
package/dist/repo/appPath.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
var i=Object.defineProperty;var t=(r,n)=>i(r,"name",{value:n,configurable:!0});function u(r,n){if(n!==void 0){if(n.trim()==="")throw new Error("buildAppConfigPath: container must be a non-empty string");return`${n}/fjall/${r}`}return`fjall/${r}`}t(u,"buildAppConfigPath");export{u as buildAppConfigPath};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
var c=Object.defineProperty;var r=(t,n)=>c(t,"name",{value:n,configurable:!0});const s="infrastructure.ts",a="fjall";function P(t,n){const e=n?.excludedPathPrefixes,u=n?.excludedPathSegments,o=[];for(const i of t){if(!l(i.path)||e&&x(i.path,e)||u&&p(i.path,u))continue;const f=h(i.path);f!==null&&o.push({configPath:d(i.path),boundaryPath:f})}return o}r(P,"findInfrastructurePaths");function l(t){return t===s||t.endsWith(`/${s}`)}r(l,"isInfrastructureFile");function h(t){const n=t.split("/");for(let e=0;e<n.length-1;e++)if(n[e]===a)return n.slice(0,e+1).join("/");return null}r(h,"findBoundaryPath");function d(t){return t.slice(0,-`/${s}`.length)}r(d,"toConfigDir");function x(t,n){for(const e of n)if(t.startsWith(e))return!0;return!1}r(x,"hasExcludedPrefix");function p(t,n){const e=t.split("/");for(let u=0;u<e.length-1;u++)if(n.has(e[u]))return!0;return!1}r(p,"hasExcludedSegment");export{a as MARKER_DIRECTORY,h as findBoundaryPath,P as findInfrastructurePaths,l as isInfrastructureFile};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{stat as
|
|
1
|
+
var f=Object.defineProperty;var n=(r,t)=>f(r,"name",{value:t,configurable:!0});import{stat as m}from"fs/promises";import{dirname as c,join as p,parse as u,resolve as o}from"path";import{ROOT_CONFIG_FILENAME as R}from"../config.js";const O=[".git",R];async function k(r){let t=o(r);const{root:i}=u(t);for(;;){for(const s of O){const a=p(t,s);if(await m(a).then(()=>!0,()=>!1))return t}if(t===i)return o(r);const e=c(t);if(e===t)return o(r);t=e}}n(k,"findRepoRoot");export{k as findRepoRoot};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
var s=Object.defineProperty;var r=(t,o)=>s(t,"name",{value:o,configurable:!0});const h={"github.com":"github","gitlab.com":"gitlab","bitbucket.org":"bitbucket"},u=/^https?:\/\/([^/]+)\/(.+?)\/([^/.]+?)(?:\.git)?$/,a=/^git@([^:]+):(.+?)\/([^/.]+?)(?:\.git)?$/,g=/^ssh:\/\/[^@]+@([^:/]+)(?::\d+)?\/(.+?)\/([^/.]+?)(?:\.git)?$/;function l(t){if(!t)return null;const o=t.replace(/^(https?:\/\/)[^@]+@/,"$1"),n=o.match(u)??o.match(a)??t.match(g);if(!n)return null;const[,i,c,e]=n;return!i||!c||!e?null:{provider:h[i]??"other",owner:c,repo:e,host:i}}r(l,"parseGitRemoteUrl");export{l as parseGitRemoteUrl};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{MARKER_DIRECTORY as
|
|
1
|
+
var f=Object.defineProperty;var l=(t,n)=>f(t,"name",{value:n,configurable:!0});import{MARKER_DIRECTORY as c}from"./findInfrastructurePaths.js";function m(t){if(t.length===0)return null;const n=[];for(const e of t){const o=s(e.boundaryPath);if(o===null)return null;n.push(o)}const r=h(n);return r.length===0?null:r.join("/")}l(m,"inferContainerFromCandidates");function s(t){const n=t.split("/").filter(e=>e.length>0);if(n.length===0||n[n.length-1]!==c)return null;const r=n.slice(0,n.length-1);return r.length===0?null:r}l(s,"extractContainer");function h(t){if(t.length===0)return[];const[n,...r]=t,e=[];for(let o=0;o<n.length;o+=1){const i=n[o];for(const u of r)if(u[o]!==i)return e;e.push(i)}return e}l(h,"longestCommonPrefix");export{m as inferContainerFromCandidates};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readdir as
|
|
1
|
+
var f=Object.defineProperty;var r=(t,i)=>f(t,"name",{value:i,configurable:!0});import{readdir as l}from"fs/promises";import{join as m,relative as h,sep as o}from"path";import{findInfrastructurePaths as d,isInfrastructureFile as p}from"./findInfrastructurePaths.js";const c=new Set(["node_modules",".git","dist","build","coverage",".next",".turbo",".vite",".cache"]);async function x(t){const i=[];return await u(t,t,i),{paths:d(i,{excludedPathSegments:c})}}r(x,"scanLocalRepository");async function u(t,i,n){let a;try{a=await l(i,{withFileTypes:!0})}catch{return}for(const e of a){if(e.isSymbolicLink())continue;const s=m(i,e.name);if(e.isDirectory()){if(c.has(e.name))continue;await u(t,s,n);continue}e.isFile()&&p(e.name)&&n.push({path:y(t,s)})}}r(u,"walk");function y(t,i){const n=h(t,i);return o==="/"?n:n.split(o).join("/")}r(y,"toPosixRelative");export{x as scanLocalRepository};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
var n=Object.defineProperty;var e=(t,a)=>n(t,"name",{value:a,configurable:!0});const u=["security","network","compute","database","storage","monitoring","dns","identity","bootstrap","events","registry","backup"],S=Object.freeze({"AWS::IAM::Role":"security","AWS::IAM::Policy":"security","AWS::IAM::OIDCProvider":"security","AWS::EC2::SecurityGroup":"security","AWS::KMS::Key":"security","AWS::KMS::Alias":"security","AWS::EC2::VPC":"network","AWS::EC2::Subnet":"network","AWS::EC2::InternetGateway":"network","AWS::EC2::NatGateway":"network","AWS::EC2::RouteTable":"network","AWS::EC2::Route":"network","AWS::EC2::VPCGatewayAttachment":"network","AWS::EC2::SubnetRouteTableAssociation":"network","AWS::EC2::EIP":"network","AWS::ECS::Cluster":"compute","AWS::ECS::Service":"compute","AWS::ECS::TaskDefinition":"compute","AWS::Lambda::Function":"compute","AWS::ElasticLoadBalancingV2::LoadBalancer":"compute","AWS::ElasticLoadBalancingV2::TargetGroup":"compute","AWS::ElasticLoadBalancingV2::Listener":"compute","AWS::ElasticLoadBalancingV2::ListenerRule":"compute","AWS::RDS::DBInstance":"database","AWS::RDS::DBCluster":"database","AWS::SecretsManager::Secret":"database","AWS::S3::Bucket":"storage","AWS::S3::BucketPolicy":"storage","AWS::CloudTrail::Trail":"monitoring","AWS::CloudWatch::Alarm":"monitoring","AWS::Logs::LogGroup":"monitoring","AWS::Events::EventBus":"events","AWS::Events::Rule":"events","AWS::ECR::Repository":"registry","AWS::CodeBuild::Project":"registry","AWS::Route53::RecordSet":"dns","AWS::CertificateManager::Certificate":"dns","AWS::CloudFront::Distribution":"dns","AWS::Backup::BackupVault":"backup","AWS::Backup::BackupPlan":"backup","AWS::Backup::BackupSelection":"backup","AWS::SSO::PermissionSet":"identity","AWS::SSO::Assignment":"identity","AWS::Organizations::Account":"identity","AWS::CDK::Metadata":"compute","AWS::CloudFormation::CustomResource":"compute","AWS::CloudFormation::WaitCondition":"compute","AWS::CloudFormation::WaitConditionHandle":"compute"}),o=new Set;function s(t){if(!t)return"compute";if(t.startsWith("Custom::"))return S[t]??"compute";const a=S[t];return a||o.add(t),a??"compute"}e(s,"categoriseResource");function W(){return new Set(o)}e(W,"getUnmappedResourceTypes");function l(){o.clear()}e(l,"clearUnmappedResourceTypes");const i=Object.freeze({"AWS::EC2::NatGateway":120,"AWS::RDS::DBInstance":300,"AWS::RDS::DBCluster":300,"AWS::CloudFront::Distribution":300,"AWS::ECS::Service":180,"AWS::ElasticLoadBalancingV2::LoadBalancer":60,"AWS::EC2::SecurityGroup":10,"AWS::IAM::Role":15,"AWS::IAM::Policy":15,"AWS::IAM::OIDCProvider":10,"AWS::S3::Bucket":10,"AWS::S3::BucketPolicy":5,"AWS::Lambda::Function":30,"AWS::EC2::VPC":15,"AWS::EC2::Subnet":15,"AWS::EC2::InternetGateway":10,"AWS::EC2::RouteTable":5,"AWS::EC2::Route":5,"AWS::EC2::VPCGatewayAttachment":10,"AWS::EC2::SubnetRouteTableAssociation":5,"AWS::EC2::EIP":10,"AWS::ECS::Cluster":15,"AWS::ECS::TaskDefinition":10,"AWS::ElasticLoadBalancingV2::TargetGroup":10,"AWS::ElasticLoadBalancingV2::Listener":10,"AWS::ElasticLoadBalancingV2::ListenerRule":5,"AWS::SecretsManager::Secret":10,"AWS::Logs::LogGroup":5,"AWS::CloudWatch::Alarm":10,"AWS::CloudTrail::Trail":15,"AWS::Events::EventBus":5,"AWS::Events::Rule":5,"AWS::ECR::Repository":10,"AWS::Route53::RecordSet":30,"AWS::CertificateManager::Certificate":60,"AWS::KMS::Key":15,"AWS::KMS::Alias":5,"AWS::Backup::BackupVault":10,"AWS::Backup::BackupPlan":10,"AWS::Backup::BackupSelection":10,"AWS::SSO::PermissionSet":15,"AWS::SSO::Assignment":10,"AWS::Organizations::Account":60}),A=30;function C(t){return i[t]??A}e(C,"getExpectedDuration");const c=Object.freeze({"AWS::Lambda::Function":"Lambda Function","AWS::IAM::Role":"IAM Role","AWS::IAM::Policy":"IAM Policy","AWS::S3::Bucket":"S3 Bucket","AWS::DynamoDB::Table":"DynamoDB Table","AWS::EC2::Instance":"EC2 Instance","AWS::EC2::SecurityGroup":"Security Group","AWS::EC2::VPC":"VPC","AWS::EC2::Subnet":"Subnet","AWS::EC2::InternetGateway":"Internet Gateway","AWS::EC2::RouteTable":"Route Table","AWS::EC2::Route":"Route","AWS::ECS::Cluster":"ECS Cluster","AWS::ECS::Service":"ECS Service","AWS::ECS::TaskDefinition":"Task Definition","AWS::ElasticLoadBalancingV2::LoadBalancer":"Load Balancer","AWS::ElasticLoadBalancingV2::TargetGroup":"Target Group","AWS::ElasticLoadBalancingV2::Listener":"Listener","AWS::CloudFormation::Stack":"CloudFormation Stack","AWS::CDK::Metadata":"CDK Metadata","Custom::CDKBucketDeployment":"Bucket Deployment","AWS::SSM::Parameter":"SSM Parameter","AWS::CloudWatch::Alarm":"CloudWatch Alarm","AWS::Logs::LogGroup":"Log Group","AWS::ApiGateway::RestApi":"API Gateway","AWS::ApiGateway::Deployment":"API Deployment","AWS::ApiGateway::Stage":"API Stage","AWS::ApiGateway::Method":"API Method","AWS::ApiGateway::Resource":"API Resource","AWS::CloudFront::Distribution":"CloudFront Distribution","AWS::Route53::RecordSet":"Route53 Record","AWS::RDS::DBInstance":"RDS Instance","AWS::RDS::DBCluster":"RDS Cluster","AWS::SQS::Queue":"SQS Queue","AWS::SNS::Topic":"SNS Topic","AWS::Events::Rule":"EventBridge Rule","AWS::StepFunctions::StateMachine":"Step Function","AWS::EC2::NatGateway":"NAT Gateway","AWS::EC2::EIP":"Elastic IP","AWS::EC2::VPCGatewayAttachment":"Gateway Attachment","AWS::EC2::SubnetRouteTableAssociation":"Route Association","AWS::CloudTrail::Trail":"CloudTrail","AWS::IAM::OIDCProvider":"OIDC Provider","AWS::Events::EventBus":"Event Bus","AWS::Backup::BackupVault":"Backup Vault","AWS::Backup::BackupPlan":"Backup Plan","AWS::Backup::BackupSelection":"Backup Selection","AWS::SecretsManager::Secret":"Secret","AWS::KMS::Key":"KMS Key","AWS::KMS::Alias":"KMS Alias","AWS::ECR::Repository":"ECR Repository","AWS::CertificateManager::Certificate":"Certificate","AWS::ElasticLoadBalancingV2::ListenerRule":"Listener Rule","AWS::EC2::IPAM":"IPAM","AWS::EC2::IPAMPool":"IPAM Pool","AWS::EC2::IPAMPoolCidr":"IPAM Pool CIDR","Custom::ram":"RAM","Custom::ipamDelegateAdmin":"IPAM Delegate Admin","Custom::CostAllocationTags":"Cost Allocation Tags","Custom::ActivateOrganisationsAccess":"Activate Organisations Access","Custom::Organizations_TagResource":"Organisations Tag Resource","AWS::CloudFormation::CustomResource":"Custom Resource","AWS::CloudFormation::WaitCondition":"Wait Condition","AWS::CloudFormation::WaitConditionHandle":"Wait Condition Handle","AWS::SSO::PermissionSet":"SSO Permission Set","AWS::SSO::Assignment":"SSO Assignment","AWS::Organizations::Account":"Organisations Account","AWS::S3::BucketPolicy":"S3 Bucket Policy","AWS::CodeBuild::Project":"CodeBuild Project"});function E(t){return c[t]||t.split("::").pop()||t}e(E,"getFriendlyResourceType");export{u as RESOURCE_CATEGORIES,s as categoriseResource,l as clearUnmappedResourceTypes,C as getExpectedDuration,E as getFriendlyResourceType,W as getUnmappedResourceTypes};
|
package/dist/secrets.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{z as
|
|
2
|
-
`)){const s=
|
|
3
|
-
`:
|
|
1
|
+
var m=Object.defineProperty;var n=(t,e)=>m(t,"name",{value:e,configurable:!0});import{z as u}from"zod";const d=/^[a-zA-Z_][a-zA-Z0-9._-]*$/,A="Secret name must start with a letter or underscore and contain only letters, numbers, underscores, hyphens, or periods",f=/^[a-zA-Z][a-zA-Z0-9._-]*$/,h="Must start with a letter and contain only letters, numbers, periods, hyphens, or underscores",N=4096,i=u.string().regex(f,h),b=u.object({app:i.describe("Application name"),cluster:i.optional().describe("Cluster name"),service:i.optional().describe("Service name"),lambda:i.optional().describe("Lambda function name")}).strict().refine(t=>!(t.service&&!t.cluster),{message:"Cluster is required when service is specified"}).refine(t=>!(t.lambda&&(t.cluster||t.service)),{message:"Lambda is mutually exclusive with cluster and service"}).refine(t=>t.cluster!=="lambda",{message:'The cluster name "lambda" is reserved for lambda-scoped parameter paths'});function g(t){const e=[t.app];return t.lambda?e.push("lambda",t.lambda):(t.cluster&&e.push(t.cluster),t.service&&t.cluster&&e.push(t.service)),e}n(g,"buildNamespaceParts");function x(t,e){const a=g(t);return e&&a.push(e),"/"+a.join("/")}n(x,"buildParameterPath");function E(t){const e=t.split("/").filter(Boolean);if(e.length<2)return null;const a=e[e.length-1]??"",s={app:e[0]??""};return e.length>=4&&e[1]==="lambda"?s.lambda=e[2]:e.length>=3&&(s.cluster=e[1],e.length>=4&&(s.service=e[2])),{namespace:s,name:a}}n(E,"parseParameterPath");function R(t){const e=E(t);return e?b.safeParse(e.namespace).success&&x(e.namespace,e.name)===t:!1}n(R,"isManageablePath");function T(t){const e={};for(const a of t.split(`
|
|
2
|
+
`)){const s=a.trim();if(!s||s.startsWith("#"))continue;const o=s.replace(/^export\s+/,""),l=o.indexOf("=");if(l===-1)continue;const c=o.slice(0,l).trim();if(!d.test(c))continue;const r=o.slice(l+1);r.length>=2&&r.startsWith('"')&&r.endsWith('"')?e[c]=r.slice(1,-1).replace(/\\([\\"$`nr])/g,(_,p)=>p==="n"?`
|
|
3
|
+
`:p==="r"?"\r":p):r.length>=2&&r.startsWith("'")&&r.endsWith("'")?e[c]=r.slice(1,-1):e[c]=r}return e}n(T,"parseDotEnv");function M(t){return t.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\$/g,"\\$").replace(/`/g,"\\`").replace(/\n/g,"\\n").replace(/\r/g,"\\r")}n(M,"escapeDotEnvValue");export{A as SECRET_NAME_ERROR,d as SECRET_NAME_PATTERN,h as SSM_COMPONENT_ERROR,f as SSM_COMPONENT_PATTERN,N as SSM_STANDARD_MAX_VALUE_BYTES,b as SecretNamespaceSchema,g as buildNamespaceParts,x as buildParameterPath,M as escapeDotEnvValue,R as isManageablePath,T as parseDotEnv,E as parseParameterPath};
|
package/dist/securityHelpers.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
var c=Object.defineProperty;var n=(e,s)=>c(e,"name",{value:s,configurable:!0});const i=new Set(["NODE_OPTIONS","NODE_PATH","NODE_EXTRA_CA_CERTS","NODE_DEBUG","NODE_PRESERVE_SYMLINKS","LD_PRELOAD","LD_LIBRARY_PATH","LD_AUDIT","LD_BIND_NOW","DYLD_INSERT_LIBRARIES","DYLD_LIBRARY_PATH","DYLD_FRAMEWORK_PATH","PYTHONPATH","PYTHONSTARTUP","PERL5LIB","PERL5OPT","RUBYLIB","RUBYOPT","HOME","XDG_CONFIG_HOME","AWS_SHARED_CREDENTIALS_FILE","AWS_CONFIG_FILE","SHELL","BASH_ENV","ENV","ZDOTDIR"]);function D(e){return Object.fromEntries(Object.entries(e).filter(([s])=>!i.has(s.toUpperCase())))}n(D,"filterDangerousEnvVars");const R=/fjall_(?:ak|dk)_[A-Z2-7]{16}\.[A-Z2-7]{40}/,l=/(fjall_(?:ak|dk)_)[A-Z2-7]{16}\.[A-Z2-7]{40}/g;function T(e){return e.replace(/-----BEGIN [A-Z ]*PRIVATE KEY-----(?:[^"\\]|\\[\\nrt"])*?-----END [A-Z ]*PRIVATE KEY-----/g,"-----BEGIN [REDACTED] PRIVATE KEY-----...-----END [REDACTED] PRIVATE KEY-----").replace(/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g,"-----BEGIN [REDACTED] PRIVATE KEY-----...-----END [REDACTED] PRIVATE KEY-----").replace(/(\w+:\/\/[^:]+:)[^@]+(@)/gi,"$1***$2").replace(/(?<![a-zA-Z])(password|passwd|secret|api[_-]?key|token|auth|credential)([=:])["']?[^\s"']+/gi,"$1$2***").replace(/\b(ghu_|ghs_|ghp_|gho_|github_pat_)[A-Za-z0-9_]+/g,"$1***").replace(/\b(sk|rk)_(live|test)_[A-Za-z0-9]{8,}/g,"$1_$2_***").replace(/\bwhsec_[A-Za-z0-9]{8,}/g,"whsec_***").replace(/(?<=Authorization:\s*Bearer\s+)[A-Za-z0-9._~+/=-]+/gi,"***").replace(/\b(AKIA|ASIA)[A-Z0-9]{12,}\b/g,"$1***").replace(/(?<=aws_secret_access_key\s*=\s*["']?|SecretAccessKey[=:]\s*|"(aws)?secretAccessKey":\s*"|"aws_secret_access_key":\s*")[A-Za-z0-9/+=]{40,}/gi,"***").replace(/(?<="(aws)?sessionToken":\s*"|"aws_session_token":\s*")[^"]+/gi,"***").replace(/(?<=aws_session_token\s*[=:]\s*["']?|SessionToken[=:]\s*["']?)[^\s"']+/gi,"***").replace(/(?<="(internal[Aa]piKey|fjallCallbackToken)":\s*")[^"]+/g,"***").replace(l,"$1***")}n(T,"maskSensitiveOutput");function p(e){const s=[];let E="",a=!1,t=!1,A=!1,_=!1;for(const r of e){if(A){E+=r,A=!1;continue}if(r==="\\"&&!a){A=!0;continue}if(r==="'"&&!t){a=!a,_=!0;continue}if(r==='"'&&!a){t=!t,_=!0;continue}if(r===" "&&!a&&!t){(E||_)&&(s.push(E),E="",_=!1);continue}E+=r}if(a||t)throw new Error(`Unbalanced ${a?"single":"double"} quote in command: ${e.slice(0,80)}`);if(A)throw new Error(`Trailing backslash in command: ${e.slice(0,80)}`);return(E||_)&&s.push(E),s}n(p,"parseShellArgs");export{i as DANGEROUS_ENV_VARS,R as SCOPED_TOKEN_REGEX,D as filterDangerousEnvVars,T as maskSensitiveOutput,p as parseShellArgs};
|
package/dist/targets.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{abbreviateRegion as
|
|
1
|
+
var s=Object.defineProperty;var o=(e,n)=>s(e,"name",{value:n,configurable:!0});import{abbreviateRegion as u}from"./infra/regions.js";import{accountTier as m}from"./environments.js";function f(e){const n=[e.primaryRegion,...e.secondaryRegions??[],e.disasterRecoveryRegion].filter(t=>t!==void 0);return[...new Set(n)]}o(f,"deriveRegionsFromOrgConfig");function p(e){return e.environment??m(e)}o(p,"environmentOrTier");function d(e,n){return`${e.toLowerCase()}-${u(n)}`}o(d,"generateTargetName");function g(e,n){const t=[];for(const r of e){if(m(r)==="organisation")continue;const i=p(r);for(const a of n)t.push({name:d(r.name,a),accountName:r.name,accountId:r.id,environment:i,region:a})}return t.sort((r,i)=>{const a=r.environment.localeCompare(i.environment);if(a!==0)return a;const c=r.accountName.localeCompare(i.accountName);return c!==0?c:r.region.localeCompare(i.region)})}o(g,"deriveTargets");function x(e){return g(e.providerAccounts,f(e))}o(x,"deriveAllTargets");function y(e,n){if(n.length===0)return e;const t=new Set([e.primaryRegion,e.disasterRecoveryRegion].filter(Boolean)),r=n.filter(i=>!t.has(i));return{...e,secondaryRegions:r.length>0?r:void 0}}o(y,"mergeSecondaryRegions");function T(e,n){return e.find(t=>t.name===n)}o(T,"findTarget");export{x as deriveAllTargets,f as deriveRegionsFromOrgConfig,g as deriveTargets,p as environmentOrTier,T as findTarget,d as generateTargetName,y as mergeSecondaryRegions};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fjall/util",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "Common utility methods",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -134,5 +134,5 @@
|
|
|
134
134
|
"engines": {
|
|
135
135
|
"node": ">=22.0.0"
|
|
136
136
|
},
|
|
137
|
-
"gitHead": "
|
|
137
|
+
"gitHead": "848a386e3e2244401b76faabd02818c682d231e8"
|
|
138
138
|
}
|