@jaypie/constructs 1.1.64 → 1.1.66

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/esm/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as cdk from 'aws-cdk-lib';
2
- import { Tags, Stack, Duration, RemovalPolicy, CfnStack, Fn, CfnOutput, SecretValue } from 'aws-cdk-lib';
2
+ import { Tags, Stack, Fn, CfnOutput, SecretValue, Duration, RemovalPolicy, CfnStack } from 'aws-cdk-lib';
3
3
  import * as s3 from 'aws-cdk-lib/aws-s3';
4
4
  import { Bucket, StorageClass, BucketAccessControl, EventType } from 'aws-cdk-lib/aws-s3';
5
5
  import { Construct } from 'constructs';
@@ -657,6 +657,66 @@ function resolveDatadogLoggingDestination(scope, options) {
657
657
  return datadogLoggingDestination;
658
658
  }
659
659
 
660
+ /**
661
+ * Resolves environment input to a plain object.
662
+ *
663
+ * When environment is an object (legacy syntax), returns it as-is.
664
+ * When environment is an array:
665
+ * - Strings are treated as keys to lookup in process.env
666
+ * - Objects have their key-value pairs merged in
667
+ *
668
+ * @example
669
+ * // Legacy object syntax
670
+ * resolveEnvironment({ FOO: "bar" })
671
+ * // => { FOO: "bar" }
672
+ *
673
+ * @example
674
+ * // Array syntax with process.env lookup
675
+ * // Given process.env.MY_VAR = "hello"
676
+ * resolveEnvironment(["MY_VAR"])
677
+ * // => { MY_VAR: "hello" }
678
+ *
679
+ * @example
680
+ * // Array syntax with objects
681
+ * resolveEnvironment([{ FOO: "bar", BAZ: "qux" }])
682
+ * // => { FOO: "bar", BAZ: "qux" }
683
+ *
684
+ * @example
685
+ * // Mixed array syntax
686
+ * // Given process.env.MY_VAR = "hello"
687
+ * resolveEnvironment(["MY_VAR", { FOO: "bar" }])
688
+ * // => { MY_VAR: "hello", FOO: "bar" }
689
+ */
690
+ function resolveEnvironment(environment, env = process.env) {
691
+ if (!environment) {
692
+ return {};
693
+ }
694
+ // Legacy object syntax - return as-is
695
+ if (!Array.isArray(environment)) {
696
+ return environment;
697
+ }
698
+ // Array syntax - process each item
699
+ return environment.reduce((acc, item) => {
700
+ if (typeof item === "string") {
701
+ // String: lookup in process.env
702
+ const value = env[item];
703
+ if (value !== undefined) {
704
+ return {
705
+ ...acc,
706
+ [item]: value,
707
+ };
708
+ }
709
+ // Skip if not found in process.env
710
+ return acc;
711
+ }
712
+ // Object: merge key-value pairs
713
+ return {
714
+ ...acc,
715
+ ...item,
716
+ };
717
+ }, {});
718
+ }
719
+
660
720
  function resolveHostedZone(scope, { name = "HostedZone", zone = process.env.CDK_ENV_HOSTED_ZONE, } = {}) {
661
721
  if (!zone) {
662
722
  throw new ConfigurationError("No `zone` provided. Set CDK_ENV_HOSTED_ZONE to use environment zone");
@@ -689,6 +749,246 @@ const resolveParamsAndSecrets = ({ paramsAndSecrets, options, } = {}) => {
689
749
  return resolvedParamsAndSecrets;
690
750
  };
691
751
 
752
+ // It is a consumer if the environment is ephemeral
753
+ function checkEnvIsConsumer(env = process.env) {
754
+ return (env.PROJECT_ENV === CDK$2.ENV.PERSONAL ||
755
+ !!env.CDK_ENV_PERSONAL ||
756
+ /** @deprecated */ env.PROJECT_ENV === "ephemeral" ||
757
+ /** @deprecated */ !!env.CDK_ENV_EPHEMERAL);
758
+ }
759
+ function checkEnvIsProvider(env = process.env) {
760
+ return env.PROJECT_ENV === CDK$2.ENV.SANDBOX;
761
+ }
762
+ function cleanName(name) {
763
+ return name.replace(/[^a-zA-Z0-9:-]/g, "");
764
+ }
765
+ function exportEnvName(name, env = process.env) {
766
+ let rawName;
767
+ if (checkEnvIsProvider(env)) {
768
+ rawName = `env-${env.PROJECT_ENV}-${env.PROJECT_KEY}-${name}`;
769
+ // Clean the entire name to only allow alphanumeric, colons, and hyphens
770
+ return cleanName(rawName);
771
+ }
772
+ else {
773
+ if (checkEnvIsConsumer(env)) {
774
+ rawName = `env-${CDK$2.ENV.SANDBOX}-${env.PROJECT_KEY}-${name}`;
775
+ }
776
+ else {
777
+ rawName = `env-${env.PROJECT_ENV}-${env.PROJECT_KEY}-${name}`;
778
+ }
779
+ }
780
+ return cleanName(rawName);
781
+ }
782
+ class JaypieEnvSecret extends Construct {
783
+ constructor(scope, idOrEnvKey, props) {
784
+ // Check if idOrEnvKey should be treated as envKey:
785
+ // - No props provided OR props.envKey is not set
786
+ // - AND idOrEnvKey exists as a non-empty string in process.env
787
+ const treatAsEnvKey = (!props || props.envKey === undefined) &&
788
+ typeof process.env[idOrEnvKey] === "string" &&
789
+ process.env[idOrEnvKey] !== "";
790
+ const id = treatAsEnvKey ? `EnvSecret_${idOrEnvKey}` : idOrEnvKey;
791
+ super(scope, id);
792
+ const { consumer = checkEnvIsConsumer(), envKey: envKeyProp, export: exportParam, generateSecretString, provider = checkEnvIsProvider(), roleTag, vendorTag, value, } = props || {};
793
+ const envKey = treatAsEnvKey ? idOrEnvKey : envKeyProp;
794
+ this._envKey = envKey;
795
+ let exportName;
796
+ if (!exportParam) {
797
+ exportName = exportEnvName(id);
798
+ }
799
+ else {
800
+ exportName = cleanName(exportParam);
801
+ }
802
+ if (consumer) {
803
+ const secretName = Fn.importValue(exportName);
804
+ this._secret = secretsmanager.Secret.fromSecretNameV2(this, id, secretName);
805
+ // Add CfnOutput for consumer secrets
806
+ new CfnOutput(this, `ConsumedName`, {
807
+ value: this._secret.secretName,
808
+ });
809
+ }
810
+ else {
811
+ const secretValue = envKey && process.env[envKey] ? process.env[envKey] : value;
812
+ const secretProps = {
813
+ generateSecretString,
814
+ secretStringValue: !generateSecretString && secretValue
815
+ ? SecretValue.unsafePlainText(secretValue)
816
+ : undefined,
817
+ };
818
+ this._secret = new secretsmanager.Secret(this, id, secretProps);
819
+ if (roleTag) {
820
+ Tags.of(this._secret).add(CDK$2.TAG.ROLE, roleTag);
821
+ }
822
+ if (vendorTag) {
823
+ Tags.of(this._secret).add(CDK$2.TAG.VENDOR, vendorTag);
824
+ }
825
+ if (provider) {
826
+ new CfnOutput(this, `ProvidedName`, {
827
+ value: this._secret.secretName,
828
+ exportName,
829
+ });
830
+ }
831
+ else {
832
+ new CfnOutput(this, `CreatedName`, {
833
+ value: this._secret.secretName,
834
+ });
835
+ }
836
+ }
837
+ }
838
+ // IResource implementation
839
+ get stack() {
840
+ return Stack.of(this);
841
+ }
842
+ get env() {
843
+ return {
844
+ account: Stack.of(this).account,
845
+ region: Stack.of(this).region,
846
+ };
847
+ }
848
+ applyRemovalPolicy(policy) {
849
+ this._secret.applyRemovalPolicy(policy);
850
+ }
851
+ // ISecret implementation
852
+ get secretArn() {
853
+ return this._secret.secretArn;
854
+ }
855
+ get secretName() {
856
+ return this._secret.secretName;
857
+ }
858
+ get secretFullArn() {
859
+ return this._secret.secretFullArn;
860
+ }
861
+ get encryptionKey() {
862
+ return this._secret.encryptionKey;
863
+ }
864
+ get secretValue() {
865
+ return this._secret.secretValue;
866
+ }
867
+ secretValueFromJson(key) {
868
+ return this._secret.secretValueFromJson(key);
869
+ }
870
+ grantRead(grantee, versionStages) {
871
+ return this._secret.grantRead(grantee, versionStages);
872
+ }
873
+ grantWrite(grantee) {
874
+ return this._secret.grantWrite(grantee);
875
+ }
876
+ addRotationSchedule(id, options) {
877
+ return this._secret.addRotationSchedule(id, options);
878
+ }
879
+ addToResourcePolicy(statement) {
880
+ return this._secret.addToResourcePolicy(statement);
881
+ }
882
+ denyAccountRootDelete() {
883
+ this._secret.denyAccountRootDelete();
884
+ }
885
+ attach(target) {
886
+ return this._secret.attach(target);
887
+ }
888
+ cfnDynamicReferenceKey(options) {
889
+ return this._secret.cfnDynamicReferenceKey(options);
890
+ }
891
+ get envKey() {
892
+ return this._envKey;
893
+ }
894
+ }
895
+
896
+ /**
897
+ * Cache for secrets by scope to avoid creating duplicates.
898
+ * Uses WeakMap to allow garbage collection when scopes are no longer referenced.
899
+ */
900
+ const secretsByScope = new WeakMap();
901
+ /**
902
+ * Gets or creates the secrets cache for a given scope.
903
+ */
904
+ function getSecretsCache(scope) {
905
+ let cache = secretsByScope.get(scope);
906
+ if (!cache) {
907
+ cache = new Map();
908
+ secretsByScope.set(scope, cache);
909
+ }
910
+ return cache;
911
+ }
912
+ /**
913
+ * Gets an existing secret from the cache or creates a new one.
914
+ * This ensures that multiple constructs within the same scope share secrets.
915
+ */
916
+ function getOrCreateSecret(scope, envKey, props) {
917
+ const cache = getSecretsCache(scope);
918
+ const existingSecret = cache.get(envKey);
919
+ if (existingSecret) {
920
+ return existingSecret;
921
+ }
922
+ // Create new secret - JaypieEnvSecret's smart constructor handles envKey detection
923
+ const secret = new JaypieEnvSecret(scope, envKey, {
924
+ ...props,
925
+ envKey,
926
+ });
927
+ cache.set(envKey, secret);
928
+ return secret;
929
+ }
930
+ /**
931
+ * Resolves secrets input to an array of JaypieEnvSecret instances.
932
+ *
933
+ * When an item is already a JaypieEnvSecret, it's passed through as-is.
934
+ * When an item is a string, a JaypieEnvSecret is created (or reused from cache)
935
+ * with the string as the envKey.
936
+ *
937
+ * Secrets are cached per scope to avoid creating duplicate secrets when
938
+ * multiple constructs in the same scope reference the same secret.
939
+ *
940
+ * @example
941
+ * // JaypieEnvSecret instances pass through
942
+ * const secret = new JaypieEnvSecret(scope, "MySecret", { envKey: "MY_KEY" });
943
+ * resolveSecrets(scope, [secret])
944
+ * // => [secret]
945
+ *
946
+ * @example
947
+ * // Strings create JaypieEnvSecret instances
948
+ * resolveSecrets(scope, ["AUTH0_SECRET", "MONGODB_URI"])
949
+ * // => [JaypieEnvSecret(envKey: "AUTH0_SECRET"), JaypieEnvSecret(envKey: "MONGODB_URI")]
950
+ *
951
+ * @example
952
+ * // Mixed input
953
+ * const existingSecret = new JaypieEnvSecret(scope, "Existing", { envKey: "EXISTING" });
954
+ * resolveSecrets(scope, [existingSecret, "NEW_SECRET"])
955
+ * // => [existingSecret, JaypieEnvSecret(envKey: "NEW_SECRET")]
956
+ *
957
+ * @example
958
+ * // Secrets are shared across calls with the same scope
959
+ * const secrets1 = resolveSecrets(scope, ["SHARED_SECRET"]);
960
+ * const secrets2 = resolveSecrets(scope, ["SHARED_SECRET"]);
961
+ * // secrets1[0] === secrets2[0] (same instance)
962
+ */
963
+ function resolveSecrets(scope, secrets) {
964
+ if (!secrets || secrets.length === 0) {
965
+ return [];
966
+ }
967
+ return secrets.map((item) => {
968
+ if (typeof item === "string") {
969
+ return getOrCreateSecret(scope, item);
970
+ }
971
+ // Already a JaypieEnvSecret instance
972
+ return item;
973
+ });
974
+ }
975
+ /**
976
+ * Clears the secrets cache for a given scope.
977
+ * Primarily useful for testing.
978
+ */
979
+ function clearSecretsCache(scope) {
980
+ secretsByScope.delete(scope);
981
+ }
982
+ /**
983
+ * Clears all secrets caches.
984
+ * Primarily useful for testing.
985
+ */
986
+ function clearAllSecretsCaches() {
987
+ // WeakMap doesn't have a clear() method, so we create a new one
988
+ // This relies on the module being reloaded or the function being called
989
+ // between test runs. For testing, use clearSecretsCache(scope) instead.
990
+ }
991
+
692
992
  class JaypieApiGateway extends Construct {
693
993
  constructor(scope, id, props) {
694
994
  super(scope, id);
@@ -870,11 +1170,15 @@ class JaypieAppStack extends JaypieStack {
870
1170
  class JaypieLambda extends Construct {
871
1171
  constructor(scope, id, props) {
872
1172
  super(scope, id);
873
- const { allowAllOutbound, allowPublicSubnet, architecture = lambda.Architecture.X86_64, code, datadogApiKeyArn, deadLetterQueue, deadLetterQueueEnabled, deadLetterTopic, description, environment: initialEnvironment = {}, envSecrets = {}, ephemeralStorageSize, filesystem, handler = "index.handler", initialPolicy, layers = [], logGroup, logRetention = CDK$2.LAMBDA.LOG_RETENTION, maxEventAge, memorySize = CDK$2.LAMBDA.MEMORY_SIZE, paramsAndSecrets, paramsAndSecretsOptions, profiling, profilingGroup, provisionedConcurrentExecutions, reservedConcurrentExecutions, retryAttempts, roleTag = CDK$2.ROLE.PROCESSING, runtime = new lambda.Runtime("nodejs24.x", lambda.RuntimeFamily.NODEJS, {
1173
+ const { allowAllOutbound, allowPublicSubnet, architecture = lambda.Architecture.X86_64, code, datadogApiKeyArn, deadLetterQueue, deadLetterQueueEnabled, deadLetterTopic, description, environment: environmentInput, envSecrets = {}, ephemeralStorageSize, filesystem, handler = "index.handler", initialPolicy, layers = [], logGroup, logRetention = CDK$2.LAMBDA.LOG_RETENTION, maxEventAge, memorySize = CDK$2.LAMBDA.MEMORY_SIZE, paramsAndSecrets, paramsAndSecretsOptions, profiling, profilingGroup, provisionedConcurrentExecutions, reservedConcurrentExecutions, retryAttempts, roleTag = CDK$2.ROLE.PROCESSING, runtime = new lambda.Runtime("nodejs24.x", lambda.RuntimeFamily.NODEJS, {
874
1174
  supportsInlineCode: true,
875
- }), runtimeManagementMode, secrets = [], securityGroups, timeout = Duration.seconds(CDK$2.DURATION.LAMBDA_WORKER), tracing, vendorTag, vpc, vpcSubnets, } = props;
1175
+ }), runtimeManagementMode, secrets: secretsInput = [], securityGroups, timeout = Duration.seconds(CDK$2.DURATION.LAMBDA_WORKER), tracing, vendorTag, vpc, vpcSubnets, } = props;
1176
+ // Resolve environment from array or object syntax
1177
+ const initialEnvironment = resolveEnvironment(environmentInput);
876
1178
  // Get base environment with defaults
877
1179
  const environment = jaypieLambdaEnv({ initialEnvironment });
1180
+ // Resolve secrets from mixed array (strings and JaypieEnvSecret instances)
1181
+ const secrets = resolveSecrets(scope, secretsInput);
878
1182
  const codeAsset = typeof code === "string" ? lambda.Code.fromAsset(code) : code;
879
1183
  // Create a working copy of layers
880
1184
  const resolvedLayers = [...layers];
@@ -1855,150 +2159,6 @@ class JaypieDistribution extends Construct {
1855
2159
  }
1856
2160
  }
1857
2161
 
1858
- // It is a consumer if the environment is ephemeral
1859
- function checkEnvIsConsumer(env = process.env) {
1860
- return (env.PROJECT_ENV === CDK$2.ENV.PERSONAL ||
1861
- !!env.CDK_ENV_PERSONAL ||
1862
- /** @deprecated */ env.PROJECT_ENV === "ephemeral" ||
1863
- /** @deprecated */ !!env.CDK_ENV_EPHEMERAL);
1864
- }
1865
- function checkEnvIsProvider(env = process.env) {
1866
- return env.PROJECT_ENV === CDK$2.ENV.SANDBOX;
1867
- }
1868
- function cleanName(name) {
1869
- return name.replace(/[^a-zA-Z0-9:-]/g, "");
1870
- }
1871
- function exportEnvName(name, env = process.env) {
1872
- let rawName;
1873
- if (checkEnvIsProvider(env)) {
1874
- rawName = `env-${env.PROJECT_ENV}-${env.PROJECT_KEY}-${name}`;
1875
- // Clean the entire name to only allow alphanumeric, colons, and hyphens
1876
- return cleanName(rawName);
1877
- }
1878
- else {
1879
- if (checkEnvIsConsumer(env)) {
1880
- rawName = `env-${CDK$2.ENV.SANDBOX}-${env.PROJECT_KEY}-${name}`;
1881
- }
1882
- else {
1883
- rawName = `env-${env.PROJECT_ENV}-${env.PROJECT_KEY}-${name}`;
1884
- }
1885
- }
1886
- return cleanName(rawName);
1887
- }
1888
- class JaypieEnvSecret extends Construct {
1889
- constructor(scope, idOrEnvKey, props) {
1890
- // Check if idOrEnvKey should be treated as envKey:
1891
- // - No props provided OR props.envKey is not set
1892
- // - AND idOrEnvKey exists as a non-empty string in process.env
1893
- const treatAsEnvKey = (!props || props.envKey === undefined) &&
1894
- typeof process.env[idOrEnvKey] === "string" &&
1895
- process.env[idOrEnvKey] !== "";
1896
- const id = treatAsEnvKey ? `EnvSecret_${idOrEnvKey}` : idOrEnvKey;
1897
- super(scope, id);
1898
- const { consumer = checkEnvIsConsumer(), envKey: envKeyProp, export: exportParam, generateSecretString, provider = checkEnvIsProvider(), roleTag, vendorTag, value, } = props || {};
1899
- const envKey = treatAsEnvKey ? idOrEnvKey : envKeyProp;
1900
- this._envKey = envKey;
1901
- let exportName;
1902
- if (!exportParam) {
1903
- exportName = exportEnvName(id);
1904
- }
1905
- else {
1906
- exportName = cleanName(exportParam);
1907
- }
1908
- if (consumer) {
1909
- const secretName = Fn.importValue(exportName);
1910
- this._secret = secretsmanager.Secret.fromSecretNameV2(this, id, secretName);
1911
- // Add CfnOutput for consumer secrets
1912
- new CfnOutput(this, `ConsumedName`, {
1913
- value: this._secret.secretName,
1914
- });
1915
- }
1916
- else {
1917
- const secretValue = envKey && process.env[envKey] ? process.env[envKey] : value;
1918
- const secretProps = {
1919
- generateSecretString,
1920
- secretStringValue: !generateSecretString && secretValue
1921
- ? SecretValue.unsafePlainText(secretValue)
1922
- : undefined,
1923
- };
1924
- this._secret = new secretsmanager.Secret(this, id, secretProps);
1925
- if (roleTag) {
1926
- Tags.of(this._secret).add(CDK$2.TAG.ROLE, roleTag);
1927
- }
1928
- if (vendorTag) {
1929
- Tags.of(this._secret).add(CDK$2.TAG.VENDOR, vendorTag);
1930
- }
1931
- if (provider) {
1932
- new CfnOutput(this, `ProvidedName`, {
1933
- value: this._secret.secretName,
1934
- exportName,
1935
- });
1936
- }
1937
- else {
1938
- new CfnOutput(this, `CreatedName`, {
1939
- value: this._secret.secretName,
1940
- });
1941
- }
1942
- }
1943
- }
1944
- // IResource implementation
1945
- get stack() {
1946
- return Stack.of(this);
1947
- }
1948
- get env() {
1949
- return {
1950
- account: Stack.of(this).account,
1951
- region: Stack.of(this).region,
1952
- };
1953
- }
1954
- applyRemovalPolicy(policy) {
1955
- this._secret.applyRemovalPolicy(policy);
1956
- }
1957
- // ISecret implementation
1958
- get secretArn() {
1959
- return this._secret.secretArn;
1960
- }
1961
- get secretName() {
1962
- return this._secret.secretName;
1963
- }
1964
- get secretFullArn() {
1965
- return this._secret.secretFullArn;
1966
- }
1967
- get encryptionKey() {
1968
- return this._secret.encryptionKey;
1969
- }
1970
- get secretValue() {
1971
- return this._secret.secretValue;
1972
- }
1973
- secretValueFromJson(key) {
1974
- return this._secret.secretValueFromJson(key);
1975
- }
1976
- grantRead(grantee, versionStages) {
1977
- return this._secret.grantRead(grantee, versionStages);
1978
- }
1979
- grantWrite(grantee) {
1980
- return this._secret.grantWrite(grantee);
1981
- }
1982
- addRotationSchedule(id, options) {
1983
- return this._secret.addRotationSchedule(id, options);
1984
- }
1985
- addToResourcePolicy(statement) {
1986
- return this._secret.addToResourcePolicy(statement);
1987
- }
1988
- denyAccountRootDelete() {
1989
- this._secret.denyAccountRootDelete();
1990
- }
1991
- attach(target) {
1992
- return this._secret.attach(target);
1993
- }
1994
- cfnDynamicReferenceKey(options) {
1995
- return this._secret.cfnDynamicReferenceKey(options);
1996
- }
1997
- get envKey() {
1998
- return this._envKey;
1999
- }
2000
- }
2001
-
2002
2162
  class JaypieDatadogSecret extends JaypieEnvSecret {
2003
2163
  constructor(scope, id = "MongoConnectionString", props) {
2004
2164
  const defaultProps = {
@@ -2410,12 +2570,15 @@ class JaypieNextJs extends Construct {
2410
2570
  const domainNameSanitized = domainName
2411
2571
  .replace(/\./g, "-")
2412
2572
  .replace(/[^a-zA-Z0-9]/g, "_");
2573
+ // Resolve environment from array or object syntax
2574
+ const environment = resolveEnvironment(props?.environment);
2413
2575
  const envSecrets = props?.envSecrets || {};
2414
2576
  const nextjsPath = props?.nextjsPath?.startsWith("..")
2415
2577
  ? path.join(process.cwd(), props.nextjsPath)
2416
2578
  : props?.nextjsPath || path.join(process.cwd(), "..", "nextjs");
2417
2579
  const paramsAndSecrets = resolveParamsAndSecrets();
2418
- const secrets = props?.secrets || [];
2580
+ // Resolve secrets from mixed array (strings and JaypieEnvSecret instances)
2581
+ const secrets = resolveSecrets(scope, props?.secrets);
2419
2582
  // Process secrets environment variables
2420
2583
  const secretsEnvironment = Object.entries(envSecrets).reduce((acc, [key, secret]) => ({
2421
2584
  ...acc,
@@ -2451,6 +2614,7 @@ class JaypieNextJs extends Construct {
2451
2614
  },
2452
2615
  environment: {
2453
2616
  ...jaypieLambdaEnv(),
2617
+ ...environment,
2454
2618
  ...secretsEnvironment,
2455
2619
  ...jaypieSecretsEnvironment,
2456
2620
  ...nextPublicEnv,
@@ -3255,5 +3419,5 @@ class JaypieTraceSigningKeySecret extends JaypieEnvSecret {
3255
3419
  }
3256
3420
  }
3257
3421
 
3258
- export { CDK$2 as CDK, JaypieAccountLoggingBucket, JaypieApiGateway, JaypieAppStack, JaypieBucketQueuedLambda, JaypieDatadogBucket, JaypieDatadogForwarder, JaypieDatadogSecret, JaypieDistribution, JaypieDnsRecord, JaypieEnvSecret, JaypieEventsRule, JaypieExpressLambda, JaypieGitHubDeployRole, JaypieHostedZone, JaypieInfrastructureStack, JaypieLambda, JaypieMongoDbSecret, JaypieNextJs, JaypieOpenAiSecret, JaypieOrganizationTrail, JaypieQueuedLambda, JaypieSsoPermissions, JaypieSsoSyncApplication, JaypieStack, JaypieStaticWebBucket, JaypieTraceSigningKeySecret, JaypieWebDeploymentBucket, addDatadogLayers, constructEnvName, constructStackName, constructTagger, envHostname, extendDatadogRole, isEnv, isProductionEnv, isSandboxEnv, isValidHostname$1 as isValidHostname, isValidSubdomain, jaypieLambdaEnv, mergeDomain, resolveDatadogForwarderFunction, resolveDatadogLayers, resolveDatadogLoggingDestination, resolveHostedZone, resolveParamsAndSecrets };
3422
+ export { CDK$2 as CDK, JaypieAccountLoggingBucket, JaypieApiGateway, JaypieAppStack, JaypieBucketQueuedLambda, JaypieDatadogBucket, JaypieDatadogForwarder, JaypieDatadogSecret, JaypieDistribution, JaypieDnsRecord, JaypieEnvSecret, JaypieEventsRule, JaypieExpressLambda, JaypieGitHubDeployRole, JaypieHostedZone, JaypieInfrastructureStack, JaypieLambda, JaypieMongoDbSecret, JaypieNextJs, JaypieOpenAiSecret, JaypieOrganizationTrail, JaypieQueuedLambda, JaypieSsoPermissions, JaypieSsoSyncApplication, JaypieStack, JaypieStaticWebBucket, JaypieTraceSigningKeySecret, JaypieWebDeploymentBucket, addDatadogLayers, clearAllSecretsCaches, clearSecretsCache, constructEnvName, constructStackName, constructTagger, envHostname, extendDatadogRole, isEnv, isProductionEnv, isSandboxEnv, isValidHostname$1 as isValidHostname, isValidSubdomain, jaypieLambdaEnv, mergeDomain, resolveDatadogForwarderFunction, resolveDatadogLayers, resolveDatadogLoggingDestination, resolveEnvironment, resolveHostedZone, resolveParamsAndSecrets, resolveSecrets };
3259
3423
  //# sourceMappingURL=index.js.map