@dyanet/nextjs-config-aws 1.0.0-beta.1 → 1.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.
Files changed (46) hide show
  1. package/README.md +147 -173
  2. package/dist/cjs/client/env.js +9 -1
  3. package/dist/cjs/client/env.js.map +1 -1
  4. package/dist/cjs/components/public-env-script.js +4 -0
  5. package/dist/cjs/components/public-env-script.js.map +1 -1
  6. package/dist/cjs/index.js +46 -28
  7. package/dist/cjs/index.js.map +1 -1
  8. package/dist/cjs/server/get-config.js +74 -28
  9. package/dist/cjs/server/get-config.js.map +1 -1
  10. package/dist/cjs/server/internal/environment.js +38 -0
  11. package/dist/cjs/server/internal/environment.js.map +1 -0
  12. package/dist/cjs/server/internal/index.js +13 -0
  13. package/dist/cjs/server/internal/index.js.map +1 -0
  14. package/dist/cjs/server/internal/loader-factory.js +61 -0
  15. package/dist/cjs/server/internal/loader-factory.js.map +1 -0
  16. package/dist/esm/client/env.js +9 -1
  17. package/dist/esm/client/env.js.map +1 -1
  18. package/dist/esm/components/public-env-script.js +4 -0
  19. package/dist/esm/components/public-env-script.js.map +1 -1
  20. package/dist/esm/index.js +49 -8
  21. package/dist/esm/index.js.map +1 -1
  22. package/dist/esm/server/get-config.js +74 -28
  23. package/dist/esm/server/get-config.js.map +1 -1
  24. package/dist/esm/server/internal/environment.js +35 -0
  25. package/dist/esm/server/internal/environment.js.map +1 -0
  26. package/dist/esm/server/internal/index.js +8 -0
  27. package/dist/esm/server/internal/index.js.map +1 -0
  28. package/dist/esm/server/internal/loader-factory.js +58 -0
  29. package/dist/esm/server/internal/loader-factory.js.map +1 -0
  30. package/dist/types/client/env.d.ts +9 -1
  31. package/dist/types/client/env.d.ts.map +1 -1
  32. package/dist/types/components/public-env-script.d.ts +4 -0
  33. package/dist/types/components/public-env-script.d.ts.map +1 -1
  34. package/dist/types/index.d.ts +46 -7
  35. package/dist/types/index.d.ts.map +1 -1
  36. package/dist/types/server/get-config.d.ts +102 -24
  37. package/dist/types/server/get-config.d.ts.map +1 -1
  38. package/dist/types/server/index.d.ts +2 -0
  39. package/dist/types/server/index.d.ts.map +1 -1
  40. package/dist/types/server/internal/environment.d.ts +30 -0
  41. package/dist/types/server/internal/environment.d.ts.map +1 -0
  42. package/dist/types/server/internal/index.d.ts +8 -0
  43. package/dist/types/server/internal/index.d.ts.map +1 -0
  44. package/dist/types/server/internal/loader-factory.d.ts +51 -0
  45. package/dist/types/server/internal/loader-factory.d.ts.map +1 -0
  46. package/package.json +1 -1
@@ -2,6 +2,31 @@
2
2
  /**
3
3
  * Server-side configuration loading for Next.js applications.
4
4
  * Provides a cached getConfig() function that uses ConfigManager from @dyanet/config-aws.
5
+ *
6
+ * This module provides a simplified, opinionated API that hides loader complexity.
7
+ * For advanced usage such as custom loaders, direct AWS SDK integration, or
8
+ * fine-grained control over configuration loading, import from `@dyanet/config-aws` directly:
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * // Advanced usage with custom loaders
13
+ * import {
14
+ * ConfigManager,
15
+ * EnvironmentLoader,
16
+ * SecretsManagerLoader,
17
+ * SSMParameterStoreLoader,
18
+ * } from '@dyanet/config-aws';
19
+ *
20
+ * const manager = new ConfigManager({
21
+ * loaders: [
22
+ * new EnvironmentLoader({ prefix: 'APP_' }),
23
+ * new SecretsManagerLoader({ secretName: '/my-app/config' }),
24
+ * ],
25
+ * schema: mySchema,
26
+ * });
27
+ * await manager.load();
28
+ * const config = manager.getAll();
29
+ * ```
5
30
  */
6
31
  Object.defineProperty(exports, "__esModule", { value: true });
7
32
  exports.getConfig = getConfig;
@@ -11,6 +36,8 @@ exports.getAwsApiCallCount = getAwsApiCallCount;
11
36
  exports.resetAwsApiCallCount = resetAwsApiCallCount;
12
37
  exports.invalidateConfig = invalidateConfig;
13
38
  const config_aws_1 = require("@dyanet/config-aws");
39
+ const environment_1 = require("./internal/environment");
40
+ const loader_factory_1 = require("./internal/loader-factory");
14
41
  /**
15
42
  * Cache storage for configuration
16
43
  * Uses a Map to support multiple cache keys (for different option combinations)
@@ -22,15 +49,16 @@ const configCache = new Map();
22
49
  */
23
50
  let awsApiCallCount = 0;
24
51
  /**
25
- * Generate a cache key from options
52
+ * Generate a cache key from options.
53
+ * The cache key is based on aws options, environment, and forceAwsInDev.
26
54
  * @internal
27
55
  */
28
- function generateCacheKey(options) {
29
- const loaderNames = options.loaders?.map((l) => l.getName()).join(',') ?? '';
30
- const precedence = Array.isArray(options.precedence)
31
- ? options.precedence.map((p) => `${p.loader}:${p.priority}`).join(',')
32
- : options.precedence ?? 'aws-first';
33
- return `${loaderNames}|${precedence}`;
56
+ function generateCacheKey(options, resolvedEnvironment) {
57
+ return JSON.stringify({
58
+ aws: options.aws,
59
+ environment: resolvedEnvironment,
60
+ forceAwsInDev: options.forceAwsInDev ?? false,
61
+ });
34
62
  }
35
63
  /**
36
64
  * Check if a cache entry is still valid
@@ -44,12 +72,18 @@ function isCacheValid(entry) {
44
72
  /**
45
73
  * Load configuration for Next.js server-side use.
46
74
  *
47
- * This function provides caching to avoid repeated AWS API calls during request handling.
48
- * Configuration is cached based on the loader configuration and precedence strategy.
75
+ * This function provides automatic environment detection and caching to avoid
76
+ * repeated AWS API calls during request handling. Configuration is cached based
77
+ * on the AWS options, environment, and forceAwsInDev setting.
78
+ *
79
+ * Environment Behavior:
80
+ * - development: env vars + .env.local/.env files, AWS only if forceAwsInDev
81
+ * - production: env vars + .env file + AWS sources (if configured)
82
+ * - test: env vars only (no file or AWS access)
49
83
  *
50
84
  * @example
51
85
  * ```typescript
52
- * import { getConfig, EnvironmentLoader, SecretsManagerLoader } from '@dyanet/nextjs-config-aws';
86
+ * import { getConfig } from '@dyanet/nextjs-config-aws';
53
87
  * import { z } from 'zod';
54
88
  *
55
89
  * const schema = z.object({
@@ -57,29 +91,34 @@ function isCacheValid(entry) {
57
91
  * API_KEY: z.string(),
58
92
  * });
59
93
  *
60
- * // In a Server Component or API route
61
- * export default async function Page() {
62
- * const config = await getConfig({
63
- * schema,
64
- * loaders: [
65
- * new EnvironmentLoader(),
66
- * new SecretsManagerLoader({ secretName: '/my-app/config' }),
67
- * ],
68
- * precedence: 'aws-first',
69
- * });
94
+ * // Minimal usage - auto-detects environment
95
+ * const config = await getConfig({ schema });
70
96
  *
71
- * return <div>DB: {config.DATABASE_URL}</div>;
72
- * }
97
+ * // With AWS Secrets Manager (loaded in production)
98
+ * const config = await getConfig({
99
+ * schema,
100
+ * aws: { secretName: '/my-app/config', region: 'us-east-1' }
101
+ * });
102
+ *
103
+ * // Force AWS in development for testing
104
+ * const config = await getConfig({
105
+ * schema,
106
+ * aws: { secretName: '/my-app/config' },
107
+ * forceAwsInDev: true
108
+ * });
73
109
  * ```
74
110
  *
75
111
  * @param options Configuration options
76
112
  * @returns Promise resolving to the validated configuration object
113
+ * @throws {ValidationError} When schema validation fails (includes invalid key names)
77
114
  */
78
115
  async function getConfig(options = {}) {
79
- const { schema, loaders = [], precedence = 'aws-first', cache = true, cacheTTL = 60000, // 1 minute default
116
+ const { schema, aws, environment: explicitEnvironment, forceAwsInDev = false, cache = true, cacheTTL = 60000, // 1 minute default
80
117
  enableLogging = false, } = options;
81
- // Generate cache key
82
- const cacheKey = generateCacheKey(options);
118
+ // Determine environment: explicit option takes precedence over auto-detection
119
+ const resolvedEnvironment = explicitEnvironment ?? (0, environment_1.detectEnvironment)();
120
+ // Generate cache key based on aws options, environment, and forceAwsInDev
121
+ const cacheKey = generateCacheKey(options, resolvedEnvironment);
83
122
  // Check cache if enabled
84
123
  if (cache) {
85
124
  const cached = configCache.get(cacheKey);
@@ -89,11 +128,17 @@ async function getConfig(options = {}) {
89
128
  }
90
129
  // Increment API call counter (for testing)
91
130
  awsApiCallCount++;
92
- // Create ConfigManager with provided options
131
+ // Create loaders using the internal factory
132
+ const loaders = (0, loader_factory_1.createLoaders)({
133
+ environment: resolvedEnvironment,
134
+ aws,
135
+ forceAwsInDev,
136
+ });
137
+ // Create ConfigManager with generated loaders
93
138
  const managerOptions = {
94
139
  loaders,
95
140
  schema,
96
- precedence,
141
+ precedence: 'aws-first',
97
142
  validateOnLoad: true,
98
143
  enableLogging,
99
144
  };
@@ -147,7 +192,8 @@ function resetAwsApiCallCount() {
147
192
  * @param options The options used to create the cache entry
148
193
  */
149
194
  function invalidateConfig(options) {
150
- const cacheKey = generateCacheKey(options);
195
+ const resolvedEnvironment = options.environment ?? (0, environment_1.detectEnvironment)();
196
+ const cacheKey = generateCacheKey(options, resolvedEnvironment);
151
197
  configCache.delete(cacheKey);
152
198
  }
153
199
  //# sourceMappingURL=get-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-config.js","sourceRoot":"","sources":["../../../src/server/get-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"get-config.js","sourceRoot":"","sources":["../../../src/server/get-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ /**
3
+ * Environment detection utilities for Next.js configuration.
4
+ * @internal
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.detectEnvironment = detectEnvironment;
8
+ /**
9
+ * Detect the current environment mode based on NODE_ENV.
10
+ *
11
+ * @returns The detected environment mode:
12
+ * - 'production' if NODE_ENV is 'production'
13
+ * - 'test' if NODE_ENV is 'test'
14
+ * - 'development' for all other cases (including undefined)
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * // NODE_ENV=production
19
+ * detectEnvironment(); // 'production'
20
+ *
21
+ * // NODE_ENV=test
22
+ * detectEnvironment(); // 'test'
23
+ *
24
+ * // NODE_ENV=development or undefined
25
+ * detectEnvironment(); // 'development'
26
+ * ```
27
+ */
28
+ function detectEnvironment() {
29
+ const nodeEnv = process.env['NODE_ENV'];
30
+ if (nodeEnv === 'production') {
31
+ return 'production';
32
+ }
33
+ if (nodeEnv === 'test') {
34
+ return 'test';
35
+ }
36
+ return 'development';
37
+ }
38
+ //# sourceMappingURL=environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../../../src/server/internal/environment.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AA2BH,8CAYC;AAhCD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,SAAgB,iBAAiB;IAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAExC,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC7B,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ /**
3
+ * Internal utilities for Next.js configuration.
4
+ * These are not exported from the public API.
5
+ * @internal
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.createLoaders = exports.detectEnvironment = void 0;
9
+ var environment_1 = require("./environment");
10
+ Object.defineProperty(exports, "detectEnvironment", { enumerable: true, get: function () { return environment_1.detectEnvironment; } });
11
+ var loader_factory_1 = require("./loader-factory");
12
+ Object.defineProperty(exports, "createLoaders", { enumerable: true, get: function () { return loader_factory_1.createLoaders; } });
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/server/internal/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,6CAAwE;AAA/D,gHAAA,iBAAiB,OAAA;AAC1B,mDAA4E;AAAnE,+GAAA,aAAa,OAAA"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ /**
3
+ * Internal loader factory for Next.js configuration.
4
+ * Creates loaders based on environment and options.
5
+ * @internal
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.createLoaders = createLoaders;
9
+ const config_aws_1 = require("@dyanet/config-aws");
10
+ /**
11
+ * Environment Behavior Matrix:
12
+ *
13
+ * | Environment | Env Vars | .env Files | AWS Sources |
14
+ * |-------------|----------|----------------------|-----------------------|
15
+ * | development | ✓ | .env.local, .env | Only if forceAwsInDev |
16
+ * | production | ✓ | .env | ✓ (if configured) |
17
+ * | test | ✓ | ✗ | ✗ |
18
+ */
19
+ /**
20
+ * Create loaders based on environment and options.
21
+ *
22
+ * This factory implements the environment behavior matrix:
23
+ * - development: env vars + .env.local/.env files, AWS only if forceAwsInDev
24
+ * - production: env vars + .env file + AWS sources (if configured)
25
+ * - test: env vars only (no file or AWS access)
26
+ *
27
+ * @param options - Factory options including environment and AWS config
28
+ * @returns Array of ConfigLoader instances
29
+ */
30
+ function createLoaders(options) {
31
+ const { environment, aws, forceAwsInDev = false } = options;
32
+ const loaders = [];
33
+ // Always include environment variables
34
+ loaders.push(new config_aws_1.EnvironmentLoader());
35
+ // Include .env files based on environment
36
+ if (environment === 'development') {
37
+ loaders.push(new config_aws_1.EnvFileLoader({ paths: ['.env.local', '.env'] }));
38
+ }
39
+ else if (environment === 'production') {
40
+ loaders.push(new config_aws_1.EnvFileLoader({ paths: ['.env'] }));
41
+ }
42
+ // test environment: no file loading
43
+ // Include AWS loaders in production or when forced in development
44
+ const shouldLoadAws = environment === 'production' || (environment === 'development' && forceAwsInDev);
45
+ if (shouldLoadAws && aws) {
46
+ if (aws.secretName) {
47
+ loaders.push(new config_aws_1.SecretsManagerLoader({
48
+ secretName: aws.secretName,
49
+ region: aws.region,
50
+ }));
51
+ }
52
+ if (aws.ssmPrefix) {
53
+ loaders.push(new config_aws_1.SSMParameterStoreLoader({
54
+ parameterPath: aws.ssmPrefix,
55
+ region: aws.region,
56
+ }));
57
+ }
58
+ }
59
+ return loaders;
60
+ }
61
+ //# sourceMappingURL=loader-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader-factory.js","sourceRoot":"","sources":["../../../../src/server/internal/loader-factory.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAwDH,sCAmCC;AAzFD,mDAM4B;AA2B5B;;;;;;;;GAQG;AAEH;;;;;;;;;;GAUG;AACH,SAAgB,aAAa,CAAC,OAA6B;IACzD,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAC5D,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,uCAAuC;IACvC,OAAO,CAAC,IAAI,CAAC,IAAI,8BAAiB,EAAE,CAAC,CAAC;IAEtC,0CAA0C;IAC1C,IAAI,WAAW,KAAK,aAAa,EAAE,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,IAAI,0BAAa,CAAC,EAAE,KAAK,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC;SAAM,IAAI,WAAW,KAAK,YAAY,EAAE,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,IAAI,0BAAa,CAAC,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACvD,CAAC;IACD,oCAAoC;IAEpC,kEAAkE;IAClE,MAAM,aAAa,GAAG,WAAW,KAAK,YAAY,IAAI,CAAC,WAAW,KAAK,aAAa,IAAI,aAAa,CAAC,CAAC;IAEvG,IAAI,aAAa,IAAI,GAAG,EAAE,CAAC;QACzB,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,IAAI,iCAAoB,CAAC;gBACpC,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,MAAM,EAAE,GAAG,CAAC,MAAM;aACnB,CAAC,CAAC,CAAC;QACN,CAAC;QAED,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,IAAI,oCAAuB,CAAC;gBACvC,aAAa,EAAE,GAAG,CAAC,SAAS;gBAC5B,MAAM,EAAE,GAAG,CAAC,MAAM;aACnB,CAAC,CAAC,CAAC;QACN,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -4,11 +4,19 @@
4
4
  * This module provides a function to read runtime environment variables
5
5
  * that were injected by the PublicEnvScript server component.
6
6
  *
7
+ * @remarks
8
+ * This is part of the simplified Next.js API. For advanced configuration loading
9
+ * with custom loaders or direct AWS SDK integration, import from `@dyanet/config-aws` directly:
10
+ *
11
+ * ```typescript
12
+ * import { ConfigManager, EnvironmentLoader } from '@dyanet/config-aws';
13
+ * ```
14
+ *
7
15
  * @example
8
16
  * ```tsx
9
17
  * 'use client';
10
18
  *
11
- * import { env } from '@dyanet/nextjs-config-aws/client';
19
+ * import { env } from '@dyanet/nextjs-config-aws';
12
20
  *
13
21
  * function MyComponent() {
14
22
  * const apiUrl = env('API_URL');
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/client/env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAYH;;GAEG;AACH,MAAM,qBAAqB,GAAG,OAAO,CAAC;AAEtC;;;;;GAKG;AACH,SAAS,YAAY,CAAC,eAAuB,qBAAqB;IAChE,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,kDAAkD;QAClD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IACpC,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnE,OAAO,MAAgC,CAAC;IAC1C,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAoCD;;GAEG;AACH,MAAM,UAAU,GAAG,CAAI,GAAW,EAAE,YAAgB;IAClD,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAE1B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AA6BD;;GAEG;AACH,MAAM,UAAU,OAAO,CAAI,YAAoB,EAAE,GAAW,EAAE,YAAgB;IAC5E,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAE1B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,SAAS,CAAC,eAAuB,qBAAqB;IACpE,OAAO,EAAE,GAAG,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC;AAC3C,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,MAAM,CAAC,GAAW,EAAE,eAAuB,qBAAqB;IAC9E,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IAC1C,OAAO,GAAG,IAAI,MAAM,CAAC;AACvB,CAAC;AAED,eAAe,GAAG,CAAC"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/client/env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAYH;;GAEG;AACH,MAAM,qBAAqB,GAAG,OAAO,CAAC;AAEtC;;;;;GAKG;AACH,SAAS,YAAY,CAAC,eAAuB,qBAAqB;IAChE,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,kDAAkD;QAClD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IACpC,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnE,OAAO,MAAgC,CAAC;IAC1C,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAoCD;;GAEG;AACH,MAAM,UAAU,GAAG,CAAI,GAAW,EAAE,YAAgB;IAClD,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAE1B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AA6BD;;GAEG;AACH,MAAM,UAAU,OAAO,CAAI,YAAoB,EAAE,GAAW,EAAE,YAAgB;IAC5E,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAE1B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,SAAS,CAAC,eAAuB,qBAAqB;IACpE,OAAO,EAAE,GAAG,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC;AAC3C,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,MAAM,CAAC,GAAW,EAAE,eAAuB,qBAAqB;IAC9E,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IAC1C,OAAO,GAAG,IAAI,MAAM,CAAC;AACvB,CAAC;AAED,eAAe,GAAG,CAAC"}
@@ -5,6 +5,10 @@
5
5
  * into the client-side JavaScript context, enabling runtime environment variable access
6
6
  * without requiring NEXT_PUBLIC_ prefixes at build time.
7
7
  *
8
+ * @remarks
9
+ * This is part of the simplified Next.js API. For advanced configuration loading
10
+ * with custom loaders or direct AWS SDK integration, import from `@dyanet/config-aws` directly.
11
+ *
8
12
  * @example
9
13
  * ```tsx
10
14
  * // In your root layout.tsx
@@ -1 +1 @@
1
- {"version":3,"file":"public-env-script.js","sourceRoot":"","sources":["../../../src/components/public-env-script.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAkC/B;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAC3B,GAAuC,EACvC,UAAqB,EACrB,YAAqB;IAErB,MAAM,MAAM,GAA2B,EAAE,CAAC;IAE1C,4CAA4C;IAC5C,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YACvB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACtB,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,0CAA0C;IAC1C,IAAI,YAAY,EAAE,CAAC;QACjB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxD,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACtB,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,6DAA6D;IAC7D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CACnC,WAAmC,EACnC,YAAoB;IAEpB,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC/C,OAAO,UAAU,YAAY,IAAI,UAAU,GAAG,CAAC;AACjD,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,UAAU,EACV,YAAY,EACZ,YAAY,GAAG,OAAO,EACtB,KAAK,GACgB;IACrB,4DAA4D;IAC5D,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,GAAyC,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;IAE/G,4CAA4C;IAC5C,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8BAA8B;IAC9B,MAAM,aAAa,GAAG,qBAAqB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAEvE,qBAAqB;IACrB,MAAM,WAAW,GAAkD;QACjE,uBAAuB,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE;KACnD,CAAC;IAEF,2CAA2C;IAC3C,IAAI,KAAK,EAAE,CAAC;QACV,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC;IAC5B,CAAC;IAED,OAAO,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AACpD,CAAC;AAED,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"public-env-script.js","sourceRoot":"","sources":["../../../src/components/public-env-script.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAkC/B;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAC3B,GAAuC,EACvC,UAAqB,EACrB,YAAqB;IAErB,MAAM,MAAM,GAA2B,EAAE,CAAC;IAE1C,4CAA4C;IAC5C,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YACvB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACtB,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,0CAA0C;IAC1C,IAAI,YAAY,EAAE,CAAC;QACjB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxD,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACtB,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,6DAA6D;IAC7D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CACnC,WAAmC,EACnC,YAAoB;IAEpB,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC/C,OAAO,UAAU,YAAY,IAAI,UAAU,GAAG,CAAC;AACjD,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,UAAU,EACV,YAAY,EACZ,YAAY,GAAG,OAAO,EACtB,KAAK,GACgB;IACrB,4DAA4D;IAC5D,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,GAAyC,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;IAE/G,4CAA4C;IAC5C,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8BAA8B;IAC9B,MAAM,aAAa,GAAG,qBAAqB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAEvE,qBAAqB;IACrB,MAAM,WAAW,GAAkD;QACjE,uBAAuB,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE;KACnD,CAAC;IAEF,2CAA2C;IAC3C,IAAI,KAAK,EAAE,CAAC;QACV,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC;IAC5B,CAAC;IAED,OAAO,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AACpD,CAAC;AAED,eAAe,eAAe,CAAC"}
package/dist/esm/index.js CHANGED
@@ -2,14 +2,55 @@
2
2
  * @dyanet/nextjs-config-aws
3
3
  *
4
4
  * Next.js adapter for AWS configuration management.
5
- * Provides server-side configuration loading, React context providers,
6
- * and runtime environment variable support for Next.js applications.
5
+ * Provides a simplified, opinionated API for loading configuration
6
+ * with automatic environment detection and AWS integration.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * // Server-side configuration loading
11
+ * import { getConfig } from '@dyanet/nextjs-config-aws';
12
+ *
13
+ * const config = await getConfig({
14
+ * schema: mySchema,
15
+ * aws: { secretName: '/myapp/config' }
16
+ * });
17
+ * ```
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * // Runtime environment variables for client
22
+ * // In layout.tsx (server component)
23
+ * import { PublicEnvScript } from '@dyanet/nextjs-config-aws';
24
+ *
25
+ * <PublicEnvScript publicVars={['API_URL', 'APP_NAME']} />
26
+ *
27
+ * // In client component
28
+ * import { env } from '@dyanet/nextjs-config-aws';
29
+ *
30
+ * const apiUrl = env('API_URL');
31
+ * ```
32
+ *
33
+ * @remarks
34
+ * For advanced loader access, custom loaders, or direct AWS SDK integration,
35
+ * import from `@dyanet/config-aws` directly:
36
+ *
37
+ * ```typescript
38
+ * import {
39
+ * ConfigManager,
40
+ * EnvironmentLoader,
41
+ * SecretsManagerLoader,
42
+ * SSMParameterStoreLoader,
43
+ * } from '@dyanet/config-aws';
44
+ * ```
45
+ *
46
+ * @packageDocumentation
7
47
  */
8
- export { ConfigurationError, ValidationError, AWSServiceError, ConfigurationLoadError, MissingConfigurationError, EnvironmentLoader, EnvFileLoader, S3Loader, SecretsManagerLoader, SSMParameterStoreLoader, ConfigManager, ConfigValidationUtil, EnvFileParser, } from '@dyanet/config-aws';
9
- // Server-side exports
10
- export { getConfig, clearConfigCache, getConfigCacheSize, invalidateConfig, createConfigProvider, ConfigProvider, useConfig, ConfigContext, } from './server';
11
- // Components for runtime environment variables
12
- export { PublicEnvScript, filterEnvVars, generateScriptContent, } from './components';
48
+ // Error classes for error handling
49
+ export { ConfigurationError, ValidationError } from '@dyanet/config-aws';
50
+ // Server-side configuration loading
51
+ export { getConfig } from './server';
52
+ // Component for runtime environment variables
53
+ export { PublicEnvScript } from './components';
13
54
  // Client-side environment variable access
14
- export { env, envFrom, getAllEnv, hasEnv } from './client';
55
+ export { env } from './client';
15
56
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAoBH,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,yBAAyB,EACzB,iBAAiB,EACjB,aAAa,EACb,QAAQ,EACR,oBAAoB,EACpB,uBAAuB,EACvB,aAAa,EACb,oBAAoB,EACpB,aAAa,GACd,MAAM,oBAAoB,CAAC;AAE5B,sBAAsB;AACtB,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAEhB,oBAAoB,EACpB,cAAc,EACd,SAAS,EACT,aAAa,GACd,MAAM,UAAU,CAAC;AAElB,+CAA+C;AAC/C,OAAO,EACL,eAAe,EACf,aAAa,EACb,qBAAqB,GAEtB,MAAM,cAAc,CAAC;AAEtB,0CAA0C;AAC1C,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAEH,mCAAmC;AACnC,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEzE,oCAAoC;AACpC,OAAO,EAAE,SAAS,EAA0B,MAAM,UAAU,CAAC;AAE7D,8CAA8C;AAC9C,OAAO,EAAE,eAAe,EAA6B,MAAM,cAAc,CAAC;AAE1E,0CAA0C;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC"}
@@ -1,8 +1,35 @@
1
1
  /**
2
2
  * Server-side configuration loading for Next.js applications.
3
3
  * Provides a cached getConfig() function that uses ConfigManager from @dyanet/config-aws.
4
+ *
5
+ * This module provides a simplified, opinionated API that hides loader complexity.
6
+ * For advanced usage such as custom loaders, direct AWS SDK integration, or
7
+ * fine-grained control over configuration loading, import from `@dyanet/config-aws` directly:
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * // Advanced usage with custom loaders
12
+ * import {
13
+ * ConfigManager,
14
+ * EnvironmentLoader,
15
+ * SecretsManagerLoader,
16
+ * SSMParameterStoreLoader,
17
+ * } from '@dyanet/config-aws';
18
+ *
19
+ * const manager = new ConfigManager({
20
+ * loaders: [
21
+ * new EnvironmentLoader({ prefix: 'APP_' }),
22
+ * new SecretsManagerLoader({ secretName: '/my-app/config' }),
23
+ * ],
24
+ * schema: mySchema,
25
+ * });
26
+ * await manager.load();
27
+ * const config = manager.getAll();
28
+ * ```
4
29
  */
5
30
  import { ConfigManager, } from '@dyanet/config-aws';
31
+ import { detectEnvironment } from './internal/environment';
32
+ import { createLoaders } from './internal/loader-factory';
6
33
  /**
7
34
  * Cache storage for configuration
8
35
  * Uses a Map to support multiple cache keys (for different option combinations)
@@ -14,15 +41,16 @@ const configCache = new Map();
14
41
  */
15
42
  let awsApiCallCount = 0;
16
43
  /**
17
- * Generate a cache key from options
44
+ * Generate a cache key from options.
45
+ * The cache key is based on aws options, environment, and forceAwsInDev.
18
46
  * @internal
19
47
  */
20
- function generateCacheKey(options) {
21
- const loaderNames = options.loaders?.map((l) => l.getName()).join(',') ?? '';
22
- const precedence = Array.isArray(options.precedence)
23
- ? options.precedence.map((p) => `${p.loader}:${p.priority}`).join(',')
24
- : options.precedence ?? 'aws-first';
25
- return `${loaderNames}|${precedence}`;
48
+ function generateCacheKey(options, resolvedEnvironment) {
49
+ return JSON.stringify({
50
+ aws: options.aws,
51
+ environment: resolvedEnvironment,
52
+ forceAwsInDev: options.forceAwsInDev ?? false,
53
+ });
26
54
  }
27
55
  /**
28
56
  * Check if a cache entry is still valid
@@ -36,12 +64,18 @@ function isCacheValid(entry) {
36
64
  /**
37
65
  * Load configuration for Next.js server-side use.
38
66
  *
39
- * This function provides caching to avoid repeated AWS API calls during request handling.
40
- * Configuration is cached based on the loader configuration and precedence strategy.
67
+ * This function provides automatic environment detection and caching to avoid
68
+ * repeated AWS API calls during request handling. Configuration is cached based
69
+ * on the AWS options, environment, and forceAwsInDev setting.
70
+ *
71
+ * Environment Behavior:
72
+ * - development: env vars + .env.local/.env files, AWS only if forceAwsInDev
73
+ * - production: env vars + .env file + AWS sources (if configured)
74
+ * - test: env vars only (no file or AWS access)
41
75
  *
42
76
  * @example
43
77
  * ```typescript
44
- * import { getConfig, EnvironmentLoader, SecretsManagerLoader } from '@dyanet/nextjs-config-aws';
78
+ * import { getConfig } from '@dyanet/nextjs-config-aws';
45
79
  * import { z } from 'zod';
46
80
  *
47
81
  * const schema = z.object({
@@ -49,29 +83,34 @@ function isCacheValid(entry) {
49
83
  * API_KEY: z.string(),
50
84
  * });
51
85
  *
52
- * // In a Server Component or API route
53
- * export default async function Page() {
54
- * const config = await getConfig({
55
- * schema,
56
- * loaders: [
57
- * new EnvironmentLoader(),
58
- * new SecretsManagerLoader({ secretName: '/my-app/config' }),
59
- * ],
60
- * precedence: 'aws-first',
61
- * });
86
+ * // Minimal usage - auto-detects environment
87
+ * const config = await getConfig({ schema });
62
88
  *
63
- * return <div>DB: {config.DATABASE_URL}</div>;
64
- * }
89
+ * // With AWS Secrets Manager (loaded in production)
90
+ * const config = await getConfig({
91
+ * schema,
92
+ * aws: { secretName: '/my-app/config', region: 'us-east-1' }
93
+ * });
94
+ *
95
+ * // Force AWS in development for testing
96
+ * const config = await getConfig({
97
+ * schema,
98
+ * aws: { secretName: '/my-app/config' },
99
+ * forceAwsInDev: true
100
+ * });
65
101
  * ```
66
102
  *
67
103
  * @param options Configuration options
68
104
  * @returns Promise resolving to the validated configuration object
105
+ * @throws {ValidationError} When schema validation fails (includes invalid key names)
69
106
  */
70
107
  export async function getConfig(options = {}) {
71
- const { schema, loaders = [], precedence = 'aws-first', cache = true, cacheTTL = 60000, // 1 minute default
108
+ const { schema, aws, environment: explicitEnvironment, forceAwsInDev = false, cache = true, cacheTTL = 60000, // 1 minute default
72
109
  enableLogging = false, } = options;
73
- // Generate cache key
74
- const cacheKey = generateCacheKey(options);
110
+ // Determine environment: explicit option takes precedence over auto-detection
111
+ const resolvedEnvironment = explicitEnvironment ?? detectEnvironment();
112
+ // Generate cache key based on aws options, environment, and forceAwsInDev
113
+ const cacheKey = generateCacheKey(options, resolvedEnvironment);
75
114
  // Check cache if enabled
76
115
  if (cache) {
77
116
  const cached = configCache.get(cacheKey);
@@ -81,11 +120,17 @@ export async function getConfig(options = {}) {
81
120
  }
82
121
  // Increment API call counter (for testing)
83
122
  awsApiCallCount++;
84
- // Create ConfigManager with provided options
123
+ // Create loaders using the internal factory
124
+ const loaders = createLoaders({
125
+ environment: resolvedEnvironment,
126
+ aws,
127
+ forceAwsInDev,
128
+ });
129
+ // Create ConfigManager with generated loaders
85
130
  const managerOptions = {
86
131
  loaders,
87
132
  schema,
88
- precedence,
133
+ precedence: 'aws-first',
89
134
  validateOnLoad: true,
90
135
  enableLogging,
91
136
  };
@@ -139,7 +184,8 @@ export function resetAwsApiCallCount() {
139
184
  * @param options The options used to create the cache entry
140
185
  */
141
186
  export function invalidateConfig(options) {
142
- const cacheKey = generateCacheKey(options);
187
+ const resolvedEnvironment = options.environment ?? detectEnvironment();
188
+ const cacheKey = generateCacheKey(options, resolvedEnvironment);
143
189
  configCache.delete(cacheKey);
144
190
  }
145
191
  //# sourceMappingURL=get-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-config.js","sourceRoot":"","sources":["../../../src/server/get-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,aAAa,GAKd,MAAM,oBAAoB,CAAC;AA6B5B;;;GAGG;AACH,MAAM,WAAW,GAAG,IAAI,GAAG,EAA+B,CAAC;AAE3D;;;GAGG;AACH,IAAI,eAAe,GAAG,CAAC,CAAC;AAExB;;;GAGG;AACH,SAAS,gBAAgB,CAAI,OAA6B;IACxD,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IAC7E,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;QAClD,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QACtE,CAAC,CAAC,OAAO,CAAC,UAAU,IAAI,WAAW,CAAC;IACtC,OAAO,GAAG,WAAW,IAAI,UAAU,EAAE,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAI,KAAgC;IACvD,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;AACtC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,UAAgC,EAAE;IAElC,MAAM,EACJ,MAAM,EACN,OAAO,GAAG,EAAE,EACZ,UAAU,GAAG,WAAW,EACxB,KAAK,GAAG,IAAI,EACZ,QAAQ,GAAG,KAAK,EAAE,mBAAmB;IACrC,aAAa,GAAG,KAAK,GACtB,GAAG,OAAO,CAAC;IAEZ,qBAAqB;IACrB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE3C,yBAAyB;IACzB,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAA8B,CAAC;QACtE,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC,MAAM,CAAC;QACvB,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,eAAe,EAAE,CAAC;IAElB,6CAA6C;IAC7C,MAAM,cAAc,GAA4B;QAC9C,OAAO;QACP,MAAM;QACN,UAAU;QACV,cAAc,EAAE,IAAI;QACpB,aAAa;KACd,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,aAAa,CAAI,cAAc,CAAC,CAAC;IACrD,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IAErB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAChC,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAE3C,4BAA4B;IAC5B,IAAI,KAAK,IAAI,UAAU,EAAE,CAAC;QACxB,MAAM,KAAK,GAAkB;YAC3B,MAAM;YACN,UAAU;YACV,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ;SACjC,CAAC;QACF,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,KAA4B,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,WAAW,CAAC,KAAK,EAAE,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,WAAW,CAAC,IAAI,CAAC;AAC1B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB;IAClC,eAAe,GAAG,CAAC,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAI,OAA6B;IAC/D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC3C,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC/B,CAAC"}
1
+ {"version":3,"file":"get-config.js","sourceRoot":"","sources":["../../../src/server/get-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Environment detection utilities for Next.js configuration.
3
+ * @internal
4
+ */
5
+ /**
6
+ * Detect the current environment mode based on NODE_ENV.
7
+ *
8
+ * @returns The detected environment mode:
9
+ * - 'production' if NODE_ENV is 'production'
10
+ * - 'test' if NODE_ENV is 'test'
11
+ * - 'development' for all other cases (including undefined)
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * // NODE_ENV=production
16
+ * detectEnvironment(); // 'production'
17
+ *
18
+ * // NODE_ENV=test
19
+ * detectEnvironment(); // 'test'
20
+ *
21
+ * // NODE_ENV=development or undefined
22
+ * detectEnvironment(); // 'development'
23
+ * ```
24
+ */
25
+ export function detectEnvironment() {
26
+ const nodeEnv = process.env['NODE_ENV'];
27
+ if (nodeEnv === 'production') {
28
+ return 'production';
29
+ }
30
+ if (nodeEnv === 'test') {
31
+ return 'test';
32
+ }
33
+ return 'development';
34
+ }
35
+ //# sourceMappingURL=environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../../../src/server/internal/environment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAExC,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC7B,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC"}