Skip to content

Commit 969dcef

Browse files
committed
doc: add environment variables specification
1 parent 40ef9d5 commit 969dcef

File tree

1 file changed

+216
-0
lines changed

1 file changed

+216
-0
lines changed

doc/api/process.md

+216
Original file line numberDiff line numberDiff line change
@@ -2305,6 +2305,222 @@ import { loadEnvFile } from 'node:process';
23052305
loadEnvFile();
23062306
```
23072307
2308+
### Environment variables file parser specification
2309+
2310+
This section describes how the environment variables file parser reads a file
2311+
and sets up the environment variables in Node.js.
2312+
2313+
1. **Basic parsing**:
2314+
2315+
* The parser reads line by line, splitting each line into a key and a value
2316+
at the first `=` sign.
2317+
* Lines without an `=` are ignored.
2318+
2319+
```bash
2320+
BASIC=basic
2321+
WITHOUT_EQUAL
2322+
```
2323+
2324+
```cjs
2325+
const assert = require('node:assert');
2326+
const process = require('node:process');
2327+
assert.strictEqual(process.env.BASIC, 'basic');
2328+
assert.strictEqual(process.env.WITHOUT_EQUAL, undefined);
2329+
```
2330+
2331+
```mjs
2332+
import assert from 'node:assert';
2333+
import process from 'node:process';
2334+
assert.strictEqual(process.env.BASIC, 'basic');
2335+
assert.strictEqual(process.env.WITHOUT_EQUAL, undefined);
2336+
```
2337+
2338+
2. **Comments**:
2339+
2340+
* Lines starting with `#` are treated as comments and ignored.
2341+
* Inline comments (starting with `#` after a value) are ignored, and do not
2342+
affect parsing of the value.
2343+
2344+
```bash
2345+
# COMMENTS=work
2346+
INLINE_COMMENTS=inline comments # work
2347+
```
2348+
2349+
```cjs
2350+
const assert = require('node:assert');
2351+
const process = require('node:process');
2352+
assert.strictEqual(process.env.COMMENTS, undefined);
2353+
assert.strictEqual(process.env.INLINE_COMMENTS, 'inline comments');
2354+
```
2355+
2356+
```mjs
2357+
import assert from 'node:assert';
2358+
import process from 'node:process';
2359+
assert.strictEqual(process.env.COMMENTS, undefined);
2360+
assert.strictEqual(process.env.INLINE_COMMENTS, 'inline comments');
2361+
```
2362+
2363+
3. **Whitespace handling**:
2364+
2365+
* Leading and trailing whitespaces around keys and values are ignored unless
2366+
they are enclosed within quotes.
2367+
2368+
```bash
2369+
SPACED_KEY = parsed
2370+
```
2371+
2372+
```cjs
2373+
const assert = require('node:assert');
2374+
const process = require('node:process');
2375+
assert.strictEqual(process.env.SPACED_KEY, 'parsed');
2376+
```
2377+
2378+
```mjs
2379+
import assert from 'node:assert';
2380+
import process from 'node:process';
2381+
assert.strictEqual(process.env.SPACED_KEY, 'parsed');
2382+
```
2383+
2384+
4. **Empty values**:
2385+
2386+
* Variables with no value assigned (just a key followed by `=`) are set to
2387+
an empty string.
2388+
2389+
```bash
2390+
EMPTY=
2391+
```
2392+
2393+
```cjs
2394+
const assert = require('node:assert');
2395+
const process = require('node:process');
2396+
assert.strictEqual(process.env.EMPTY, '');
2397+
```
2398+
2399+
```mjs
2400+
import assert from 'node:assert';
2401+
import process from 'node:process';
2402+
assert.strictEqual(process.env.EMPTY, '');
2403+
```
2404+
2405+
5. **Quoted values**:
2406+
2407+
* Single (`'`), double (`"`), and backtick (`` ` ``) quotes are recognized.
2408+
The content within the quotes is taken as is, including leading and
2409+
trailing spaces.
2410+
* Quotes within a different quote type are preserved.
2411+
2412+
```bash
2413+
FIRST_NAME=' John '
2414+
MIXED_QUOTES="Say 'Hello!'"
2415+
BACKTICK_IN_QUOTES="Using `backticks` in double quotes"
2416+
```
2417+
2418+
```cjs
2419+
const assert = require('node:assert');
2420+
const process = require('node:process');
2421+
assert.strictEqual(process.env.FIRST_NAME, ' John ');
2422+
assert.strictEqual(process.env.MIXED_QUOTES, "Say 'Hello!'");
2423+
assert.strictEqual(process.env.BACKTICK_IN_QUOTES,
2424+
'Using `backticks` in double quotes');
2425+
```
2426+
2427+
```mjs
2428+
import assert from 'node:assert';
2429+
import process from 'node:process';
2430+
assert.strictEqual(process.env.FIRST_NAME, ' John ');
2431+
assert.strictEqual(process.env.MIXED_QUOTES, "Say 'Hello!'");
2432+
assert.strictEqual(process.env.BACKTICK_IN_QUOTES,
2433+
'Using `backticks` in double quotes');
2434+
```
2435+
2436+
6. **Multiline values**:
2437+
2438+
* Values enclosed in double, single, or backtick quotes that span multiple
2439+
lines are accepted and stored with newline characters.
2440+
2441+
```bash
2442+
MULTI_DOUBLE_QUOTED="double
2443+
quoted"
2444+
2445+
MULTI_SINGLE_QUOTED='single
2446+
quoted'
2447+
2448+
MULTI_BACKTICKED=`this
2449+
"multiline"
2450+
value`
2451+
```
2452+
2453+
```cjs
2454+
const assert = require('node:assert');
2455+
const process = require('node:process');
2456+
assert.strictEqual(process.env.MULTI_DOUBLE_QUOTED, 'double\nquoted');
2457+
assert.strictEqual(process.env.MULTI_SINGLE_QUOTED, 'single\nquoted');
2458+
assert.strictEqual(process.env.MULTI_BACKTICKED,
2459+
'this\n"multiline"\nvalue');
2460+
```
2461+
2462+
```mjs
2463+
import assert from 'node:assert';
2464+
import process from 'node:process';
2465+
assert.strictEqual(process.env.MULTI_DOUBLE_QUOTED, 'double\nquoted');
2466+
assert.strictEqual(process.env.MULTI_SINGLE_QUOTED, 'single\nquoted');
2467+
assert.strictEqual(process.env.MULTI_BACKTICKED,
2468+
'this\n"multiline"\nvalue');
2469+
```
2470+
2471+
7. **Escapes**:
2472+
2473+
* Newlines in double-quoted values are expanded to newline characters.
2474+
* Other escapes (e.g., `\n`) are treated as literal text in single-quoted
2475+
or unquoted values.
2476+
2477+
```bash
2478+
EXPAND_NEWLINES="expand\nnew\nlines"
2479+
DONT_EXPAND_UNQUOTED=dontexpand\nnewlines
2480+
DONT_EXPAND_SQUOTED='dontexpand\nnewlines'
2481+
```
2482+
2483+
```cjs
2484+
const assert = require('node:assert');
2485+
const process = require('node:process');
2486+
assert.strictEqual(process.env.EXPAND_NEWLINES, 'expand\nnew\nlines');
2487+
assert.strictEqual(process.env.DONT_EXPAND_UNQUOTED,
2488+
'dontexpand\\nnewlines');
2489+
assert.strictEqual(process.env.DONT_EXPAND_SQUOTED,
2490+
'dontexpand\\nnewlines');
2491+
```
2492+
2493+
```mjs
2494+
import assert from 'node:assert';
2495+
import process from 'node:process';
2496+
assert.strictEqual(process.env.EXPAND_NEWLINES, 'expand\nnew\nlines');
2497+
assert.strictEqual(process.env.DONT_EXPAND_UNQUOTED,
2498+
'dontexpand\\nnewlines');
2499+
assert.strictEqual(process.env.DONT_EXPAND_SQUOTED,
2500+
'dontexpand\\nnewlines');
2501+
```
2502+
2503+
8. **Export statements**:
2504+
2505+
* Any `export` keyword before a key is ignored, allowing compatibility with
2506+
shell scripts.
2507+
2508+
```bash
2509+
export EXPORT_EXAMPLE = ignore export
2510+
```
2511+
2512+
```cjs
2513+
const assert = require('node:assert');
2514+
const process = require('node:process');
2515+
assert.strictEqual(process.env.EXPORT_EXAMPLE, 'ignore export');
2516+
```
2517+
2518+
```mjs
2519+
import assert from 'node:assert';
2520+
import process from 'node:process';
2521+
assert.strictEqual(process.env.EXPORT_EXAMPLE, 'ignore export');
2522+
```
2523+
23082524
## `process.mainModule`
23092525
23102526
<!-- YAML

0 commit comments

Comments
 (0)