@vite-env/core 0.4.0 → 0.5.0

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 CHANGED
@@ -6,8 +6,10 @@ The `env.ts` layer for Vite — define once, validate everywhere, import with ty
6
6
 
7
7
  - Typed virtual modules (`virtual:env/client`, `virtual:env/server`)
8
8
  - Server/client split with build-time leak detection
9
+ - Runtime access protection — warns or errors when `virtual:env/server` is imported from a client environment
9
10
  - Auto-coercion via Zod v4 (`z.stringbool()`, `z.coerce.number()`)
10
11
  - Standard Schema support — use Valibot, ArkType, or any compliant validator
12
+ - Platform presets — pre-built schemas for Vercel, Railway, and Netlify
11
13
  - Auto `.d.ts` generation
12
14
  - Vite 8 / Rolldown native
13
15
 
@@ -61,6 +63,22 @@ env.VITE_DARK_MODE // boolean
61
63
  env.VITE_NODE_ENV // 'development' | 'test' | 'production'
62
64
  ```
63
65
 
66
+ ### Platform presets
67
+
68
+ ```ts
69
+ import { defineEnv } from '@vite-env/core'
70
+ import { vercel } from '@vite-env/core/presets'
71
+ import { z } from 'zod'
72
+
73
+ export default defineEnv({
74
+ presets: [vercel],
75
+ server: { DATABASE_URL: z.url() },
76
+ client: { VITE_API_URL: z.url() },
77
+ })
78
+ ```
79
+
80
+ Available presets: `vercel`, `railway`, `netlify`.
81
+
64
82
  See the [full documentation](https://pyyupsk.github.io/vite-env/) for server/client split details, CLI tools, and more.
65
83
 
66
84
  ## License
package/dist/config.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { n as EnvDefinition } from "./types-1okexcwM.cjs";
1
+ import { n as EnvDefinition } from "./types-Bl3YdPck.cjs";
2
2
 
3
3
  //#region src/config.d.ts
4
4
  declare function loadEnvConfig(configPath: string): Promise<EnvDefinition>;
package/dist/config.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { n as EnvDefinition } from "./types-DuWT_251.mjs";
1
+ import { n as EnvDefinition } from "./types-CUF5RARc.mjs";
2
2
 
3
3
  //#region src/config.d.ts
4
4
  declare function loadEnvConfig(configPath: string): Promise<EnvDefinition>;
package/dist/dts.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as StandardEnvDefinition, n as EnvDefinition } from "./types-1okexcwM.cjs";
1
+ import { n as EnvDefinition, o as StandardEnvDefinition } from "./types-Bl3YdPck.cjs";
2
2
 
3
3
  //#region src/dts.d.ts
4
4
  /**
package/dist/dts.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as StandardEnvDefinition, n as EnvDefinition } from "./types-DuWT_251.mjs";
1
+ import { n as EnvDefinition, o as StandardEnvDefinition } from "./types-CUF5RARc.mjs";
2
2
 
3
3
  //#region src/dts.d.ts
4
4
  /**
package/dist/format.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { o as StandardValidationIssue } from "./types-1okexcwM.cjs";
1
+ import { s as StandardValidationIssue } from "./types-Bl3YdPck.cjs";
2
2
  import { core } from "zod";
3
3
 
4
4
  //#region src/guard.d.ts
package/dist/format.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { o as StandardValidationIssue } from "./types-DuWT_251.mjs";
1
+ import { s as StandardValidationIssue } from "./types-CUF5RARc.mjs";
2
2
  import { core } from "zod";
3
3
 
4
4
  //#region src/guard.d.ts
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as StandardEnvDefinition, i as InferServerEnv, n as EnvDefinition, r as InferClientEnv, t as AnyEnvDefinition } from "./types-1okexcwM.cjs";
1
+ import { a as InferServerEnv, i as InferClientEnv, n as EnvDefinition, o as StandardEnvDefinition, r as EnvPreset, t as AnyEnvDefinition } from "./types-Bl3YdPck.cjs";
2
2
  import { defineEnv } from "./schema.cjs";
3
3
  import { defineStandardEnv } from "./standard.cjs";
4
- export { type AnyEnvDefinition, type EnvDefinition, type InferClientEnv, type InferServerEnv, type StandardEnvDefinition, defineEnv, defineStandardEnv };
4
+ export { type AnyEnvDefinition, type EnvDefinition, type EnvPreset, type InferClientEnv, type InferServerEnv, type StandardEnvDefinition, defineEnv, defineStandardEnv };
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as StandardEnvDefinition, i as InferServerEnv, n as EnvDefinition, r as InferClientEnv, t as AnyEnvDefinition } from "./types-DuWT_251.mjs";
1
+ import { a as InferServerEnv, i as InferClientEnv, n as EnvDefinition, o as StandardEnvDefinition, r as EnvPreset, t as AnyEnvDefinition } from "./types-CUF5RARc.mjs";
2
2
  import { defineEnv } from "./schema.mjs";
3
3
  import { defineStandardEnv } from "./standard.mjs";
4
- export { type AnyEnvDefinition, type EnvDefinition, type InferClientEnv, type InferServerEnv, type StandardEnvDefinition, defineEnv, defineStandardEnv };
4
+ export { type AnyEnvDefinition, type EnvDefinition, type EnvPreset, type InferClientEnv, type InferServerEnv, type StandardEnvDefinition, defineEnv, defineStandardEnv };
package/dist/leak.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { t as AnyEnvDefinition } from "./types-1okexcwM.cjs";
1
+ import { t as AnyEnvDefinition } from "./types-Bl3YdPck.cjs";
2
2
 
3
3
  //#region src/leak.d.ts
4
4
  interface LeakReport {
package/dist/leak.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { t as AnyEnvDefinition } from "./types-DuWT_251.mjs";
1
+ import { t as AnyEnvDefinition } from "./types-CUF5RARc.mjs";
2
2
 
3
3
  //#region src/leak.d.ts
4
4
  interface LeakReport {
@@ -0,0 +1,75 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../dts-BgHTl6hC.cjs");
3
+ let zod = require("zod");
4
+ //#region src/presets/netlify.ts
5
+ const netlify = { server: {
6
+ NETLIFY: zod.z.enum(["true"]),
7
+ BUILD_ID: zod.z.string().min(1),
8
+ CONTEXT: zod.z.enum([
9
+ "production",
10
+ "deploy-preview",
11
+ "branch-deploy",
12
+ "dev"
13
+ ]),
14
+ DEPLOY_ID: zod.z.string().min(1),
15
+ DEPLOY_URL: zod.z.url(),
16
+ DEPLOY_PRIME_URL: zod.z.url(),
17
+ URL: zod.z.url(),
18
+ BRANCH: zod.z.string().min(1),
19
+ COMMIT_REF: zod.z.string().min(1),
20
+ PULL_REQUEST: zod.z.enum(["true"]).optional(),
21
+ REVIEW_ID: zod.z.string().optional(),
22
+ REPOSITORY_URL: zod.z.url().optional(),
23
+ INCOMING_HOOK_TITLE: zod.z.string().optional(),
24
+ INCOMING_HOOK_URL: zod.z.url().optional()
25
+ } };
26
+ //#endregion
27
+ //#region src/presets/railway.ts
28
+ const railway = { server: {
29
+ RAILWAY_ENVIRONMENT_ID: zod.z.string().min(1),
30
+ RAILWAY_ENVIRONMENT_NAME: zod.z.string().min(1),
31
+ RAILWAY_SERVICE_ID: zod.z.string().min(1),
32
+ RAILWAY_SERVICE_NAME: zod.z.string().min(1),
33
+ RAILWAY_PROJECT_ID: zod.z.string().min(1),
34
+ RAILWAY_PROJECT_NAME: zod.z.string().min(1),
35
+ RAILWAY_DEPLOYMENT_ID: zod.z.string().min(1),
36
+ RAILWAY_REPLICA_ID: zod.z.string().optional(),
37
+ RAILWAY_GIT_COMMIT_SHA: zod.z.string().optional(),
38
+ RAILWAY_GIT_BRANCH: zod.z.string().optional(),
39
+ RAILWAY_GIT_REPO_NAME: zod.z.string().optional(),
40
+ RAILWAY_GIT_REPO_OWNER: zod.z.string().optional(),
41
+ RAILWAY_PUBLIC_DOMAIN: zod.z.string().min(1).optional(),
42
+ RAILWAY_PRIVATE_DOMAIN: zod.z.string().min(1).optional(),
43
+ RAILWAY_TCP_PROXY_DOMAIN: zod.z.string().min(1).optional(),
44
+ RAILWAY_TCP_PROXY_PORT: zod.z.coerce.number().int().min(1).max(65535).optional()
45
+ } };
46
+ //#endregion
47
+ //#region src/presets/vercel.ts
48
+ const vercel = { server: {
49
+ VERCEL: zod.z.enum(["1"]),
50
+ VERCEL_ENV: zod.z.enum([
51
+ "production",
52
+ "preview",
53
+ "development"
54
+ ]),
55
+ VERCEL_URL: zod.z.string().min(1),
56
+ VERCEL_BRANCH_URL: zod.z.string().min(1).optional(),
57
+ VERCEL_PROJECT_PRODUCTION_URL: zod.z.string().min(1),
58
+ VERCEL_DEPLOYMENT_ID: zod.z.string().min(1),
59
+ VERCEL_REGION: zod.z.string().optional(),
60
+ VERCEL_GIT_PROVIDER: zod.z.string().optional(),
61
+ VERCEL_GIT_REPO_SLUG: zod.z.string().optional(),
62
+ VERCEL_GIT_REPO_OWNER: zod.z.string().optional(),
63
+ VERCEL_GIT_COMMIT_REF: zod.z.string().optional(),
64
+ VERCEL_GIT_COMMIT_SHA: zod.z.string().optional(),
65
+ VERCEL_GIT_COMMIT_MESSAGE: zod.z.string().optional(),
66
+ VERCEL_GIT_COMMIT_AUTHOR_LOGIN: zod.z.string().optional(),
67
+ VERCEL_GIT_PULL_REQUEST_ID: zod.z.string().optional(),
68
+ VERCEL_SKEW_PROTECTION_ENABLED: zod.z.enum(["1"]).optional()
69
+ } };
70
+ //#endregion
71
+ exports.netlify = netlify;
72
+ exports.railway = railway;
73
+ exports.vercel = vercel;
74
+
75
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["z","z","z"],"sources":["../../src/presets/netlify.ts","../../src/presets/railway.ts","../../src/presets/vercel.ts"],"sourcesContent":["import type { EnvPreset } from '../types'\nimport { z } from 'zod'\n\nexport const netlify = {\n server: {\n // Set to 'true' by Netlify to indicate a Netlify build (note: Vercel uses '1', not 'true')\n NETLIFY: z.enum(['true']),\n BUILD_ID: z.string().min(1),\n CONTEXT: z.enum(['production', 'deploy-preview', 'branch-deploy', 'dev']),\n DEPLOY_ID: z.string().min(1),\n // Full https:// URLs — z.url() is correct here unlike VERCEL_URL\n DEPLOY_URL: z.url(),\n DEPLOY_PRIME_URL: z.url(),\n URL: z.url(),\n BRANCH: z.string().min(1),\n COMMIT_REF: z.string().min(1),\n // Netlify sets this to 'true' on PR deploys; absent (not 'false') on non-PR builds\n PULL_REQUEST: z.enum(['true']).optional(),\n REVIEW_ID: z.string().optional(),\n REPOSITORY_URL: z.url().optional(),\n INCOMING_HOOK_TITLE: z.string().optional(),\n INCOMING_HOOK_URL: z.url().optional(),\n },\n} satisfies EnvPreset\n","import type { EnvPreset } from '../types'\nimport { z } from 'zod'\n\nexport const railway = {\n server: {\n RAILWAY_ENVIRONMENT_ID: z.string().min(1),\n RAILWAY_ENVIRONMENT_NAME: z.string().min(1),\n RAILWAY_SERVICE_ID: z.string().min(1),\n RAILWAY_SERVICE_NAME: z.string().min(1),\n RAILWAY_PROJECT_ID: z.string().min(1),\n RAILWAY_PROJECT_NAME: z.string().min(1),\n RAILWAY_DEPLOYMENT_ID: z.string().min(1),\n RAILWAY_REPLICA_ID: z.string().optional(),\n RAILWAY_GIT_COMMIT_SHA: z.string().optional(),\n RAILWAY_GIT_BRANCH: z.string().optional(),\n RAILWAY_GIT_REPO_NAME: z.string().optional(),\n RAILWAY_GIT_REPO_OWNER: z.string().optional(),\n RAILWAY_PUBLIC_DOMAIN: z.string().min(1).optional(),\n RAILWAY_PRIVATE_DOMAIN: z.string().min(1).optional(),\n RAILWAY_TCP_PROXY_DOMAIN: z.string().min(1).optional(),\n RAILWAY_TCP_PROXY_PORT: z.coerce.number().int().min(1).max(65535).optional(),\n // PORT excluded: generic name set by many tools independently; handle it in your own server config\n },\n} satisfies EnvPreset\n","import type { EnvPreset } from '../types'\nimport { z } from 'zod'\n\nexport const vercel = {\n server: {\n // Set to '1' by Vercel to indicate a Vercel environment\n VERCEL: z.enum(['1']),\n VERCEL_ENV: z.enum(['production', 'preview', 'development']),\n // Bare hostname (e.g. myapp-abc123.vercel.app) — no scheme, z.url() would reject it\n VERCEL_URL: z.string().min(1),\n VERCEL_BRANCH_URL: z.string().min(1).optional(),\n VERCEL_PROJECT_PRODUCTION_URL: z.string().min(1),\n VERCEL_DEPLOYMENT_ID: z.string().min(1),\n VERCEL_REGION: z.string().optional(),\n // z.string() not enum — Vercel may add providers (Azure DevOps, self-hosted GitLab) without notice\n VERCEL_GIT_PROVIDER: z.string().optional(),\n VERCEL_GIT_REPO_SLUG: z.string().optional(),\n VERCEL_GIT_REPO_OWNER: z.string().optional(),\n VERCEL_GIT_COMMIT_REF: z.string().optional(),\n VERCEL_GIT_COMMIT_SHA: z.string().optional(),\n VERCEL_GIT_COMMIT_MESSAGE: z.string().optional(),\n VERCEL_GIT_COMMIT_AUTHOR_LOGIN: z.string().optional(),\n VERCEL_GIT_PULL_REQUEST_ID: z.string().optional(),\n VERCEL_SKEW_PROTECTION_ENABLED: z.enum(['1']).optional(),\n },\n} satisfies EnvPreset\n"],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ import { z } from "zod";
2
+
3
+ //#region src/presets/netlify.d.ts
4
+ declare const netlify: {
5
+ server: {
6
+ NETLIFY: z.ZodEnum<{
7
+ true: "true";
8
+ }>;
9
+ BUILD_ID: z.ZodString;
10
+ CONTEXT: z.ZodEnum<{
11
+ production: "production";
12
+ "deploy-preview": "deploy-preview";
13
+ "branch-deploy": "branch-deploy";
14
+ dev: "dev";
15
+ }>;
16
+ DEPLOY_ID: z.ZodString;
17
+ DEPLOY_URL: z.ZodURL;
18
+ DEPLOY_PRIME_URL: z.ZodURL;
19
+ URL: z.ZodURL;
20
+ BRANCH: z.ZodString;
21
+ COMMIT_REF: z.ZodString;
22
+ PULL_REQUEST: z.ZodOptional<z.ZodEnum<{
23
+ true: "true";
24
+ }>>;
25
+ REVIEW_ID: z.ZodOptional<z.ZodString>;
26
+ REPOSITORY_URL: z.ZodOptional<z.ZodURL>;
27
+ INCOMING_HOOK_TITLE: z.ZodOptional<z.ZodString>;
28
+ INCOMING_HOOK_URL: z.ZodOptional<z.ZodURL>;
29
+ };
30
+ };
31
+ //#endregion
32
+ //#region src/presets/railway.d.ts
33
+ declare const railway: {
34
+ server: {
35
+ RAILWAY_ENVIRONMENT_ID: z.ZodString;
36
+ RAILWAY_ENVIRONMENT_NAME: z.ZodString;
37
+ RAILWAY_SERVICE_ID: z.ZodString;
38
+ RAILWAY_SERVICE_NAME: z.ZodString;
39
+ RAILWAY_PROJECT_ID: z.ZodString;
40
+ RAILWAY_PROJECT_NAME: z.ZodString;
41
+ RAILWAY_DEPLOYMENT_ID: z.ZodString;
42
+ RAILWAY_REPLICA_ID: z.ZodOptional<z.ZodString>;
43
+ RAILWAY_GIT_COMMIT_SHA: z.ZodOptional<z.ZodString>;
44
+ RAILWAY_GIT_BRANCH: z.ZodOptional<z.ZodString>;
45
+ RAILWAY_GIT_REPO_NAME: z.ZodOptional<z.ZodString>;
46
+ RAILWAY_GIT_REPO_OWNER: z.ZodOptional<z.ZodString>;
47
+ RAILWAY_PUBLIC_DOMAIN: z.ZodOptional<z.ZodString>;
48
+ RAILWAY_PRIVATE_DOMAIN: z.ZodOptional<z.ZodString>;
49
+ RAILWAY_TCP_PROXY_DOMAIN: z.ZodOptional<z.ZodString>;
50
+ RAILWAY_TCP_PROXY_PORT: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
51
+ };
52
+ };
53
+ //#endregion
54
+ //#region src/presets/vercel.d.ts
55
+ declare const vercel: {
56
+ server: {
57
+ VERCEL: z.ZodEnum<{
58
+ 1: "1";
59
+ }>;
60
+ VERCEL_ENV: z.ZodEnum<{
61
+ production: "production";
62
+ preview: "preview";
63
+ development: "development";
64
+ }>;
65
+ VERCEL_URL: z.ZodString;
66
+ VERCEL_BRANCH_URL: z.ZodOptional<z.ZodString>;
67
+ VERCEL_PROJECT_PRODUCTION_URL: z.ZodString;
68
+ VERCEL_DEPLOYMENT_ID: z.ZodString;
69
+ VERCEL_REGION: z.ZodOptional<z.ZodString>;
70
+ VERCEL_GIT_PROVIDER: z.ZodOptional<z.ZodString>;
71
+ VERCEL_GIT_REPO_SLUG: z.ZodOptional<z.ZodString>;
72
+ VERCEL_GIT_REPO_OWNER: z.ZodOptional<z.ZodString>;
73
+ VERCEL_GIT_COMMIT_REF: z.ZodOptional<z.ZodString>;
74
+ VERCEL_GIT_COMMIT_SHA: z.ZodOptional<z.ZodString>;
75
+ VERCEL_GIT_COMMIT_MESSAGE: z.ZodOptional<z.ZodString>;
76
+ VERCEL_GIT_COMMIT_AUTHOR_LOGIN: z.ZodOptional<z.ZodString>;
77
+ VERCEL_GIT_PULL_REQUEST_ID: z.ZodOptional<z.ZodString>;
78
+ VERCEL_SKEW_PROTECTION_ENABLED: z.ZodOptional<z.ZodEnum<{
79
+ 1: "1";
80
+ }>>;
81
+ };
82
+ };
83
+ //#endregion
84
+ export { netlify, railway, vercel };
85
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1,85 @@
1
+ import { z } from "zod";
2
+
3
+ //#region src/presets/netlify.d.ts
4
+ declare const netlify: {
5
+ server: {
6
+ NETLIFY: z.ZodEnum<{
7
+ true: "true";
8
+ }>;
9
+ BUILD_ID: z.ZodString;
10
+ CONTEXT: z.ZodEnum<{
11
+ production: "production";
12
+ "deploy-preview": "deploy-preview";
13
+ "branch-deploy": "branch-deploy";
14
+ dev: "dev";
15
+ }>;
16
+ DEPLOY_ID: z.ZodString;
17
+ DEPLOY_URL: z.ZodURL;
18
+ DEPLOY_PRIME_URL: z.ZodURL;
19
+ URL: z.ZodURL;
20
+ BRANCH: z.ZodString;
21
+ COMMIT_REF: z.ZodString;
22
+ PULL_REQUEST: z.ZodOptional<z.ZodEnum<{
23
+ true: "true";
24
+ }>>;
25
+ REVIEW_ID: z.ZodOptional<z.ZodString>;
26
+ REPOSITORY_URL: z.ZodOptional<z.ZodURL>;
27
+ INCOMING_HOOK_TITLE: z.ZodOptional<z.ZodString>;
28
+ INCOMING_HOOK_URL: z.ZodOptional<z.ZodURL>;
29
+ };
30
+ };
31
+ //#endregion
32
+ //#region src/presets/railway.d.ts
33
+ declare const railway: {
34
+ server: {
35
+ RAILWAY_ENVIRONMENT_ID: z.ZodString;
36
+ RAILWAY_ENVIRONMENT_NAME: z.ZodString;
37
+ RAILWAY_SERVICE_ID: z.ZodString;
38
+ RAILWAY_SERVICE_NAME: z.ZodString;
39
+ RAILWAY_PROJECT_ID: z.ZodString;
40
+ RAILWAY_PROJECT_NAME: z.ZodString;
41
+ RAILWAY_DEPLOYMENT_ID: z.ZodString;
42
+ RAILWAY_REPLICA_ID: z.ZodOptional<z.ZodString>;
43
+ RAILWAY_GIT_COMMIT_SHA: z.ZodOptional<z.ZodString>;
44
+ RAILWAY_GIT_BRANCH: z.ZodOptional<z.ZodString>;
45
+ RAILWAY_GIT_REPO_NAME: z.ZodOptional<z.ZodString>;
46
+ RAILWAY_GIT_REPO_OWNER: z.ZodOptional<z.ZodString>;
47
+ RAILWAY_PUBLIC_DOMAIN: z.ZodOptional<z.ZodString>;
48
+ RAILWAY_PRIVATE_DOMAIN: z.ZodOptional<z.ZodString>;
49
+ RAILWAY_TCP_PROXY_DOMAIN: z.ZodOptional<z.ZodString>;
50
+ RAILWAY_TCP_PROXY_PORT: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
51
+ };
52
+ };
53
+ //#endregion
54
+ //#region src/presets/vercel.d.ts
55
+ declare const vercel: {
56
+ server: {
57
+ VERCEL: z.ZodEnum<{
58
+ 1: "1";
59
+ }>;
60
+ VERCEL_ENV: z.ZodEnum<{
61
+ production: "production";
62
+ preview: "preview";
63
+ development: "development";
64
+ }>;
65
+ VERCEL_URL: z.ZodString;
66
+ VERCEL_BRANCH_URL: z.ZodOptional<z.ZodString>;
67
+ VERCEL_PROJECT_PRODUCTION_URL: z.ZodString;
68
+ VERCEL_DEPLOYMENT_ID: z.ZodString;
69
+ VERCEL_REGION: z.ZodOptional<z.ZodString>;
70
+ VERCEL_GIT_PROVIDER: z.ZodOptional<z.ZodString>;
71
+ VERCEL_GIT_REPO_SLUG: z.ZodOptional<z.ZodString>;
72
+ VERCEL_GIT_REPO_OWNER: z.ZodOptional<z.ZodString>;
73
+ VERCEL_GIT_COMMIT_REF: z.ZodOptional<z.ZodString>;
74
+ VERCEL_GIT_COMMIT_SHA: z.ZodOptional<z.ZodString>;
75
+ VERCEL_GIT_COMMIT_MESSAGE: z.ZodOptional<z.ZodString>;
76
+ VERCEL_GIT_COMMIT_AUTHOR_LOGIN: z.ZodOptional<z.ZodString>;
77
+ VERCEL_GIT_PULL_REQUEST_ID: z.ZodOptional<z.ZodString>;
78
+ VERCEL_SKEW_PROTECTION_ENABLED: z.ZodOptional<z.ZodEnum<{
79
+ 1: "1";
80
+ }>>;
81
+ };
82
+ };
83
+ //#endregion
84
+ export { netlify, railway, vercel };
85
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1,71 @@
1
+ import { z } from "zod";
2
+ //#region src/presets/netlify.ts
3
+ const netlify = { server: {
4
+ NETLIFY: z.enum(["true"]),
5
+ BUILD_ID: z.string().min(1),
6
+ CONTEXT: z.enum([
7
+ "production",
8
+ "deploy-preview",
9
+ "branch-deploy",
10
+ "dev"
11
+ ]),
12
+ DEPLOY_ID: z.string().min(1),
13
+ DEPLOY_URL: z.url(),
14
+ DEPLOY_PRIME_URL: z.url(),
15
+ URL: z.url(),
16
+ BRANCH: z.string().min(1),
17
+ COMMIT_REF: z.string().min(1),
18
+ PULL_REQUEST: z.enum(["true"]).optional(),
19
+ REVIEW_ID: z.string().optional(),
20
+ REPOSITORY_URL: z.url().optional(),
21
+ INCOMING_HOOK_TITLE: z.string().optional(),
22
+ INCOMING_HOOK_URL: z.url().optional()
23
+ } };
24
+ //#endregion
25
+ //#region src/presets/railway.ts
26
+ const railway = { server: {
27
+ RAILWAY_ENVIRONMENT_ID: z.string().min(1),
28
+ RAILWAY_ENVIRONMENT_NAME: z.string().min(1),
29
+ RAILWAY_SERVICE_ID: z.string().min(1),
30
+ RAILWAY_SERVICE_NAME: z.string().min(1),
31
+ RAILWAY_PROJECT_ID: z.string().min(1),
32
+ RAILWAY_PROJECT_NAME: z.string().min(1),
33
+ RAILWAY_DEPLOYMENT_ID: z.string().min(1),
34
+ RAILWAY_REPLICA_ID: z.string().optional(),
35
+ RAILWAY_GIT_COMMIT_SHA: z.string().optional(),
36
+ RAILWAY_GIT_BRANCH: z.string().optional(),
37
+ RAILWAY_GIT_REPO_NAME: z.string().optional(),
38
+ RAILWAY_GIT_REPO_OWNER: z.string().optional(),
39
+ RAILWAY_PUBLIC_DOMAIN: z.string().min(1).optional(),
40
+ RAILWAY_PRIVATE_DOMAIN: z.string().min(1).optional(),
41
+ RAILWAY_TCP_PROXY_DOMAIN: z.string().min(1).optional(),
42
+ RAILWAY_TCP_PROXY_PORT: z.coerce.number().int().min(1).max(65535).optional()
43
+ } };
44
+ //#endregion
45
+ //#region src/presets/vercel.ts
46
+ const vercel = { server: {
47
+ VERCEL: z.enum(["1"]),
48
+ VERCEL_ENV: z.enum([
49
+ "production",
50
+ "preview",
51
+ "development"
52
+ ]),
53
+ VERCEL_URL: z.string().min(1),
54
+ VERCEL_BRANCH_URL: z.string().min(1).optional(),
55
+ VERCEL_PROJECT_PRODUCTION_URL: z.string().min(1),
56
+ VERCEL_DEPLOYMENT_ID: z.string().min(1),
57
+ VERCEL_REGION: z.string().optional(),
58
+ VERCEL_GIT_PROVIDER: z.string().optional(),
59
+ VERCEL_GIT_REPO_SLUG: z.string().optional(),
60
+ VERCEL_GIT_REPO_OWNER: z.string().optional(),
61
+ VERCEL_GIT_COMMIT_REF: z.string().optional(),
62
+ VERCEL_GIT_COMMIT_SHA: z.string().optional(),
63
+ VERCEL_GIT_COMMIT_MESSAGE: z.string().optional(),
64
+ VERCEL_GIT_COMMIT_AUTHOR_LOGIN: z.string().optional(),
65
+ VERCEL_GIT_PULL_REQUEST_ID: z.string().optional(),
66
+ VERCEL_SKEW_PROTECTION_ENABLED: z.enum(["1"]).optional()
67
+ } };
68
+ //#endregion
69
+ export { netlify, railway, vercel };
70
+
71
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/presets/netlify.ts","../../src/presets/railway.ts","../../src/presets/vercel.ts"],"sourcesContent":["import type { EnvPreset } from '../types'\nimport { z } from 'zod'\n\nexport const netlify = {\n server: {\n // Set to 'true' by Netlify to indicate a Netlify build (note: Vercel uses '1', not 'true')\n NETLIFY: z.enum(['true']),\n BUILD_ID: z.string().min(1),\n CONTEXT: z.enum(['production', 'deploy-preview', 'branch-deploy', 'dev']),\n DEPLOY_ID: z.string().min(1),\n // Full https:// URLs — z.url() is correct here unlike VERCEL_URL\n DEPLOY_URL: z.url(),\n DEPLOY_PRIME_URL: z.url(),\n URL: z.url(),\n BRANCH: z.string().min(1),\n COMMIT_REF: z.string().min(1),\n // Netlify sets this to 'true' on PR deploys; absent (not 'false') on non-PR builds\n PULL_REQUEST: z.enum(['true']).optional(),\n REVIEW_ID: z.string().optional(),\n REPOSITORY_URL: z.url().optional(),\n INCOMING_HOOK_TITLE: z.string().optional(),\n INCOMING_HOOK_URL: z.url().optional(),\n },\n} satisfies EnvPreset\n","import type { EnvPreset } from '../types'\nimport { z } from 'zod'\n\nexport const railway = {\n server: {\n RAILWAY_ENVIRONMENT_ID: z.string().min(1),\n RAILWAY_ENVIRONMENT_NAME: z.string().min(1),\n RAILWAY_SERVICE_ID: z.string().min(1),\n RAILWAY_SERVICE_NAME: z.string().min(1),\n RAILWAY_PROJECT_ID: z.string().min(1),\n RAILWAY_PROJECT_NAME: z.string().min(1),\n RAILWAY_DEPLOYMENT_ID: z.string().min(1),\n RAILWAY_REPLICA_ID: z.string().optional(),\n RAILWAY_GIT_COMMIT_SHA: z.string().optional(),\n RAILWAY_GIT_BRANCH: z.string().optional(),\n RAILWAY_GIT_REPO_NAME: z.string().optional(),\n RAILWAY_GIT_REPO_OWNER: z.string().optional(),\n RAILWAY_PUBLIC_DOMAIN: z.string().min(1).optional(),\n RAILWAY_PRIVATE_DOMAIN: z.string().min(1).optional(),\n RAILWAY_TCP_PROXY_DOMAIN: z.string().min(1).optional(),\n RAILWAY_TCP_PROXY_PORT: z.coerce.number().int().min(1).max(65535).optional(),\n // PORT excluded: generic name set by many tools independently; handle it in your own server config\n },\n} satisfies EnvPreset\n","import type { EnvPreset } from '../types'\nimport { z } from 'zod'\n\nexport const vercel = {\n server: {\n // Set to '1' by Vercel to indicate a Vercel environment\n VERCEL: z.enum(['1']),\n VERCEL_ENV: z.enum(['production', 'preview', 'development']),\n // Bare hostname (e.g. myapp-abc123.vercel.app) — no scheme, z.url() would reject it\n VERCEL_URL: z.string().min(1),\n VERCEL_BRANCH_URL: z.string().min(1).optional(),\n VERCEL_PROJECT_PRODUCTION_URL: z.string().min(1),\n VERCEL_DEPLOYMENT_ID: z.string().min(1),\n VERCEL_REGION: z.string().optional(),\n // z.string() not enum — Vercel may add providers (Azure DevOps, self-hosted GitLab) without notice\n VERCEL_GIT_PROVIDER: z.string().optional(),\n VERCEL_GIT_REPO_SLUG: z.string().optional(),\n VERCEL_GIT_REPO_OWNER: z.string().optional(),\n VERCEL_GIT_COMMIT_REF: z.string().optional(),\n VERCEL_GIT_COMMIT_SHA: z.string().optional(),\n VERCEL_GIT_COMMIT_MESSAGE: z.string().optional(),\n VERCEL_GIT_COMMIT_AUTHOR_LOGIN: z.string().optional(),\n VERCEL_GIT_PULL_REQUEST_ID: z.string().optional(),\n VERCEL_SKEW_PROTECTION_ENABLED: z.enum(['1']).optional(),\n },\n} satisfies EnvPreset\n"],"mappings":";;AAGA,MAAa,UAAU,EACrB,QAAQ;CAEN,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC;CACzB,UAAU,EAAE,QAAQ,CAAC,IAAI,EAAE;CAC3B,SAAS,EAAE,KAAK;EAAC;EAAc;EAAkB;EAAiB;EAAM,CAAC;CACzE,WAAW,EAAE,QAAQ,CAAC,IAAI,EAAE;CAE5B,YAAY,EAAE,KAAK;CACnB,kBAAkB,EAAE,KAAK;CACzB,KAAK,EAAE,KAAK;CACZ,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE;CACzB,YAAY,EAAE,QAAQ,CAAC,IAAI,EAAE;CAE7B,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU;CACzC,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,gBAAgB,EAAE,KAAK,CAAC,UAAU;CAClC,qBAAqB,EAAE,QAAQ,CAAC,UAAU;CAC1C,mBAAmB,EAAE,KAAK,CAAC,UAAU;CACtC,EACF;;;ACpBD,MAAa,UAAU,EACrB,QAAQ;CACN,wBAAwB,EAAE,QAAQ,CAAC,IAAI,EAAE;CACzC,0BAA0B,EAAE,QAAQ,CAAC,IAAI,EAAE;CAC3C,oBAAoB,EAAE,QAAQ,CAAC,IAAI,EAAE;CACrC,sBAAsB,EAAE,QAAQ,CAAC,IAAI,EAAE;CACvC,oBAAoB,EAAE,QAAQ,CAAC,IAAI,EAAE;CACrC,sBAAsB,EAAE,QAAQ,CAAC,IAAI,EAAE;CACvC,uBAAuB,EAAE,QAAQ,CAAC,IAAI,EAAE;CACxC,oBAAoB,EAAE,QAAQ,CAAC,UAAU;CACzC,wBAAwB,EAAE,QAAQ,CAAC,UAAU;CAC7C,oBAAoB,EAAE,QAAQ,CAAC,UAAU;CACzC,uBAAuB,EAAE,QAAQ,CAAC,UAAU;CAC5C,wBAAwB,EAAE,QAAQ,CAAC,UAAU;CAC7C,uBAAuB,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU;CACnD,wBAAwB,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU;CACpD,0BAA0B,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU;CACtD,wBAAwB,EAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,UAAU;CAE7E,EACF;;;ACpBD,MAAa,SAAS,EACpB,QAAQ;CAEN,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC;CACrB,YAAY,EAAE,KAAK;EAAC;EAAc;EAAW;EAAc,CAAC;CAE5D,YAAY,EAAE,QAAQ,CAAC,IAAI,EAAE;CAC7B,mBAAmB,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU;CAC/C,+BAA+B,EAAE,QAAQ,CAAC,IAAI,EAAE;CAChD,sBAAsB,EAAE,QAAQ,CAAC,IAAI,EAAE;CACvC,eAAe,EAAE,QAAQ,CAAC,UAAU;CAEpC,qBAAqB,EAAE,QAAQ,CAAC,UAAU;CAC1C,sBAAsB,EAAE,QAAQ,CAAC,UAAU;CAC3C,uBAAuB,EAAE,QAAQ,CAAC,UAAU;CAC5C,uBAAuB,EAAE,QAAQ,CAAC,UAAU;CAC5C,uBAAuB,EAAE,QAAQ,CAAC,UAAU;CAC5C,2BAA2B,EAAE,QAAQ,CAAC,UAAU;CAChD,gCAAgC,EAAE,QAAQ,CAAC,UAAU;CACrD,4BAA4B,EAAE,QAAQ,CAAC,UAAU;CACjD,gCAAgC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU;CACzD,EACF"}
package/dist/schema.cjs CHANGED
@@ -2,11 +2,32 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("./dts-BgHTl6hC.cjs");
3
3
  let zod = require("zod");
4
4
  //#region src/schema.ts
5
- function defineEnv(definition) {
6
- if (definition.client) {
7
- for (const key of Object.keys(definition.client)) if (!key.startsWith("VITE_")) throw new Error(`[vite-env] Client env var "${key}" must be prefixed with VITE_.\n Rename it to "VITE_${key}" or move it to "server" if it's secret.`);
5
+ function warnSideConflicts(keys, seen, userKeys, side) {
6
+ for (const key of keys) {
7
+ const duplicate = seen.has(key);
8
+ if (duplicate) console.warn(`[vite-env] "${key}" is defined in multiple presets. The last preset wins.`);
9
+ seen.add(key);
10
+ if (!duplicate && userKeys.has(key)) console.warn(`[vite-env] "${key}" is defined in both a preset and your ${side} config. Your definition wins.`);
11
+ }
12
+ }
13
+ function warnConflicts(presets, userServerKeys, userClientKeys) {
14
+ const seenServerKeys = /* @__PURE__ */ new Set();
15
+ const seenClientKeys = /* @__PURE__ */ new Set();
16
+ for (const preset of presets) {
17
+ warnSideConflicts(Object.keys(preset.server ?? {}), seenServerKeys, userServerKeys, "server");
18
+ warnSideConflicts(Object.keys(preset.client ?? {}), seenClientKeys, userClientKeys, "client");
8
19
  }
9
- return definition;
20
+ }
21
+ function defineEnv(definition) {
22
+ const { presets = [], server, client, ...rest } = definition;
23
+ const mergedServer = Object.assign({}, ...presets.map((p) => p.server ?? {}), server);
24
+ const mergedClient = Object.assign({}, ...presets.map((p) => p.client ?? {}), client);
25
+ warnConflicts(presets, new Set(Object.keys(server ?? {})), new Set(Object.keys(client ?? {})));
26
+ for (const key of Object.keys(mergedClient)) if (!key.startsWith("VITE_")) throw new Error(`[vite-env] Client env var "${key}" must be prefixed with VITE_.\n Rename it to "VITE_${key}" or move it to "server" if it's secret.`);
27
+ const result = { ...rest };
28
+ if (Object.keys(mergedServer).length > 0 || server !== void 0) result.server = mergedServer;
29
+ if (Object.keys(mergedClient).length > 0 || client !== void 0) result.client = mergedClient;
30
+ return result;
10
31
  }
11
32
  function validateEnv(def, rawEnv) {
12
33
  const combinedShape = {
@@ -1 +1 @@
1
- {"version":3,"file":"schema.cjs","names":["z"],"sources":["../src/schema.ts"],"sourcesContent":["import type { EnvDefinition, ValidationResult } from './types'\nimport { z } from 'zod'\n\nexport function defineEnv<T extends EnvDefinition>(definition: T): T {\n if (definition.client) {\n for (const key of Object.keys(definition.client)) {\n if (!key.startsWith('VITE_')) {\n throw new Error(\n `[vite-env] Client env var \"${key}\" must be prefixed with VITE_.\\n`\n + ` Rename it to \"VITE_${key}\" or move it to \"server\" if it's secret.`,\n )\n }\n }\n }\n\n return definition\n}\n\nexport function validateEnv(\n def: EnvDefinition,\n rawEnv: Record<string, string>,\n): ValidationResult {\n const combinedShape = {\n ...def.server,\n ...def.client,\n }\n\n const schema = z.object(combinedShape)\n const result = schema.safeParse(rawEnv)\n\n if (result.success) {\n return { success: true, data: result.data, errors: [] as const }\n }\n\n return {\n success: false,\n data: null,\n errors: result.error.issues,\n }\n}\n"],"mappings":";;;;AAGA,SAAgB,UAAmC,YAAkB;AACnE,KAAI,WAAW;OACR,MAAM,OAAO,OAAO,KAAK,WAAW,OAAO,CAC9C,KAAI,CAAC,IAAI,WAAW,QAAQ,CAC1B,OAAM,IAAI,MACR,8BAA8B,IAAI,uDACR,IAAI,0CAC/B;;AAKP,QAAO;;AAGT,SAAgB,YACd,KACA,QACkB;CAClB,MAAM,gBAAgB;EACpB,GAAG,IAAI;EACP,GAAG,IAAI;EACR;CAGD,MAAM,SADSA,IAAAA,EAAE,OAAO,cAAc,CAChB,UAAU,OAAO;AAEvC,KAAI,OAAO,QACT,QAAO;EAAE,SAAS;EAAM,MAAM,OAAO;EAAM,QAAQ,EAAE;EAAW;AAGlE,QAAO;EACL,SAAS;EACT,MAAM;EACN,QAAQ,OAAO,MAAM;EACtB"}
1
+ {"version":3,"file":"schema.cjs","names":["z"],"sources":["../src/schema.ts"],"sourcesContent":["import type { EnvDefinition, EnvPreset, ValidationResult } from './types'\nimport { z } from 'zod'\n\ninterface DefineEnvInput extends EnvDefinition {\n presets?: EnvPreset[]\n}\n\nfunction warnSideConflicts(\n keys: string[],\n seen: Set<string>,\n userKeys: Set<string>,\n side: 'server' | 'client',\n): void {\n for (const key of keys) {\n const duplicate = seen.has(key)\n if (duplicate)\n console.warn(`[vite-env] \"${key}\" is defined in multiple presets. The last preset wins.`)\n seen.add(key)\n if (!duplicate && userKeys.has(key))\n console.warn(`[vite-env] \"${key}\" is defined in both a preset and your ${side} config. Your definition wins.`)\n }\n}\n\nfunction warnConflicts(\n presets: EnvPreset[],\n userServerKeys: Set<string>,\n userClientKeys: Set<string>,\n): void {\n const seenServerKeys = new Set<string>()\n const seenClientKeys = new Set<string>()\n\n for (const preset of presets) {\n warnSideConflicts(Object.keys(preset.server ?? {}), seenServerKeys, userServerKeys, 'server')\n warnSideConflicts(Object.keys(preset.client ?? {}), seenClientKeys, userClientKeys, 'client')\n }\n}\n\nexport function defineEnv<T extends DefineEnvInput>(definition: T): Omit<T, 'presets'> & Pick<EnvDefinition, 'server' | 'client'> {\n const { presets = [], server, client, ...rest } = definition\n // ...rest intentionally forwarded — T may carry extra keys beyond EnvDefinition\n\n const mergedServer: z.ZodRawShape = Object.assign({}, ...presets.map(p => p.server ?? {}), server)\n const mergedClient: z.ZodRawShape = Object.assign({}, ...presets.map(p => p.client ?? {}), client)\n\n warnConflicts(\n presets,\n new Set(Object.keys(server ?? {})),\n new Set(Object.keys(client ?? {})),\n )\n\n for (const key of Object.keys(mergedClient)) {\n if (!key.startsWith('VITE_')) {\n throw new Error(\n `[vite-env] Client env var \"${key}\" must be prefixed with VITE_.\\n`\n + ` Rename it to \"VITE_${key}\" or move it to \"server\" if it's secret.`,\n )\n }\n }\n\n const result: Record<string, unknown> = { ...rest }\n if (Object.keys(mergedServer).length > 0 || server !== undefined)\n result.server = mergedServer\n if (Object.keys(mergedClient).length > 0 || client !== undefined)\n result.client = mergedClient\n\n return result as Omit<T, 'presets'>\n}\n\nexport function validateEnv(\n def: EnvDefinition,\n rawEnv: Record<string, string>,\n): ValidationResult {\n const combinedShape = {\n ...def.server,\n ...def.client,\n }\n\n const schema = z.object(combinedShape)\n const result = schema.safeParse(rawEnv)\n\n if (result.success) {\n return { success: true, data: result.data, errors: [] as const }\n }\n\n return {\n success: false,\n data: null,\n errors: result.error.issues,\n }\n}\n"],"mappings":";;;;AAOA,SAAS,kBACP,MACA,MACA,UACA,MACM;AACN,MAAK,MAAM,OAAO,MAAM;EACtB,MAAM,YAAY,KAAK,IAAI,IAAI;AAC/B,MAAI,UACF,SAAQ,KAAK,eAAe,IAAI,yDAAyD;AAC3F,OAAK,IAAI,IAAI;AACb,MAAI,CAAC,aAAa,SAAS,IAAI,IAAI,CACjC,SAAQ,KAAK,eAAe,IAAI,yCAAyC,KAAK,gCAAgC;;;AAIpH,SAAS,cACP,SACA,gBACA,gBACM;CACN,MAAM,iCAAiB,IAAI,KAAa;CACxC,MAAM,iCAAiB,IAAI,KAAa;AAExC,MAAK,MAAM,UAAU,SAAS;AAC5B,oBAAkB,OAAO,KAAK,OAAO,UAAU,EAAE,CAAC,EAAE,gBAAgB,gBAAgB,SAAS;AAC7F,oBAAkB,OAAO,KAAK,OAAO,UAAU,EAAE,CAAC,EAAE,gBAAgB,gBAAgB,SAAS;;;AAIjG,SAAgB,UAAoC,YAA8E;CAChI,MAAM,EAAE,UAAU,EAAE,EAAE,QAAQ,QAAQ,GAAG,SAAS;CAGlD,MAAM,eAA8B,OAAO,OAAO,EAAE,EAAE,GAAG,QAAQ,KAAI,MAAK,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO;CAClG,MAAM,eAA8B,OAAO,OAAO,EAAE,EAAE,GAAG,QAAQ,KAAI,MAAK,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO;AAElG,eACE,SACA,IAAI,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC,CAAC,EAClC,IAAI,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC,CAAC,CACnC;AAED,MAAK,MAAM,OAAO,OAAO,KAAK,aAAa,CACzC,KAAI,CAAC,IAAI,WAAW,QAAQ,CAC1B,OAAM,IAAI,MACR,8BAA8B,IAAI,uDACR,IAAI,0CAC/B;CAIL,MAAM,SAAkC,EAAE,GAAG,MAAM;AACnD,KAAI,OAAO,KAAK,aAAa,CAAC,SAAS,KAAK,WAAW,KAAA,EACrD,QAAO,SAAS;AAClB,KAAI,OAAO,KAAK,aAAa,CAAC,SAAS,KAAK,WAAW,KAAA,EACrD,QAAO,SAAS;AAElB,QAAO;;AAGT,SAAgB,YACd,KACA,QACkB;CAClB,MAAM,gBAAgB;EACpB,GAAG,IAAI;EACP,GAAG,IAAI;EACR;CAGD,MAAM,SADSA,IAAAA,EAAE,OAAO,cAAc,CAChB,UAAU,OAAO;AAEvC,KAAI,OAAO,QACT,QAAO;EAAE,SAAS;EAAM,MAAM,OAAO;EAAM,QAAQ,EAAE;EAAW;AAGlE,QAAO;EACL,SAAS;EACT,MAAM;EACN,QAAQ,OAAO,MAAM;EACtB"}
package/dist/schema.d.cts CHANGED
@@ -1,7 +1,10 @@
1
- import { c as ValidationResult, n as EnvDefinition } from "./types-1okexcwM.cjs";
1
+ import { l as ValidationResult, n as EnvDefinition, r as EnvPreset } from "./types-Bl3YdPck.cjs";
2
2
 
3
3
  //#region src/schema.d.ts
4
- declare function defineEnv<T extends EnvDefinition>(definition: T): T;
4
+ interface DefineEnvInput extends EnvDefinition {
5
+ presets?: EnvPreset[];
6
+ }
7
+ declare function defineEnv<T extends DefineEnvInput>(definition: T): Omit<T, 'presets'> & Pick<EnvDefinition, 'server' | 'client'>;
5
8
  declare function validateEnv(def: EnvDefinition, rawEnv: Record<string, string>): ValidationResult;
6
9
  //#endregion
7
10
  export { defineEnv, validateEnv };
package/dist/schema.d.mts CHANGED
@@ -1,7 +1,10 @@
1
- import { c as ValidationResult, n as EnvDefinition } from "./types-DuWT_251.mjs";
1
+ import { l as ValidationResult, n as EnvDefinition, r as EnvPreset } from "./types-CUF5RARc.mjs";
2
2
 
3
3
  //#region src/schema.d.ts
4
- declare function defineEnv<T extends EnvDefinition>(definition: T): T;
4
+ interface DefineEnvInput extends EnvDefinition {
5
+ presets?: EnvPreset[];
6
+ }
7
+ declare function defineEnv<T extends DefineEnvInput>(definition: T): Omit<T, 'presets'> & Pick<EnvDefinition, 'server' | 'client'>;
5
8
  declare function validateEnv(def: EnvDefinition, rawEnv: Record<string, string>): ValidationResult;
6
9
  //#endregion
7
10
  export { defineEnv, validateEnv };
package/dist/schema.mjs CHANGED
@@ -1,10 +1,31 @@
1
1
  import { z } from "zod";
2
2
  //#region src/schema.ts
3
- function defineEnv(definition) {
4
- if (definition.client) {
5
- for (const key of Object.keys(definition.client)) if (!key.startsWith("VITE_")) throw new Error(`[vite-env] Client env var "${key}" must be prefixed with VITE_.\n Rename it to "VITE_${key}" or move it to "server" if it's secret.`);
3
+ function warnSideConflicts(keys, seen, userKeys, side) {
4
+ for (const key of keys) {
5
+ const duplicate = seen.has(key);
6
+ if (duplicate) console.warn(`[vite-env] "${key}" is defined in multiple presets. The last preset wins.`);
7
+ seen.add(key);
8
+ if (!duplicate && userKeys.has(key)) console.warn(`[vite-env] "${key}" is defined in both a preset and your ${side} config. Your definition wins.`);
9
+ }
10
+ }
11
+ function warnConflicts(presets, userServerKeys, userClientKeys) {
12
+ const seenServerKeys = /* @__PURE__ */ new Set();
13
+ const seenClientKeys = /* @__PURE__ */ new Set();
14
+ for (const preset of presets) {
15
+ warnSideConflicts(Object.keys(preset.server ?? {}), seenServerKeys, userServerKeys, "server");
16
+ warnSideConflicts(Object.keys(preset.client ?? {}), seenClientKeys, userClientKeys, "client");
6
17
  }
7
- return definition;
18
+ }
19
+ function defineEnv(definition) {
20
+ const { presets = [], server, client, ...rest } = definition;
21
+ const mergedServer = Object.assign({}, ...presets.map((p) => p.server ?? {}), server);
22
+ const mergedClient = Object.assign({}, ...presets.map((p) => p.client ?? {}), client);
23
+ warnConflicts(presets, new Set(Object.keys(server ?? {})), new Set(Object.keys(client ?? {})));
24
+ for (const key of Object.keys(mergedClient)) if (!key.startsWith("VITE_")) throw new Error(`[vite-env] Client env var "${key}" must be prefixed with VITE_.\n Rename it to "VITE_${key}" or move it to "server" if it's secret.`);
25
+ const result = { ...rest };
26
+ if (Object.keys(mergedServer).length > 0 || server !== void 0) result.server = mergedServer;
27
+ if (Object.keys(mergedClient).length > 0 || client !== void 0) result.client = mergedClient;
28
+ return result;
8
29
  }
9
30
  function validateEnv(def, rawEnv) {
10
31
  const combinedShape = {
@@ -1 +1 @@
1
- {"version":3,"file":"schema.mjs","names":[],"sources":["../src/schema.ts"],"sourcesContent":["import type { EnvDefinition, ValidationResult } from './types'\nimport { z } from 'zod'\n\nexport function defineEnv<T extends EnvDefinition>(definition: T): T {\n if (definition.client) {\n for (const key of Object.keys(definition.client)) {\n if (!key.startsWith('VITE_')) {\n throw new Error(\n `[vite-env] Client env var \"${key}\" must be prefixed with VITE_.\\n`\n + ` Rename it to \"VITE_${key}\" or move it to \"server\" if it's secret.`,\n )\n }\n }\n }\n\n return definition\n}\n\nexport function validateEnv(\n def: EnvDefinition,\n rawEnv: Record<string, string>,\n): ValidationResult {\n const combinedShape = {\n ...def.server,\n ...def.client,\n }\n\n const schema = z.object(combinedShape)\n const result = schema.safeParse(rawEnv)\n\n if (result.success) {\n return { success: true, data: result.data, errors: [] as const }\n }\n\n return {\n success: false,\n data: null,\n errors: result.error.issues,\n }\n}\n"],"mappings":";;AAGA,SAAgB,UAAmC,YAAkB;AACnE,KAAI,WAAW;OACR,MAAM,OAAO,OAAO,KAAK,WAAW,OAAO,CAC9C,KAAI,CAAC,IAAI,WAAW,QAAQ,CAC1B,OAAM,IAAI,MACR,8BAA8B,IAAI,uDACR,IAAI,0CAC/B;;AAKP,QAAO;;AAGT,SAAgB,YACd,KACA,QACkB;CAClB,MAAM,gBAAgB;EACpB,GAAG,IAAI;EACP,GAAG,IAAI;EACR;CAGD,MAAM,SADS,EAAE,OAAO,cAAc,CAChB,UAAU,OAAO;AAEvC,KAAI,OAAO,QACT,QAAO;EAAE,SAAS;EAAM,MAAM,OAAO;EAAM,QAAQ,EAAE;EAAW;AAGlE,QAAO;EACL,SAAS;EACT,MAAM;EACN,QAAQ,OAAO,MAAM;EACtB"}
1
+ {"version":3,"file":"schema.mjs","names":[],"sources":["../src/schema.ts"],"sourcesContent":["import type { EnvDefinition, EnvPreset, ValidationResult } from './types'\nimport { z } from 'zod'\n\ninterface DefineEnvInput extends EnvDefinition {\n presets?: EnvPreset[]\n}\n\nfunction warnSideConflicts(\n keys: string[],\n seen: Set<string>,\n userKeys: Set<string>,\n side: 'server' | 'client',\n): void {\n for (const key of keys) {\n const duplicate = seen.has(key)\n if (duplicate)\n console.warn(`[vite-env] \"${key}\" is defined in multiple presets. The last preset wins.`)\n seen.add(key)\n if (!duplicate && userKeys.has(key))\n console.warn(`[vite-env] \"${key}\" is defined in both a preset and your ${side} config. Your definition wins.`)\n }\n}\n\nfunction warnConflicts(\n presets: EnvPreset[],\n userServerKeys: Set<string>,\n userClientKeys: Set<string>,\n): void {\n const seenServerKeys = new Set<string>()\n const seenClientKeys = new Set<string>()\n\n for (const preset of presets) {\n warnSideConflicts(Object.keys(preset.server ?? {}), seenServerKeys, userServerKeys, 'server')\n warnSideConflicts(Object.keys(preset.client ?? {}), seenClientKeys, userClientKeys, 'client')\n }\n}\n\nexport function defineEnv<T extends DefineEnvInput>(definition: T): Omit<T, 'presets'> & Pick<EnvDefinition, 'server' | 'client'> {\n const { presets = [], server, client, ...rest } = definition\n // ...rest intentionally forwarded — T may carry extra keys beyond EnvDefinition\n\n const mergedServer: z.ZodRawShape = Object.assign({}, ...presets.map(p => p.server ?? {}), server)\n const mergedClient: z.ZodRawShape = Object.assign({}, ...presets.map(p => p.client ?? {}), client)\n\n warnConflicts(\n presets,\n new Set(Object.keys(server ?? {})),\n new Set(Object.keys(client ?? {})),\n )\n\n for (const key of Object.keys(mergedClient)) {\n if (!key.startsWith('VITE_')) {\n throw new Error(\n `[vite-env] Client env var \"${key}\" must be prefixed with VITE_.\\n`\n + ` Rename it to \"VITE_${key}\" or move it to \"server\" if it's secret.`,\n )\n }\n }\n\n const result: Record<string, unknown> = { ...rest }\n if (Object.keys(mergedServer).length > 0 || server !== undefined)\n result.server = mergedServer\n if (Object.keys(mergedClient).length > 0 || client !== undefined)\n result.client = mergedClient\n\n return result as Omit<T, 'presets'>\n}\n\nexport function validateEnv(\n def: EnvDefinition,\n rawEnv: Record<string, string>,\n): ValidationResult {\n const combinedShape = {\n ...def.server,\n ...def.client,\n }\n\n const schema = z.object(combinedShape)\n const result = schema.safeParse(rawEnv)\n\n if (result.success) {\n return { success: true, data: result.data, errors: [] as const }\n }\n\n return {\n success: false,\n data: null,\n errors: result.error.issues,\n }\n}\n"],"mappings":";;AAOA,SAAS,kBACP,MACA,MACA,UACA,MACM;AACN,MAAK,MAAM,OAAO,MAAM;EACtB,MAAM,YAAY,KAAK,IAAI,IAAI;AAC/B,MAAI,UACF,SAAQ,KAAK,eAAe,IAAI,yDAAyD;AAC3F,OAAK,IAAI,IAAI;AACb,MAAI,CAAC,aAAa,SAAS,IAAI,IAAI,CACjC,SAAQ,KAAK,eAAe,IAAI,yCAAyC,KAAK,gCAAgC;;;AAIpH,SAAS,cACP,SACA,gBACA,gBACM;CACN,MAAM,iCAAiB,IAAI,KAAa;CACxC,MAAM,iCAAiB,IAAI,KAAa;AAExC,MAAK,MAAM,UAAU,SAAS;AAC5B,oBAAkB,OAAO,KAAK,OAAO,UAAU,EAAE,CAAC,EAAE,gBAAgB,gBAAgB,SAAS;AAC7F,oBAAkB,OAAO,KAAK,OAAO,UAAU,EAAE,CAAC,EAAE,gBAAgB,gBAAgB,SAAS;;;AAIjG,SAAgB,UAAoC,YAA8E;CAChI,MAAM,EAAE,UAAU,EAAE,EAAE,QAAQ,QAAQ,GAAG,SAAS;CAGlD,MAAM,eAA8B,OAAO,OAAO,EAAE,EAAE,GAAG,QAAQ,KAAI,MAAK,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO;CAClG,MAAM,eAA8B,OAAO,OAAO,EAAE,EAAE,GAAG,QAAQ,KAAI,MAAK,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO;AAElG,eACE,SACA,IAAI,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC,CAAC,EAClC,IAAI,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC,CAAC,CACnC;AAED,MAAK,MAAM,OAAO,OAAO,KAAK,aAAa,CACzC,KAAI,CAAC,IAAI,WAAW,QAAQ,CAC1B,OAAM,IAAI,MACR,8BAA8B,IAAI,uDACR,IAAI,0CAC/B;CAIL,MAAM,SAAkC,EAAE,GAAG,MAAM;AACnD,KAAI,OAAO,KAAK,aAAa,CAAC,SAAS,KAAK,WAAW,KAAA,EACrD,QAAO,SAAS;AAClB,KAAI,OAAO,KAAK,aAAa,CAAC,SAAS,KAAK,WAAW,KAAA,EACrD,QAAO,SAAS;AAElB,QAAO;;AAGT,SAAgB,YACd,KACA,QACkB;CAClB,MAAM,gBAAgB;EACpB,GAAG,IAAI;EACP,GAAG,IAAI;EACR;CAGD,MAAM,SADS,EAAE,OAAO,cAAc,CAChB,UAAU,OAAO;AAEvC,KAAI,OAAO,QACT,QAAO;EAAE,SAAS;EAAM,MAAM,OAAO;EAAM,QAAQ,EAAE;EAAW;AAGlE,QAAO;EACL,SAAS;EACT,MAAM;EACN,QAAQ,OAAO,MAAM;EACtB"}
@@ -1,4 +1,4 @@
1
- import { a as StandardEnvDefinition, s as StandardValidationResult } from "./types-1okexcwM.cjs";
1
+ import { c as StandardValidationResult, o as StandardEnvDefinition } from "./types-Bl3YdPck.cjs";
2
2
 
3
3
  //#region src/standard.d.ts
4
4
  declare function defineStandardEnv<T extends Omit<StandardEnvDefinition, '_standard'>>(definition: T): T & {
@@ -1,4 +1,4 @@
1
- import { a as StandardEnvDefinition, s as StandardValidationResult } from "./types-DuWT_251.mjs";
1
+ import { c as StandardValidationResult, o as StandardEnvDefinition } from "./types-CUF5RARc.mjs";
2
2
 
3
3
  //#region src/standard.d.ts
4
4
  declare function defineStandardEnv<T extends Omit<StandardEnvDefinition, '_standard'>>(definition: T): T & {
@@ -12,6 +12,10 @@ interface StandardEnvDefinition {
12
12
  /** @internal */
13
13
  readonly _standard: true;
14
14
  }
15
+ interface EnvPreset {
16
+ server?: z.ZodRawShape;
17
+ client?: z.ZodRawShape;
18
+ }
15
19
  type AnyEnvDefinition = EnvDefinition | StandardEnvDefinition;
16
20
  type ValidationResult = {
17
21
  success: true;
@@ -39,5 +43,5 @@ type OrEmptyShape<T> = T extends z.ZodRawShape ? T : Record<string, never>;
39
43
  type InferClientEnv<T extends EnvDefinition> = z.infer<z.ZodObject<OrEmptyShape<T['client']>>>;
40
44
  type InferServerEnv<T extends EnvDefinition> = z.infer<z.ZodObject<OrEmptyShape<T['server']> & OrEmptyShape<T['client']>>>;
41
45
  //#endregion
42
- export { StandardEnvDefinition as a, ValidationResult as c, InferServerEnv as i, EnvDefinition as n, StandardValidationIssue as o, InferClientEnv as r, StandardValidationResult as s, AnyEnvDefinition as t };
43
- //# sourceMappingURL=types-1okexcwM.d.cts.map
46
+ export { InferServerEnv as a, StandardValidationResult as c, InferClientEnv as i, ValidationResult as l, EnvDefinition as n, StandardEnvDefinition as o, EnvPreset as r, StandardValidationIssue as s, AnyEnvDefinition as t };
47
+ //# sourceMappingURL=types-Bl3YdPck.d.cts.map
@@ -12,6 +12,10 @@ interface StandardEnvDefinition {
12
12
  /** @internal */
13
13
  readonly _standard: true;
14
14
  }
15
+ interface EnvPreset {
16
+ server?: z.ZodRawShape;
17
+ client?: z.ZodRawShape;
18
+ }
15
19
  type AnyEnvDefinition = EnvDefinition | StandardEnvDefinition;
16
20
  type ValidationResult = {
17
21
  success: true;
@@ -39,5 +43,5 @@ type OrEmptyShape<T> = T extends z.ZodRawShape ? T : Record<string, never>;
39
43
  type InferClientEnv<T extends EnvDefinition> = z.infer<z.ZodObject<OrEmptyShape<T['client']>>>;
40
44
  type InferServerEnv<T extends EnvDefinition> = z.infer<z.ZodObject<OrEmptyShape<T['server']> & OrEmptyShape<T['client']>>>;
41
45
  //#endregion
42
- export { StandardEnvDefinition as a, ValidationResult as c, InferServerEnv as i, EnvDefinition as n, StandardValidationIssue as o, InferClientEnv as r, StandardValidationResult as s, AnyEnvDefinition as t };
43
- //# sourceMappingURL=types-DuWT_251.d.mts.map
46
+ export { InferServerEnv as a, StandardValidationResult as c, InferClientEnv as i, ValidationResult as l, EnvDefinition as n, StandardEnvDefinition as o, EnvPreset as r, StandardValidationIssue as s, AnyEnvDefinition as t };
47
+ //# sourceMappingURL=types-CUF5RARc.d.mts.map
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://raw.githubusercontent.com/vitejs/vite-plugin-registry/refs/heads/main/data/schema/extended-package-json.schema.json",
3
3
  "name": "@vite-env/core",
4
4
  "type": "module",
5
- "version": "0.4.0",
5
+ "version": "0.5.0",
6
6
  "description": "The env.ts layer for Vite — define once, validate everywhere, import with types",
7
7
  "license": "MIT",
8
8
  "homepage": "https://github.com/pyyupsk/vite-env#readme",
@@ -104,6 +104,16 @@
104
104
  "default": "./dist/standard.cjs"
105
105
  }
106
106
  },
107
+ "./presets": {
108
+ "import": {
109
+ "types": "./dist/presets/index.d.mts",
110
+ "default": "./dist/presets/index.mjs"
111
+ },
112
+ "require": {
113
+ "types": "./dist/presets/index.d.cts",
114
+ "default": "./dist/presets/index.cjs"
115
+ }
116
+ },
107
117
  "./package.json": "./package.json"
108
118
  },
109
119
  "main": "./dist/index.cjs",