@efebia/one-env 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 (52) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +296 -0
  3. package/bin/one-env +2 -0
  4. package/lib/cli/commands/generate.d.ts +11 -0
  5. package/lib/cli/commands/generate.d.ts.map +1 -0
  6. package/lib/cli/commands/generate.js +57 -0
  7. package/lib/cli/commands/generate.js.map +1 -0
  8. package/lib/cli/commands/validate-aws.d.ts +11 -0
  9. package/lib/cli/commands/validate-aws.d.ts.map +1 -0
  10. package/lib/cli/commands/validate-aws.js +64 -0
  11. package/lib/cli/commands/validate-aws.js.map +1 -0
  12. package/lib/cli/commands/validate.d.ts +7 -0
  13. package/lib/cli/commands/validate.d.ts.map +1 -0
  14. package/lib/cli/commands/validate.js +60 -0
  15. package/lib/cli/commands/validate.js.map +1 -0
  16. package/lib/cli/env-tool.d.ts +11 -0
  17. package/lib/cli/env-tool.d.ts.map +1 -0
  18. package/lib/cli/env-tool.js +60 -0
  19. package/lib/cli/env-tool.js.map +1 -0
  20. package/lib/cli/types.d.ts +70 -0
  21. package/lib/cli/types.d.ts.map +1 -0
  22. package/lib/cli/types.js +5 -0
  23. package/lib/cli/types.js.map +1 -0
  24. package/lib/cli/utils/aws.d.ts +20 -0
  25. package/lib/cli/utils/aws.d.ts.map +1 -0
  26. package/lib/cli/utils/aws.js +50 -0
  27. package/lib/cli/utils/aws.js.map +1 -0
  28. package/lib/cli/utils/file.d.ts +35 -0
  29. package/lib/cli/utils/file.d.ts.map +1 -0
  30. package/lib/cli/utils/file.js +72 -0
  31. package/lib/cli/utils/file.js.map +1 -0
  32. package/lib/cli/utils/formatting.d.ts +50 -0
  33. package/lib/cli/utils/formatting.d.ts.map +1 -0
  34. package/lib/cli/utils/formatting.js +136 -0
  35. package/lib/cli/utils/formatting.js.map +1 -0
  36. package/lib/cli/utils/schema-loader.d.ts +40 -0
  37. package/lib/cli/utils/schema-loader.d.ts.map +1 -0
  38. package/lib/cli/utils/schema-loader.js +119 -0
  39. package/lib/cli/utils/schema-loader.js.map +1 -0
  40. package/lib/cli/utils/validation.d.ts +40 -0
  41. package/lib/cli/utils/validation.d.ts.map +1 -0
  42. package/lib/cli/utils/validation.js +116 -0
  43. package/lib/cli/utils/validation.js.map +1 -0
  44. package/lib/env-loader.d.ts +97 -0
  45. package/lib/env-loader.d.ts.map +1 -0
  46. package/lib/env-loader.js +199 -0
  47. package/lib/env-loader.js.map +1 -0
  48. package/lib/index.d.ts +2 -0
  49. package/lib/index.d.ts.map +1 -0
  50. package/lib/index.js +3 -0
  51. package/lib/index.js.map +1 -0
  52. package/package.json +55 -0
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Core validation utilities for the environment CLI tool
3
+ */
4
+ import { z } from 'zod/v4';
5
+ import { ValidationResult, ValidationStatistics, FormattedIssue } from '../types.js';
6
+ /**
7
+ * Validates environment data against the schema
8
+ * @param envData - Environment data to validate
9
+ * @param schema - Zod schema to validate against
10
+ * @param source - Source identifier (filename or secret name)
11
+ * @param location - Optional location (e.g., AWS region)
12
+ * @returns Validation result with statistics
13
+ */
14
+ export declare function validateEnvData(envData: any, schema: z.ZodSchema<any>, source: string, location?: string): ValidationResult;
15
+ /**
16
+ * Calculates validation statistics
17
+ * @param envData - Environment data being validated
18
+ * @param schema - Zod schema being used
19
+ * @param validationResult - Result from Zod validation
20
+ * @returns Validation statistics
21
+ */
22
+ export declare function calculateValidationStatistics(envData: any, schema: z.ZodSchema<any>, validationResult: {
23
+ success: boolean;
24
+ error?: z.ZodError;
25
+ }): ValidationStatistics;
26
+ /**
27
+ * Formats Zod validation errors
28
+ * @param zodError - Zod error object
29
+ * @param envData - Original environment data
30
+ * @returns Formatted issues array
31
+ */
32
+ export declare function formatZodError(zodError: z.ZodError, envData: any): FormattedIssue[];
33
+ /**
34
+ * Formats a value for display, with sensitive field masking
35
+ * @param path - Field path
36
+ * @param value - Value to format
37
+ * @returns Formatted string
38
+ */
39
+ export declare function formatValue(value: any): string;
40
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAErF;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC3B,OAAO,EAAE,GAAG,EACZ,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EACxB,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,GAClB,gBAAgB,CAiBlB;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CACzC,OAAO,EAAE,GAAG,EACZ,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EACxB,gBAAgB,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAA;CAAE,GAC3D,oBAAoB,CAmCtB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,GAAG,cAAc,EAAE,CAanF;AAYD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAU9C"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Core validation utilities for the environment CLI tool
3
+ */
4
+ /**
5
+ * Validates environment data against the schema
6
+ * @param envData - Environment data to validate
7
+ * @param schema - Zod schema to validate against
8
+ * @param source - Source identifier (filename or secret name)
9
+ * @param location - Optional location (e.g., AWS region)
10
+ * @returns Validation result with statistics
11
+ */
12
+ export function validateEnvData(envData, schema, source, location) {
13
+ const validationResult = schema.safeParse(envData);
14
+ const statistics = calculateValidationStatistics(envData, schema, validationResult);
15
+ return {
16
+ success: validationResult.success,
17
+ source,
18
+ location,
19
+ validFields: statistics.validFields,
20
+ invalidFields: statistics.invalidFields,
21
+ missingFields: statistics.missingFields,
22
+ allMissingFields: statistics.allMissingFields,
23
+ data: validationResult.success ? validationResult.data : null,
24
+ error: validationResult.success ? undefined : {
25
+ formattedIssues: formatZodError(validationResult.error, envData)
26
+ },
27
+ };
28
+ }
29
+ /**
30
+ * Calculates validation statistics
31
+ * @param envData - Environment data being validated
32
+ * @param schema - Zod schema being used
33
+ * @param validationResult - Result from Zod validation
34
+ * @returns Validation statistics
35
+ */
36
+ export function calculateValidationStatistics(envData, schema, validationResult) {
37
+ const schemaShape = schema.shape;
38
+ const totalFields = Object.keys(schemaShape).length;
39
+ const providedFields = Object.keys(envData || {}).length;
40
+ // Find all missing REQUIRED fields (not provided at all)
41
+ const requiredFields = Object.keys(schemaShape).filter(fieldName => {
42
+ const fieldSchema = schemaShape[fieldName];
43
+ const def = fieldSchema?._def;
44
+ // Check if field is optional, nullable, or has a default value
45
+ const isOptional = def?.typeName === 'ZodOptional' || def?.typeName === 'ZodNullable';
46
+ const hasDefault = def?.defaultValue !== undefined;
47
+ return !(isOptional || hasDefault);
48
+ });
49
+ const providedFieldNames = Object.keys(envData || {});
50
+ const allMissingFields = requiredFields.filter(field => !providedFieldNames.includes(field));
51
+ const missingFields = allMissingFields.length;
52
+ // Count validation errors that are NOT due to missing fields
53
+ const invalidButPresentFields = validationResult.success || !validationResult.error ? 0 :
54
+ validationResult.error.issues.filter((issue) => {
55
+ const fieldName = issue.path[0];
56
+ return fieldName && providedFieldNames.includes(String(fieldName));
57
+ }).length;
58
+ const validFieldsCount = validationResult.success ? totalFields : providedFields - invalidButPresentFields;
59
+ return {
60
+ totalFields,
61
+ providedFields,
62
+ validFields: validFieldsCount,
63
+ invalidFields: invalidButPresentFields,
64
+ missingFields,
65
+ allMissingFields,
66
+ };
67
+ }
68
+ /**
69
+ * Formats Zod validation errors
70
+ * @param zodError - Zod error object
71
+ * @param envData - Original environment data
72
+ * @returns Formatted issues array
73
+ */
74
+ export function formatZodError(zodError, envData) {
75
+ return zodError.issues.map((issue) => {
76
+ const field = issue.path.join('.');
77
+ const actualValue = field && envData ? getNestedValue(envData, field) : undefined;
78
+ return {
79
+ path: field || 'root',
80
+ message: issue.message,
81
+ code: issue.code,
82
+ actualValue: actualValue !== undefined ? formatValue(actualValue) : undefined,
83
+ expectedType: issue.expected,
84
+ };
85
+ });
86
+ }
87
+ /**
88
+ * Gets a nested value from an object using dot notation
89
+ * @param obj - Object to get value from
90
+ * @param path - Dot-separated path
91
+ * @returns Value at path or undefined
92
+ */
93
+ function getNestedValue(obj, path) {
94
+ return path.split('.').reduce((current, key) => current?.[key], obj);
95
+ }
96
+ /**
97
+ * Formats a value for display, with sensitive field masking
98
+ * @param path - Field path
99
+ * @param value - Value to format
100
+ * @returns Formatted string
101
+ */
102
+ export function formatValue(value) {
103
+ // Format different value types
104
+ if (value === null)
105
+ return 'null';
106
+ if (value === undefined)
107
+ return 'undefined';
108
+ if (typeof value === 'string')
109
+ return `"${value}"`;
110
+ if (typeof value === 'number')
111
+ return value.toString();
112
+ if (typeof value === 'boolean')
113
+ return value.toString();
114
+ return String(value);
115
+ }
116
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/cli/utils/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ import { z } from 'zod/v4';
2
+ /**
3
+ * Modern Environment Loader with fluent API and full type safety
4
+ *
5
+ * Usage:
6
+ * ```typescript
7
+ * import { createEnv } from '@root/libs/env';
8
+ * import MySchema from './schema';
9
+ *
10
+ * // Create typed env instance
11
+ * const env = createEnv({ schema: MySchema, file: "env.local.yml" });
12
+ *
13
+ * // OR with JSON from process.env
14
+ * const env = createEnv({ schema: MySchema, env: "envs" });
15
+ *
16
+ * // Use with full type safety and autocomplete
17
+ * const port = env.get("port"); // Typed!
18
+ * const { optional_key } = env.getOptional("optional_key");
19
+ * ```
20
+ */
21
+ export declare class EnvLoader<TSchema extends z.ZodSchema<any>> {
22
+ private envData;
23
+ private schema;
24
+ private validatedEnv;
25
+ private initialized;
26
+ /**
27
+ * Initialize the environment loader
28
+ * @param options Either { schema, file } for YAML or { schema, env } for JSON
29
+ */
30
+ init(options: {
31
+ schema: TSchema;
32
+ file: string;
33
+ } | {
34
+ schema: TSchema;
35
+ env: string;
36
+ }): void;
37
+ /**
38
+ * Load environment data from file or process.env
39
+ */
40
+ private loadEnvironmentData;
41
+ /**
42
+ * Validate environment variables against the schema
43
+ */
44
+ private validateEnvironment;
45
+ /**
46
+ * Get required environment variable(s) with type safety
47
+ */
48
+ get<K extends keyof z.infer<TSchema>>(key: K): z.infer<TSchema>[K];
49
+ get<K extends keyof z.infer<TSchema>>(...keys: K[]): Pick<z.infer<TSchema>, K>;
50
+ /**
51
+ * Get optional environment variable(s) with type safety
52
+ */
53
+ getOptional<K extends keyof z.infer<TSchema>>(key: K): z.infer<TSchema>[K] | undefined;
54
+ getOptional<K extends keyof z.infer<TSchema>>(...keys: K[]): {
55
+ [P in K]: z.infer<TSchema>[P] | undefined;
56
+ };
57
+ /**
58
+ * Get all validated environment variables
59
+ */
60
+ getAll(): z.infer<TSchema>;
61
+ }
62
+ /**
63
+ * Creates a typed environment loader instance
64
+ * @param options Configuration options with schema and file/env source
65
+ * @returns Typed EnvLoader instance with full type safety and autocomplete
66
+ */
67
+ export declare function createEnv<TSchema extends z.ZodSchema<any>>(options: {
68
+ schema: TSchema;
69
+ file: string;
70
+ } | {
71
+ schema: TSchema;
72
+ env: string;
73
+ }): EnvLoader<TSchema>;
74
+ /**
75
+ * Interface for the enhanced env object with init method
76
+ */
77
+ export interface EnvWithInit<TSchema extends z.ZodSchema<any>> {
78
+ init(options: {
79
+ file: string;
80
+ } | {
81
+ env: string;
82
+ }): void;
83
+ get<K extends keyof z.infer<TSchema>>(key: K): z.infer<TSchema>[K];
84
+ get<K extends keyof z.infer<TSchema>>(...keys: K[]): Pick<z.infer<TSchema>, K>;
85
+ getOptional<K extends keyof z.infer<TSchema>>(key: K): z.infer<TSchema>[K] | undefined;
86
+ getOptional<K extends keyof z.infer<TSchema>>(...keys: K[]): Partial<Pick<z.infer<TSchema>, K>>;
87
+ getAll(): z.infer<TSchema>;
88
+ }
89
+ /**
90
+ * Creates an enhanced environment loader with init() method
91
+ * This provides a cleaner API: env.init({ file: './env.yml' }) followed by env.get('key')
92
+ *
93
+ * @param schema The Zod schema for environment validation
94
+ * @returns Enhanced env object with init, get, getOptional, and getAll methods
95
+ */
96
+ export declare function createEnvWithInit<TSchema extends z.ZodSchema<any>>(schema: TSchema): EnvWithInit<TSchema>;
97
+ //# sourceMappingURL=env-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-loader.d.ts","sourceRoot":"","sources":["../src/env-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,199 @@
1
+ import { z } from 'zod/v4';
2
+ import { readFileSync } from 'node:fs';
3
+ import { resolve } from 'node:path';
4
+ import yaml from 'js-yaml';
5
+ /**
6
+ * Modern Environment Loader with fluent API and full type safety
7
+ *
8
+ * Usage:
9
+ * ```typescript
10
+ * import { createEnv } from '@root/libs/env';
11
+ * import MySchema from './schema';
12
+ *
13
+ * // Create typed env instance
14
+ * const env = createEnv({ schema: MySchema, file: "env.local.yml" });
15
+ *
16
+ * // OR with JSON from process.env
17
+ * const env = createEnv({ schema: MySchema, env: "envs" });
18
+ *
19
+ * // Use with full type safety and autocomplete
20
+ * const port = env.get("port"); // Typed!
21
+ * const { optional_key } = env.getOptional("optional_key");
22
+ * ```
23
+ */
24
+ export class EnvLoader {
25
+ envData = {};
26
+ schema = null;
27
+ validatedEnv = null;
28
+ initialized = false;
29
+ /**
30
+ * Initialize the environment loader
31
+ * @param options Either { schema, file } for YAML or { schema, env } for JSON
32
+ */
33
+ init(options) {
34
+ if (this.initialized) {
35
+ // Already initialized, skip re-initialization
36
+ return;
37
+ }
38
+ this.schema = options.schema;
39
+ // Load environment data based on options
40
+ this.loadEnvironmentData(options);
41
+ // Validate immediately
42
+ this.validateEnvironment();
43
+ this.initialized = true;
44
+ }
45
+ /**
46
+ * Load environment data from file or process.env
47
+ */
48
+ loadEnvironmentData(options) {
49
+ if ('file' in options) {
50
+ // For file mode, read YAML directly and parse
51
+ try {
52
+ const envContent = readFileSync(options.file, { encoding: 'utf-8' });
53
+ this.envData = yaml.load(envContent);
54
+ }
55
+ catch (error) {
56
+ const absolutePath = resolve(options.file);
57
+ const errorMessage = [
58
+ 'Failed to read environment file:',
59
+ ` Provided path: '${options.file}'`,
60
+ ` Resolved to: '${absolutePath}'`,
61
+ ` Current directory: '${process.cwd()}'`,
62
+ ` Error: ${error}`
63
+ ].join('\n');
64
+ throw new Error(errorMessage);
65
+ }
66
+ }
67
+ else {
68
+ // For env mode, read from process.env with JSON parsing
69
+ const envVar = process.env[options.env];
70
+ if (envVar) {
71
+ try {
72
+ this.envData = JSON.parse(envVar);
73
+ }
74
+ catch (error) {
75
+ throw new Error(`Failed to parse environment JSON from '${options.env}': ${error}`);
76
+ }
77
+ }
78
+ else {
79
+ throw new Error(`Environment variable '${options.env}' not found`);
80
+ }
81
+ }
82
+ }
83
+ /**
84
+ * Validate environment variables against the schema
85
+ */
86
+ validateEnvironment() {
87
+ if (!this.schema) {
88
+ throw new Error('Environment not initialized. Call env.init() first.');
89
+ }
90
+ try {
91
+ // Validate against schema
92
+ this.validatedEnv = this.schema.parse(this.envData);
93
+ }
94
+ catch (error) {
95
+ if (error instanceof z.ZodError) {
96
+ console.error('Environment validation failed:');
97
+ error.issues.forEach((err) => {
98
+ console.error(` - ${err.path.join('.')}: ${err.message}`);
99
+ });
100
+ throw new Error('Invalid environment configuration. See errors above.');
101
+ }
102
+ throw error;
103
+ }
104
+ }
105
+ get(...keys) {
106
+ if (!this.initialized || !this.validatedEnv) {
107
+ throw new Error('Environment not initialized. Call env.init() first.');
108
+ }
109
+ // Single key case
110
+ if (keys.length === 1) {
111
+ return this.validatedEnv[keys[0]];
112
+ }
113
+ // Multiple keys case - return object
114
+ const result = {};
115
+ for (const key of keys) {
116
+ result[key] = this.validatedEnv[key];
117
+ }
118
+ return result;
119
+ }
120
+ getOptional(...keys) {
121
+ if (!this.initialized || !this.validatedEnv) {
122
+ throw new Error('Environment not initialized. Call env.init() first.');
123
+ }
124
+ // Single key case
125
+ if (keys.length === 1) {
126
+ return this.validatedEnv[keys[0]];
127
+ }
128
+ // Multiple keys case - return object
129
+ const result = {};
130
+ for (const key of keys) {
131
+ result[key] = this.validatedEnv[key];
132
+ }
133
+ return result;
134
+ }
135
+ /**
136
+ * Get all validated environment variables
137
+ */
138
+ getAll() {
139
+ if (!this.validatedEnv) {
140
+ throw new Error('Environment not initialized. Call env.init() first.');
141
+ }
142
+ return this.validatedEnv;
143
+ }
144
+ }
145
+ // Global instance storage for singleton behavior
146
+ let globalInstance = null;
147
+ /**
148
+ * Creates a typed environment loader instance
149
+ * @param options Configuration options with schema and file/env source
150
+ * @returns Typed EnvLoader instance with full type safety and autocomplete
151
+ */
152
+ export function createEnv(options) {
153
+ // Use existing instance if available (singleton pattern)
154
+ if (globalInstance) {
155
+ return globalInstance;
156
+ }
157
+ // Create new instance
158
+ const loader = new EnvLoader();
159
+ loader.init(options);
160
+ // Store as global singleton
161
+ globalInstance = loader;
162
+ return loader;
163
+ }
164
+ /**
165
+ * Creates an enhanced environment loader with init() method
166
+ * This provides a cleaner API: env.init({ file: './env.yml' }) followed by env.get('key')
167
+ *
168
+ * @param schema The Zod schema for environment validation
169
+ * @returns Enhanced env object with init, get, getOptional, and getAll methods
170
+ */
171
+ export function createEnvWithInit(schema) {
172
+ let instance = null;
173
+ return {
174
+ init(options) {
175
+ if (!instance) {
176
+ instance = createEnv({ schema, ...options });
177
+ }
178
+ },
179
+ get(...keys) {
180
+ if (!instance) {
181
+ throw new Error('Environment not initialized. Call env.init() first.');
182
+ }
183
+ return instance.get(...keys);
184
+ },
185
+ getOptional(...keys) {
186
+ if (!instance) {
187
+ throw new Error('Environment not initialized. Call env.init() first.');
188
+ }
189
+ return instance.getOptional(...keys);
190
+ },
191
+ getAll() {
192
+ if (!instance) {
193
+ throw new Error('Environment not initialized. Call env.init() first.');
194
+ }
195
+ return instance.getAll();
196
+ }
197
+ };
198
+ }
199
+ //# sourceMappingURL=env-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-loader.js","sourceRoot":"","sources":["../src/env-loader.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export { createEnv, createEnvWithInit } from './env-loader.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
package/lib/index.js ADDED
@@ -0,0 +1,3 @@
1
+ // Minimal exports - only what users need
2
+ export { createEnv, createEnvWithInit } from './env-loader.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@efebia/one-env",
3
+ "version": "1.0.0",
4
+ "description": "Type-safe environment configuration with validation and CLI tools",
5
+ "keywords": [
6
+ "env",
7
+ "environment",
8
+ "config",
9
+ "validation",
10
+ "zod",
11
+ "cli",
12
+ "typescript"
13
+ ],
14
+ "author": {
15
+ "name": "Calogero Mandracchia",
16
+ "email": "calogero@efebia.com",
17
+ "url": "https://github.com/CalogeroMandracchia"
18
+ },
19
+ "license": "MIT",
20
+ "type": "module",
21
+ "main": "lib/index.js",
22
+ "types": "lib/index.d.ts",
23
+ "bin": "bin/one-env",
24
+ "files": [
25
+ "lib",
26
+ "bin"
27
+ ],
28
+ "scripts": {
29
+ "build": "tsc",
30
+ "prepublishOnly": "yarn build"
31
+ },
32
+ "dependencies": {
33
+ "@aws-sdk/client-secrets-manager": "^3.812.0",
34
+ "chalk": "^5.3.0",
35
+ "commander": "^12.1.0",
36
+ "js-yaml": "^4.1.0"
37
+ },
38
+ "peerDependencies": {
39
+ "zod": "^4.0.5"
40
+ },
41
+ "devDependencies": {
42
+ "@types/js-yaml": "^4.0.9",
43
+ "@types/node": "^20.0.0",
44
+ "typescript": "^5.8.3",
45
+ "zod": "^4.0.5"
46
+ },
47
+ "engines": {
48
+ "node": ">=18.0.0"
49
+ },
50
+ "repository": {
51
+ "type": "git",
52
+ "url": "git+https://github.com/efebia/be-libs.git",
53
+ "directory": "packages/one-env"
54
+ }
55
+ }