@o/env 0.0.0-bootstrap.0 → 0.16.14

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.
package/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # @o/env
2
+
3
+ Typed environment configuration that remains safe to import from browser code.
4
+
5
+ ```ts
6
+ import { createEnv, expected } from '@o/env'
7
+ ```
@@ -0,0 +1,57 @@
1
+ export declare function ensureEnv(name: string, defaultValue?: string): string;
2
+ /** marker for env vars that must be provided at runtime */
3
+ export declare const expected: unique symbol;
4
+ export type Expected = typeof expected;
5
+ type EnvValue = string | Expected;
6
+ type EnvConfig<TPorts extends Record<string, number>, TBase extends Record<string, EnvValue>, TDev extends Record<string, EnvValue>, TProd extends Record<string, EnvValue>> = {
7
+ /** base port numbers (before PORT_OFFSET) */
8
+ ports: TPorts;
9
+ /** env vars shared across all modes */
10
+ base: TBase;
11
+ /** dev-mode env vars — function form receives computed ports + helpers */
12
+ development: ((ctx: {
13
+ ports: Resolved<TPorts>;
14
+ portOffset: number;
15
+ /** build a postgres connection string using ports.postgres */
16
+ pgUrl: (opts?: {
17
+ database?: string;
18
+ user?: string;
19
+ password?: string;
20
+ }) => string;
21
+ }) => TDev) | TDev;
22
+ /** production env vars */
23
+ production: TProd;
24
+ /** env var → package name, for version resolution by env-update */
25
+ deps?: Record<string, string>;
26
+ /** in dev mode, refresh values sourced from managed .env.development without clobbering explicit overrides */
27
+ freshDev?: boolean;
28
+ };
29
+ type Resolved<T extends Record<string, number>> = {
30
+ [K in keyof T]: number;
31
+ };
32
+ type AllKeys<TBase, TDev, TProd> = (keyof TBase & string) | (keyof TDev & string) | (keyof TProd & string) | 'NODE_ENV';
33
+ type EnvMap<TBase, TDev, TProd> = {
34
+ [K in AllKeys<TBase, TDev, TProd>]: string;
35
+ };
36
+ type EnvResult<TPorts extends Record<string, number>, TBase extends Record<string, EnvValue>, TDev extends Record<string, EnvValue>, TProd extends Record<string, EnvValue>> = {
37
+ env: EnvMap<TBase, TDev, TProd>;
38
+ /** server-only env — throws if accessed on client (typeof window !== 'undefined') */
39
+ server: EnvMap<TBase, TDev, TProd>;
40
+ ports: Resolved<TPorts>;
41
+ portOffset: number;
42
+ /** raw config for tooling (env-update, generate) */
43
+ config: EnvConfig<TPorts, TBase, TDev, TProd>;
44
+ /** base + production merged — the full var registry for CI/docker sync */
45
+ production: Record<string, string | Expected>;
46
+ /** resolved package versions from deps config (e.g. { ZERO_VERSION: '1.2.0' }) */
47
+ versions: Record<string, string>;
48
+ /** set env vars into process.env (skip keys already set) */
49
+ apply: () => void;
50
+ /** write .env.development from current env (no-op if PORT_OFFSET is set) */
51
+ writeDotEnv: () => void;
52
+ /** import.meta.main handler: writes .env.development then runs argv command */
53
+ run: () => Promise<void>;
54
+ };
55
+ export declare function createEnv<TPorts extends Record<string, number>, TBase extends Record<string, EnvValue>, TDev extends Record<string, EnvValue>, TProd extends Record<string, EnvValue>>(config: EnvConfig<TPorts, TBase, TDev, TProd>): EnvResult<TPorts, TBase, TDev, TProd>;
56
+ export {};
57
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,282 @@
1
+ function getFs() {
2
+ const getBuiltinModule = process.getBuiltinModule;
3
+ if (typeof getBuiltinModule !== 'function') {
4
+ return null;
5
+ }
6
+ return getBuiltinModule('node:fs') ?? null;
7
+ }
8
+ // --- ensureEnv (inlined from @o/helpers, zero deps) ---
9
+ export function ensureEnv(name, defaultValue) {
10
+ if (typeof process.env[name] === 'string') {
11
+ return process.env[name] || defaultValue || '';
12
+ }
13
+ if (defaultValue !== undefined) {
14
+ return defaultValue;
15
+ }
16
+ if (process.env.ALLOW_MISSING_ENV) {
17
+ return '';
18
+ }
19
+ if (process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'test') {
20
+ if (typeof defaultValue === 'undefined') {
21
+ console.warn(` - missing env ${name}`);
22
+ }
23
+ return '';
24
+ }
25
+ throw new Error(`Environment variable ${name} not set.`);
26
+ }
27
+ // --- expected sentinel ---
28
+ /** marker for env vars that must be provided at runtime */
29
+ export const expected = Symbol.for('take-out/env/expected');
30
+ // --- createEnv ---
31
+ const validEnvs = { development: true, production: true };
32
+ const managedDotEnvHeader = '# managed by src/env.ts!';
33
+ function readManagedDotEnv(dotEnvPath) {
34
+ const fs = getFs();
35
+ if (!fs || !fs.existsSync(dotEnvPath)) {
36
+ return {};
37
+ }
38
+ const content = fs.readFileSync(dotEnvPath, 'utf-8');
39
+ if (!content.startsWith(`${managedDotEnvHeader}\n`)) {
40
+ return {};
41
+ }
42
+ const values = {};
43
+ for (const line of content.split('\n')) {
44
+ if (!line || line.startsWith('#')) {
45
+ continue;
46
+ }
47
+ const equalsIndex = line.indexOf('=');
48
+ if (equalsIndex <= 0) {
49
+ continue;
50
+ }
51
+ const key = line.slice(0, equalsIndex);
52
+ const rawValue = line.slice(equalsIndex + 1);
53
+ // unquoted values are literal, quoted values just strip quotes
54
+ values[key] =
55
+ rawValue.startsWith('"') && rawValue.endsWith('"')
56
+ ? rawValue.slice(1, -1)
57
+ : rawValue;
58
+ }
59
+ return values;
60
+ }
61
+ export function createEnv(config) {
62
+ const portOffset = Number(process.env.PORT_OFFSET || 0);
63
+ // compute ports with offset
64
+ const resolvedPorts = {};
65
+ for (const [key, base] of Object.entries(config.ports)) {
66
+ resolvedPorts[key] = base + portOffset;
67
+ }
68
+ const ports = resolvedPorts;
69
+ // allow callers (like test/release helpers) to resolve env values for a
70
+ // target mode without inheriting the parent process's NODE_ENV branch.
71
+ const explicitMode = process.env.TAKEOUT_ENV_MODE;
72
+ const rawEnv = explicitMode || process.env.NODE_ENV || 'development';
73
+ const NODE_ENV = (rawEnv === 'test' ? 'development' : rawEnv);
74
+ if (!validEnvs[NODE_ENV]) {
75
+ throw new Error(`invalid NODE_ENV: ${rawEnv}`);
76
+ }
77
+ // postgres connection string helper
78
+ const pgPort = ports.postgres;
79
+ const pgUrl = (opts) => {
80
+ const user = opts?.user || 'user';
81
+ const password = opts?.password || 'password';
82
+ const database = opts?.database || 'postgres';
83
+ const port = pgPort || 5432;
84
+ return `postgresql://${user}:${password}@127.0.0.1:${port}/${database}`;
85
+ };
86
+ // resolve mode-specific env
87
+ const modeConfig = config[NODE_ENV];
88
+ const modeEnv = typeof modeConfig === 'function'
89
+ ? modeConfig({ ports, portOffset, pgUrl })
90
+ : modeConfig;
91
+ const modeKeys = new Set(Object.keys(modeEnv || {}));
92
+ const managedDevEnv = NODE_ENV === 'development' && config.freshDev
93
+ ? readManagedDotEnv('.env.development')
94
+ : {};
95
+ const refreshedKeys = new Set();
96
+ // in dev mode with freshDev, refresh only values that came from our managed
97
+ // .env.development file so computed defaults win over stale inherited values
98
+ // without clobbering explicit overrides from the parent process. resolution
99
+ // treats refreshed keys as unset; process.env itself is never mutated here —
100
+ // only apply() writes to it. deleting from process.env broke the built vite
101
+ // SSR server: apply()'s VITE_ENVIRONMENT guard constant-folds it to a no-op
102
+ // there, so cleared vars (e.g. BETTER_AUTH_SECRET read directly by
103
+ // better-auth) were never restored.
104
+ if (NODE_ENV === 'development' && config.freshDev && modeEnv) {
105
+ for (const key of Object.keys(modeEnv)) {
106
+ const envVal = process.env[key];
107
+ if (envVal !== undefined && managedDevEnv[key] === envVal) {
108
+ refreshedKeys.add(key);
109
+ }
110
+ }
111
+ }
112
+ // merge base + mode, mode wins
113
+ const merged = {
114
+ ...config.base,
115
+ ...modeEnv,
116
+ };
117
+ // resolve expected values and build final env
118
+ const resolvedEnv = { NODE_ENV };
119
+ for (const [key, val] of Object.entries(merged)) {
120
+ if (val === expected) {
121
+ const envVal = refreshedKeys.has(key) ? undefined : process.env[key];
122
+ if (envVal !== undefined && envVal !== '') {
123
+ resolvedEnv[key] = envVal;
124
+ }
125
+ else if (NODE_ENV === 'production' && !process.env.ALLOW_MISSING_ENV) {
126
+ throw new Error(`expected env var ${key} to be set in production`);
127
+ }
128
+ else {
129
+ console.warn(` - expected env ${key} not set`);
130
+ resolvedEnv[key] = '';
131
+ }
132
+ }
133
+ else {
134
+ // prefer process.env over config defaults, except when an explicit mode
135
+ // override is active. In that case, mode-computed keys must resolve from
136
+ // the requested mode rather than inherited parent-process values.
137
+ const envVal = refreshedKeys.has(key) ? undefined : process.env[key];
138
+ resolvedEnv[key] =
139
+ explicitMode && modeKeys.has(key)
140
+ ? val
141
+ : envVal !== undefined && envVal !== ''
142
+ ? envVal
143
+ : val;
144
+ }
145
+ }
146
+ const env = resolvedEnv;
147
+ function apply() {
148
+ // don't overwrite when running inside vite SSR (VITE_ENVIRONMENT is set)
149
+ if (process.env.VITE_ENVIRONMENT)
150
+ return;
151
+ for (const [key, val] of Object.entries(env)) {
152
+ if (explicitMode && modeKeys.has(key)) {
153
+ process.env[key] = val;
154
+ }
155
+ else if (process.env[key] === undefined || refreshedKeys.has(key)) {
156
+ process.env[key] = val;
157
+ }
158
+ }
159
+ }
160
+ function writeDotEnv() {
161
+ const fs = getFs();
162
+ if (!fs) {
163
+ return;
164
+ }
165
+ const dotEnvDevPath = '.env.development';
166
+ const dotEnvDev = Object.entries(env)
167
+ .map(([key, val]) => {
168
+ // bun's dotenv doesn't unescape \", so avoid quoting when possible
169
+ // unquoted values preserve quotes and backslashes correctly
170
+ // must quote if: starts with #, has leading/trailing whitespace, or contains newlines
171
+ const needsQuotes = val.startsWith('#') ||
172
+ val.startsWith(' ') ||
173
+ val.startsWith('\t') ||
174
+ val.endsWith(' ') ||
175
+ val.endsWith('\t') ||
176
+ val.includes('\n');
177
+ if (needsQuotes) {
178
+ // for quoted values, we have no good escape mechanism in bun's dotenv
179
+ // just quote it and hope there are no internal quotes
180
+ return `${key}="${val}"`;
181
+ }
182
+ return `${key}=${val}`;
183
+ })
184
+ .join('\n');
185
+ const content = `${managedDotEnvHeader}\n${dotEnvDev}`;
186
+ if (!fs.existsSync(dotEnvDevPath) ||
187
+ fs.readFileSync(dotEnvDevPath, 'utf-8') !== content) {
188
+ fs.writeFileSync(dotEnvDevPath, content, 'utf8');
189
+ }
190
+ }
191
+ async function run() {
192
+ // prevent RUN from leaking to child processes
193
+ delete process.env.RUN;
194
+ // write .env.development if default offset and dev mode
195
+ if (!process.env.VITE_ENVIRONMENT &&
196
+ !process.env.PORT_OFFSET &&
197
+ NODE_ENV === 'development') {
198
+ writeDotEnv();
199
+ }
200
+ // run command from argv (after --)
201
+ const sep = process.argv.indexOf('--');
202
+ const cmd = sep >= 0 ? process.argv.slice(sep + 1) : process.argv.slice(2);
203
+ if (cmd.length) {
204
+ const proc = Bun.spawn(cmd, {
205
+ env: process.env,
206
+ stdio: ['inherit', 'inherit', 'inherit'],
207
+ });
208
+ process.exitCode = await proc.exited;
209
+ }
210
+ }
211
+ // server-only proxy — throws on client, reads live from process.env
212
+ // reading from process.env at access time prevents build-time inlining
213
+ // and ensures runtime env overrides take effect
214
+ const isClient = () => typeof window !== 'undefined';
215
+ const server = new Proxy(env, {
216
+ get(target, prop, receiver) {
217
+ if (typeof prop === 'string' && isClient()) {
218
+ throw new Error(`server env var ${prop} accessed on client`);
219
+ }
220
+ // prefer live process.env value over pre-resolved value
221
+ if (typeof prop === 'string' && process.env[prop] !== undefined) {
222
+ return process.env[prop];
223
+ }
224
+ return Reflect.get(target, prop, receiver);
225
+ },
226
+ ownKeys(target) {
227
+ if (isClient()) {
228
+ throw new Error('server env vars accessed on client');
229
+ }
230
+ return Reflect.ownKeys(target);
231
+ },
232
+ has(target, prop) {
233
+ if (isClient()) {
234
+ throw new Error('server env vars accessed on client');
235
+ }
236
+ return Reflect.has(target, prop);
237
+ },
238
+ getOwnPropertyDescriptor(target, prop) {
239
+ if (isClient()) {
240
+ throw new Error('server env vars accessed on client');
241
+ }
242
+ return Reflect.getOwnPropertyDescriptor(target, prop);
243
+ },
244
+ });
245
+ // base + production merged — the full var registry
246
+ const production = {
247
+ ...config.base,
248
+ ...config.production,
249
+ };
250
+ // resolve dep versions from package.json
251
+ const versions = {};
252
+ if (config.deps) {
253
+ try {
254
+ const fs = getFs();
255
+ if (fs) {
256
+ const pkg = JSON.parse(fs.readFileSync('package.json', 'utf-8'));
257
+ for (const [key, depName] of Object.entries(config.deps)) {
258
+ const version = pkg.dependencies?.[depName]?.replace(/^[\^~]/, '');
259
+ if (version) {
260
+ versions[key] = version;
261
+ }
262
+ }
263
+ }
264
+ }
265
+ catch { }
266
+ }
267
+ // auto-apply on creation (matches existing behavior where importing env.ts has side effects)
268
+ apply();
269
+ return {
270
+ env,
271
+ server,
272
+ ports,
273
+ portOffset,
274
+ config,
275
+ production,
276
+ versions,
277
+ apply,
278
+ writeDotEnv,
279
+ run,
280
+ };
281
+ }
282
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@o/env",
3
- "version": "0.0.0-bootstrap.0",
4
- "description": "Typed environment configuration for browser-safe application modules and local tooling. (package-name bootstrap only)",
3
+ "version": "0.16.14",
4
+ "description": "Typed environment configuration for browser-safe application modules and local tooling.",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
@@ -10,6 +10,36 @@
10
10
  },
11
11
  "type": "module",
12
12
  "sideEffects": false,
13
+ "main": "dist/index.js",
14
+ "module": "dist/index.js",
15
+ "types": "./dist/index.d.ts",
16
+ "exports": {
17
+ "./package.json": "./package.json",
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "import": "./dist/index.js",
21
+ "default": "./dist/index.js"
22
+ }
23
+ },
24
+ "files": [
25
+ "dist",
26
+ "LICENSE",
27
+ "README.md"
28
+ ],
29
+ "scripts": {
30
+ "build": "rm -rf dist && tsc -p tsconfig.build.json",
31
+ "format": "oxfmt",
32
+ "format:check": "oxfmt --check",
33
+ "lint": "oxlint src",
34
+ "test": "bun test src",
35
+ "typecheck": "tsc --noEmit -p tsconfig.json"
36
+ },
37
+ "devDependencies": {
38
+ "@types/bun": "1.3.14",
39
+ "oxfmt": "0.28.0",
40
+ "oxlint": "1.43.0",
41
+ "typescript": "5.9.3"
42
+ },
13
43
  "publishConfig": {
14
44
  "access": "public"
15
45
  }