n8n/packages/workflow/src/WorkflowDataProxyEnvProvider.ts
Tomi Turtiainen e94cda3837
Some checks are pending
Test Master / install-and-build (push) Waiting to run
Test Master / Unit tests (18.x) (push) Blocked by required conditions
Test Master / Unit tests (20.x) (push) Blocked by required conditions
Test Master / Unit tests (22.4) (push) Blocked by required conditions
Test Master / Lint (push) Blocked by required conditions
Test Master / Notify Slack on failure (push) Blocked by required conditions
Benchmark Docker Image CI / build (push) Waiting to run
feat: Add support for $env in the js task runner (no-changelog) (#11177)
2024-10-09 17:31:45 +03:00

76 lines
1.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { ExpressionError } from './errors/expression.error';
export type EnvProviderState = {
isProcessAvailable: boolean;
isEnvAccessBlocked: boolean;
env: Record<string, string>;
};
/**
* Captures a snapshot of the environment variables and configuration
* that can be used to initialize an environment provider.
*/
export function createEnvProviderState(): EnvProviderState {
const isProcessAvailable = typeof process !== 'undefined';
const isEnvAccessBlocked = isProcessAvailable
? process.env.N8N_BLOCK_ENV_ACCESS_IN_NODE === 'true'
: false;
const env: Record<string, string> =
!isProcessAvailable || isEnvAccessBlocked ? {} : (process.env as Record<string, string>);
return {
isProcessAvailable,
isEnvAccessBlocked,
env,
};
}
/**
* Creates a proxy that provides access to the environment variables
* in the `WorkflowDataProxy`. Use the `createEnvProviderState` to
* create the default state object that is needed for the proxy,
* unless you need something specific.
*
* @example
* createEnvProvider(
* runIndex,
* itemIndex,
* createEnvProviderState(),
* )
*/
export function createEnvProvider(
runIndex: number,
itemIndex: number,
providerState: EnvProviderState,
): Record<string, string> {
return new Proxy(
{},
{
has() {
return true;
},
get(_, name) {
if (name === 'isProxy') return true;
if (!providerState.isProcessAvailable) {
throw new ExpressionError('not accessible via UI, please run node', {
runIndex,
itemIndex,
});
}
if (providerState.isEnvAccessBlocked) {
throw new ExpressionError('access to env vars denied', {
causeDetailed:
'If you need access please contact the administrator to remove the environment variable N8N_BLOCK_ENV_ACCESS_IN_NODE',
runIndex,
itemIndex,
});
}
return providerState.env[name.toString()];
},
},
);
}