@aamini/lib 0.0.7 → 0.0.10

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/dist/env.d.mts CHANGED
@@ -1,7 +1,8 @@
1
- import { z } from "zod";
2
-
3
1
  //#region src/env.d.ts
4
- declare function createEnv<T extends z.ZodTypeAny>(schema: T): z.infer<T>;
2
+ type EnvSchema<T> = {
3
+ parse(input: unknown): T;
4
+ };
5
+ declare function createEnv<T>(schema: EnvSchema<T>): T;
5
6
  //#endregion
6
7
  export { createEnv };
7
8
  //# sourceMappingURL=env.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.mts","names":[],"sources":["../src/env.ts"],"mappings":";;;iBAGgB,SAAA,WAAoB,CAAA,CAAE,UAAA,CAAA,CAAY,MAAA,EAAQ,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAA"}
1
+ {"version":3,"file":"env.d.mts","names":[],"sources":["../src/env.ts"],"mappings":";KAEK,SAAA;EACJ,KAAA,CAAM,KAAA,YAAiB,CAAA;AAAA;AAAA,iBAGR,SAAA,GAAA,CAAa,MAAA,EAAQ,SAAA,CAAU,CAAA,IAAK,CAAA"}
package/dist/env.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import { config } from "dotenv";
2
2
  //#region src/env.ts
3
3
  function createEnv(schema) {
4
- const raw = process.env.RAILWAY_ENVIRONMENT_NAME ?? process.env.NODE_ENV ?? "development";
4
+ const raw = process.env.RAILWAY_ENVIRONMENT_NAME ?? (process.env.NODE_ENV === "production" ? "production" : "development");
5
5
  const environmentName = /(?:^|-)pr-\d+$/.test(raw) ? "staging" : raw;
6
6
  const fileEnvironment = {};
7
7
  config({
@@ -15,8 +15,9 @@ function createEnv(schema) {
15
15
  override: true,
16
16
  processEnv: fileEnvironment
17
17
  });
18
- for (const [key, value] of Object.entries(fileEnvironment)) process.env[key] ??= value;
19
- return schema.parse(process.env);
18
+ const env = { ...fileEnvironment };
19
+ for (const [key, value] of Object.entries(process.env)) if (value !== void 0) env[key] = value;
20
+ return schema.parse(env);
20
21
  }
21
22
  //#endregion
22
23
  export { createEnv };
package/dist/env.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"env.mjs","names":[],"sources":["../src/env.ts"],"sourcesContent":["import { config } from 'dotenv'\nimport { z } from 'zod'\n\nexport function createEnv<T extends z.ZodTypeAny>(schema: T): z.infer<T> {\n\tconst raw =\n\t\tprocess.env.RAILWAY_ENVIRONMENT_NAME ??\n\t\tprocess.env.NODE_ENV ??\n\t\t'development'\n\tconst environmentName = /(?:^|-)pr-\\d+$/.test(raw) ? 'staging' : raw\n\tconst fileEnvironment: NodeJS.ProcessEnv = {}\n\n\tconfig({\n\t\tpath: [\n\t\t\t'.env',\n\t\t\t'.env.local',\n\t\t\t`.env.${environmentName}`,\n\t\t\t`.env.${environmentName}.local`,\n\t\t],\n\t\tquiet: true,\n\t\toverride: true,\n\t\tprocessEnv: fileEnvironment,\n\t})\n\n\tfor (const [key, value] of Object.entries(fileEnvironment)) {\n\t\tprocess.env[key] ??= value\n\t}\n\n\treturn schema.parse(process.env)\n}\n"],"mappings":";;AAGA,SAAgB,UAAkC,QAAuB;CACxE,MAAM,MACL,QAAQ,IAAI,4BACZ,QAAQ,IAAI,YACZ;CACD,MAAM,kBAAkB,iBAAiB,KAAK,IAAI,GAAG,YAAY;CACjE,MAAM,kBAAqC,EAAE;CAE7C,OAAO;EACN,MAAM;GACL;GACA;GACA,QAAQ;GACR,QAAQ,gBAAgB;GACxB;EACD,OAAO;EACP,UAAU;EACV,YAAY;EACZ,CAAC;CAEF,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,gBAAgB,EACzD,QAAQ,IAAI,SAAS;CAGtB,OAAO,OAAO,MAAM,QAAQ,IAAI"}
1
+ {"version":3,"file":"env.mjs","names":[],"sources":["../src/env.ts"],"sourcesContent":["import { config } from 'dotenv'\n\ntype EnvSchema<T> = {\n\tparse(input: unknown): T\n}\n\nexport function createEnv<T>(schema: EnvSchema<T>): T {\n\tconst raw =\n\t\tprocess.env.RAILWAY_ENVIRONMENT_NAME ??\n\t\t(process.env.NODE_ENV === 'production' ? 'production' : 'development')\n\tconst environmentName = /(?:^|-)pr-\\d+$/.test(raw) ? 'staging' : raw\n\tconst fileEnvironment: NodeJS.ProcessEnv = {}\n\n\tconfig({\n\t\tpath: [\n\t\t\t'.env',\n\t\t\t'.env.local',\n\t\t\t`.env.${environmentName}`,\n\t\t\t`.env.${environmentName}.local`,\n\t\t],\n\t\tquiet: true,\n\t\toverride: true,\n\t\tprocessEnv: fileEnvironment,\n\t})\n\n\tconst env: NodeJS.ProcessEnv = { ...fileEnvironment }\n\n\tfor (const [key, value] of Object.entries(process.env)) {\n\t\tif (value !== undefined) env[key] = value\n\t}\n\n\treturn schema.parse(env)\n}\n"],"mappings":";;AAMA,SAAgB,UAAa,QAAyB;CACrD,MAAM,MACL,QAAQ,IAAI,6BACX,QAAQ,IAAI,aAAa,eAAe,eAAe;CACzD,MAAM,kBAAkB,iBAAiB,KAAK,IAAI,GAAG,YAAY;CACjE,MAAM,kBAAqC,EAAE;CAE7C,OAAO;EACN,MAAM;GACL;GACA;GACA,QAAQ;GACR,QAAQ,gBAAgB;GACxB;EACD,OAAO;EACP,UAAU;EACV,YAAY;EACZ,CAAC;CAEF,MAAM,MAAyB,EAAE,GAAG,iBAAiB;CAErD,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,IAAI,EACrD,IAAI,UAAU,KAAA,GAAW,IAAI,OAAO;CAGrC,OAAO,OAAO,MAAM,IAAI"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aamini/lib",
3
- "version": "0.0.7",
3
+ "version": "0.0.10",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "repository": {
@@ -30,7 +30,9 @@
30
30
  },
31
31
  "scripts": {
32
32
  "build": "vp pack",
33
+ "bump": "npm version patch --no-git-tag-version",
33
34
  "pack": "vp pack",
35
+ "prepare": "vp pack",
34
36
  "prepublishOnly": "vp pack",
35
37
  "check": "vp check"
36
38
  },
@@ -40,6 +42,7 @@
40
42
  },
41
43
  "devDependencies": {
42
44
  "@aamini/config": "workspace:*",
45
+ "vitest": "catalog:",
43
46
  "typescript": "6.0.2"
44
47
  }
45
48
  }
@@ -0,0 +1,43 @@
1
+ import { mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
2
+ import { tmpdir } from 'node:os'
3
+ import { join } from 'node:path'
4
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest'
5
+ import { z } from 'zod'
6
+ import { createEnv } from './env.js'
7
+
8
+ describe.sequential('createEnv', () => {
9
+ const cwd = process.cwd()
10
+ const originalDatabaseUrl = process.env.DATABASE_URL
11
+ const originalRailwayEnvironmentName = process.env.RAILWAY_ENVIRONMENT_NAME
12
+ let tempDir = ''
13
+
14
+ beforeEach(() => {
15
+ tempDir = mkdtempSync(join(tmpdir(), 'aamini-lib-env-'))
16
+ process.chdir(tempDir)
17
+ writeFileSync(join(tempDir, '.env'), 'DATABASE_URL=postgres://from-file\n')
18
+ process.env.RAILWAY_ENVIRONMENT_NAME = 'production'
19
+ process.env.DATABASE_URL = 'postgres://from-railway'
20
+ })
21
+
22
+ afterEach(() => {
23
+ process.chdir(cwd)
24
+ if (originalDatabaseUrl === undefined) delete process.env.DATABASE_URL
25
+ else process.env.DATABASE_URL = originalDatabaseUrl
26
+ if (originalRailwayEnvironmentName === undefined)
27
+ delete process.env.RAILWAY_ENVIRONMENT_NAME
28
+ else process.env.RAILWAY_ENVIRONMENT_NAME = originalRailwayEnvironmentName
29
+ if (tempDir) rmSync(tempDir, { recursive: true, force: true })
30
+ })
31
+
32
+ it('keeps injected env values ahead of dotenv files', () => {
33
+ const env = createEnv(
34
+ z.object({
35
+ DATABASE_URL: z.string(),
36
+ }),
37
+ )
38
+
39
+ expect(env.DATABASE_URL).toBe('postgres://from-railway')
40
+ expect(process.env.DATABASE_URL).toBe('postgres://from-railway')
41
+ expect(readFileSync(join(tempDir, '.env'), 'utf8')).toContain('from-file')
42
+ })
43
+ })
package/src/env.ts CHANGED
@@ -1,11 +1,13 @@
1
1
  import { config } from 'dotenv'
2
- import { z } from 'zod'
3
2
 
4
- export function createEnv<T extends z.ZodTypeAny>(schema: T): z.infer<T> {
3
+ type EnvSchema<T> = {
4
+ parse(input: unknown): T
5
+ }
6
+
7
+ export function createEnv<T>(schema: EnvSchema<T>): T {
5
8
  const raw =
6
9
  process.env.RAILWAY_ENVIRONMENT_NAME ??
7
- process.env.NODE_ENV ??
8
- 'development'
10
+ (process.env.NODE_ENV === 'production' ? 'production' : 'development')
9
11
  const environmentName = /(?:^|-)pr-\d+$/.test(raw) ? 'staging' : raw
10
12
  const fileEnvironment: NodeJS.ProcessEnv = {}
11
13
 
@@ -21,9 +23,11 @@ export function createEnv<T extends z.ZodTypeAny>(schema: T): z.infer<T> {
21
23
  processEnv: fileEnvironment,
22
24
  })
23
25
 
24
- for (const [key, value] of Object.entries(fileEnvironment)) {
25
- process.env[key] ??= value
26
+ const env: NodeJS.ProcessEnv = { ...fileEnvironment }
27
+
28
+ for (const [key, value] of Object.entries(process.env)) {
29
+ if (value !== undefined) env[key] = value
26
30
  }
27
31
 
28
- return schema.parse(process.env)
32
+ return schema.parse(env)
29
33
  }