@aamini/lib 0.0.8 → 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 +4 -3
- package/dist/env.d.mts.map +1 -1
- package/dist/env.mjs +3 -2
- package/dist/env.mjs.map +1 -1
- package/package.json +3 -1
- package/src/env.test.ts +43 -0
- package/src/env.ts +10 -5
package/dist/env.d.mts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
|
|
3
1
|
//#region src/env.d.ts
|
|
4
|
-
|
|
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
|
package/dist/env.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.d.mts","names":[],"sources":["../src/env.ts"],"mappings":"
|
|
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
|
@@ -15,8 +15,9 @@ function createEnv(schema) {
|
|
|
15
15
|
override: true,
|
|
16
16
|
processEnv: fileEnvironment
|
|
17
17
|
});
|
|
18
|
-
|
|
19
|
-
|
|
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'\
|
|
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.
|
|
3
|
+
"version": "0.0.10",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
},
|
|
31
31
|
"scripts": {
|
|
32
32
|
"build": "vp pack",
|
|
33
|
+
"bump": "npm version patch --no-git-tag-version",
|
|
33
34
|
"pack": "vp pack",
|
|
34
35
|
"prepare": "vp pack",
|
|
35
36
|
"prepublishOnly": "vp pack",
|
|
@@ -41,6 +42,7 @@
|
|
|
41
42
|
},
|
|
42
43
|
"devDependencies": {
|
|
43
44
|
"@aamini/config": "workspace:*",
|
|
45
|
+
"vitest": "catalog:",
|
|
44
46
|
"typescript": "6.0.2"
|
|
45
47
|
}
|
|
46
48
|
}
|
package/src/env.test.ts
ADDED
|
@@ -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,7 +1,10 @@
|
|
|
1
1
|
import { config } from 'dotenv'
|
|
2
|
-
import { z } from 'zod'
|
|
3
2
|
|
|
4
|
-
|
|
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
10
|
(process.env.NODE_ENV === 'production' ? 'production' : 'development')
|
|
@@ -20,9 +23,11 @@ export function createEnv<T extends z.ZodTypeAny>(schema: T): z.infer<T> {
|
|
|
20
23
|
processEnv: fileEnvironment,
|
|
21
24
|
})
|
|
22
25
|
|
|
23
|
-
|
|
24
|
-
|
|
26
|
+
const env: NodeJS.ProcessEnv = { ...fileEnvironment }
|
|
27
|
+
|
|
28
|
+
for (const [key, value] of Object.entries(process.env)) {
|
|
29
|
+
if (value !== undefined) env[key] = value
|
|
25
30
|
}
|
|
26
31
|
|
|
27
|
-
return schema.parse(
|
|
32
|
+
return schema.parse(env)
|
|
28
33
|
}
|