Environment Manager
Flexible and typed environment manager for JavaScript/TypeScript applications, with support for custom environments and state persistence.
🚀 Basic Usage​
import { createEnvironmentManager } from '@codeleap/debug'
// Define your environments
const environments = {
development: 'http://localhost:3000/',
staging: 'https://staging.myapp.com/',
production: 'https://api.myapp.com/',
custom: '', // customizable environment
} as const
// Configure the manager
const envManager = createEnvironmentManager({
environments,
defaultEnvironment: 'development',
customEnvironment: 'custom',
persistKey: 'my-app-environment', // optional
})
// Enable the manager (required before use)
envManager.setEnabled('user')
// Change environment
envManager.setEnvironment('production')
// Get current server URL
const apiUrl = envManager.serverUrl
console.log(apiUrl) // 'https://api.myapp.com/'
📖 API Reference​
Creation​
createEnvironmentManager<T>(config)
​
Creates a new environment manager instance.
Parameters:
config.environments
: Object with environments and their URLsconfig.defaultEnvironment
: Default environment (key from environments object)config.customEnvironment
: Key for the customizable environmentconfig.persistKey
: Key for persistence (optional, default: 'environment-manager')
Returns: EnvironmentManager<T>
Properties​
environments
​
Returns the object with all configured environments.
const envs = envManager.environments
// { development: 'http://localhost:3000/', ... }
editors
​
Constant with available editor types.
envManager.editors.USER // 'user'
envManager.editors.SYSTEM // 'system'
defaultConfig
​
Returns the manager's default configuration.
const config = envManager.defaultConfig
// { environment: 'development', customUrl: '', enabledBy: null }
env
​
Returns the current environment state. If not enabled, returns the default config.
const currentEnv = envManager.env
// { environment: 'production', customUrl: '', enabledBy: 'user' }
isEnabled
​
Checks if the manager is enabled.
if (envManager.isEnabled) {
// manager is active
}
isEnabledBy
​
Returns who enabled the manager ('user', 'system', or null).
const enabledBy = envManager.isEnabledBy // 'user' | 'system' | null
isEnabledByUser
​
Checks if it was enabled by the user.
if (envManager.isEnabledByUser) {
// manually enabled
}
isEnabledBySystem
​
Checks if it was enabled by the system.
if (envManager.isEnabledBySystem) {
// automatically enabled
}
is
​
Object with boolean flags for each environment (with capitalized names).
if (envManager.is.Production) {
console.log('We are in production!')
}
// Check multiple environments
if (envManager.is.Development || envManager.is.Staging) {
console.log('Development environment')
}
serverUrl
​
Returns the server URL based on the current environment.
const url = envManager.serverUrl
// 'https://api.myapp.com/' or custom URL
Methods​
setEnabled(by)
​
Enables or disables the manager.
Parameters:
by
:'user'
|'system'
|false
Returns: boolean
- true if enabled, false if disabled
envManager.setEnabled('user') // enable by user
envManager.setEnabled('system') // enable by system
envManager.setEnabled(false) // disable
setEnvironment(environment)
​
Sets the current environment. Only works if the manager is enabled.
Parameters:
environment
: Key of the configured environment
envManager.setEnvironment('production')
envManager.setEnvironment('staging')
isEnvironment(env)
​
Checks if the current environment matches the specified one.
Parameters:
env
: Environment key
Returns: boolean
if (envManager.isEnvironment('production')) {
console.log('We are in production')
}
setCustomUrl(url)
​
Sets a custom URL. Automatically adds '/' at the end if necessary and validates the URL.
Parameters:
url
: Custom URL (must be valid)
envManager.setCustomUrl('https://my-custom-api.com/')
envManager.setEnvironment('custom')
testUrl(url)
​
Validates if a URL is in the correct format.
Parameters:
url
: URL to validate
Returns: boolean
envManager.testUrl('https://api.example.com/') // true
envManager.testUrl('invalid-url') // false
use()
​
React hook to use the manager in components. Returns reactive state.
Returns:
{
enabled: boolean
enabledByUser: boolean
enabledBySystem: boolean
config: { environment: string, customUrl?: string }
changed: boolean
customUrl: string
setCustomUrl: (url: string) => void
}
function MyComponent() {
const env = envManager.use()
return (
<div>
<p>Environment: {env.config.environment}</p>
<p>Enabled: {env.enabled ? 'Yes' : 'No'}</p>
{env.changed && <p>Configuration has changed!</p>}
</div>
)
}
🎯 Examples​
Complete Example​
import { createEnvironmentManager } from '@codeleap/debug'
const environments = {
development: 'http://localhost:3000/',
staging: 'https://staging.myapp.com/',
production: 'https://api.myapp.com/',
custom: '',
} as const
const env = createEnvironmentManager({
environments,
defaultEnvironment: 'dev',
customEnvironment: 'custom',
persistKey: 'myapp-env',
})
// Enable and configure
env.setEnabled('user')
env.setEnvironment('prod')
// Make request
async function fetchData() {
const response = await fetch(`${env.serverUrl}api/users`)
return response.json()
}
// Check environment
if (env.is.Prod) {
console.log('Production mode active')
enableAnalytics()
}
// Custom URL
if (needsCustomEnvironment) {
env.setCustomUrl('https://custom-server.com/')
env.setEnvironment('custom')
}
React Usage​
import { createEnvironmentManager } from '@codeleap/debug'
const envManager = createEnvironmentManager({...})
function EnvironmentSelector() {
const env = envManager.use()
const handleEnable = () => {
envManager.setEnabled('user')
}
const handleEnvironmentChange = (newEnv: string) => {
envManager.setEnvironment(newEnv)
}
return (
<div>
<button onClick={handleEnable}>
{env.enabled ? 'Disable' : 'Enable'}
</button>
{env.enabled && (
<select
value={env.config.environment}
onChange={(e) => handleEnvironmentChange(e.target.value)}
>
<option value="development">Development</option>
<option value="staging">Staging</option>
<option value="production">Production</option>
<option value="custom">Custom</option>
</select>
)}
{env.config.environment === 'custom' && (
<input
type="text"
value={env.customUrl}
onChange={(e) => env.setCustomUrl(e.target.value)}
placeholder="https://custom-api.com/"
/>
)}
<p>Current URL: {envManager.serverUrl}</p>
</div>
)
}
🔒 URL Validation​
The manager automatically validates URLs using the following pattern:
- Must start with
http://
orhttps://
- Must end with
/
- Accepts domains, localhost, and IPs
- Accepts optional ports
Valid URLs:
https://api.example.com/
http://localhost:3000/
http://192.168.1.1:8080/
https://sub.domain.example.com:443/
Invalid URLs:
http://example.com
(no trailing slash)example.com/
(no protocol)ftp://example.com/
(invalid protocol)
💾 Persistence​
The manager's state is automatically persisted using the key configured in persistKey
. This means that settings are maintained between page reloads.
const env = createEnvironmentManager({
// ...
persistKey: 'my-unique-key', // State saved in this key
})