@forinda/kickjs-config 0.3.1 → 0.3.2

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/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { z } from 'zod';
2
+ import { Plugin } from 'vite';
2
3
 
3
4
  /**
4
5
  * Base environment schema with common server variables.
@@ -15,7 +16,7 @@ declare const baseEnvSchema: z.ZodObject<{
15
16
  }, z.core.$strip>;
16
17
  /**
17
18
  * Define a custom env schema by extending the base.
18
- * Returns a loader function that validates process.env.
19
+ * Returns a Zod schema that validates process.env.
19
20
  *
20
21
  * @example
21
22
  * ```ts
@@ -28,13 +29,30 @@ declare const baseEnvSchema: z.ZodObject<{
28
29
  * )
29
30
  *
30
31
  * const env = loadEnv(envSchema)
32
+ * env.DATABASE_URL // string — fully typed, autocompletes
31
33
  * ```
32
34
  */
33
- declare function defineEnv<T extends z.ZodRawShape>(extend: (base: typeof baseEnvSchema) => z.ZodObject<any>): z.ZodObject<any>;
35
+ declare function defineEnv<T extends z.ZodRawShape>(extend: (base: typeof baseEnvSchema) => z.ZodObject<any>): ReturnType<typeof extend>;
34
36
  /** Parse and validate process.env against a Zod schema. Caches result per schema. */
35
37
  declare function loadEnv<T extends z.ZodObject<any>>(schema?: T): z.infer<T>;
36
- /** Get a single typed environment variable value */
37
- declare function getEnv<K extends string>(key: K): any;
38
+ /**
39
+ * Get a single typed environment variable value.
40
+ *
41
+ * @example
42
+ * ```ts
43
+ * // Without schema — returns `any`
44
+ * const port = getEnv('PORT')
45
+ *
46
+ * // With schema — fully typed key + return value
47
+ * const dbUrl = getEnv('DATABASE_URL', envSchema)
48
+ * ```
49
+ */
50
+ declare function getEnv<T extends z.ZodObject<any>, K extends string & keyof z.infer<T>>(key: K, schema?: T): z.infer<T>[K];
51
+ /**
52
+ * Reload env from process.env (re-reads dotenv, clears cache).
53
+ * Called during HMR rebuild to pick up .env file changes.
54
+ */
55
+ declare function reloadEnv(): void;
38
56
  /** Reset cached env (useful for testing) */
39
57
  declare function resetEnvCache(): void;
40
58
  type Env = z.infer<typeof baseEnvSchema>;
@@ -46,9 +64,71 @@ declare class ConfigService {
46
64
  get<T = any>(key: string): T;
47
65
  /** Get all env config (readonly) */
48
66
  getAll(): Readonly<Record<string, any>>;
67
+ /** Reload env from .env file (for HMR / file-watch scenarios) */
68
+ reload(): void;
49
69
  isProduction(): boolean;
50
70
  isDevelopment(): boolean;
51
71
  isTest(): boolean;
52
72
  }
73
+ /**
74
+ * Typed config service interface — provides autocomplete for env keys.
75
+ * Use with `createConfigService()` for full type safety.
76
+ */
77
+ interface TypedConfigService<TEnv extends Record<string, any>> {
78
+ get<K extends string & keyof TEnv>(key: K): TEnv[K];
79
+ getAll(): Readonly<TEnv>;
80
+ reload(): void;
81
+ isProduction(): boolean;
82
+ isDevelopment(): boolean;
83
+ isTest(): boolean;
84
+ }
85
+ /**
86
+ * Create a typed ConfigService class bound to a specific Zod env schema.
87
+ * The returned class is DI-injectable via `@Service()` and provides
88
+ * fully typed `get()` with key autocomplete.
89
+ *
90
+ * @example
91
+ * ```ts
92
+ * const envSchema = defineEnv((base) =>
93
+ * base.extend({
94
+ * DATABASE_URL: z.string().url(),
95
+ * JWT_SECRET: z.string().min(32),
96
+ * })
97
+ * )
98
+ *
99
+ * // Create a typed, injectable config service
100
+ * export const AppConfigService = createConfigService(envSchema)
101
+ * export type AppConfigService = InstanceType<typeof AppConfigService>
102
+ *
103
+ * // In a controller or service — inject it:
104
+ * @Controller('/users')
105
+ * class UserController {
106
+ * constructor(@Inject(AppConfigService) private config: AppConfigService) {
107
+ * const dbUrl = config.get('DATABASE_URL') // string — autocompletes!
108
+ * const bad = config.get('NOPE') // TS error
109
+ * }
110
+ * }
111
+ * ```
112
+ */
113
+ declare function createConfigService<T extends z.ZodObject<any>>(schema: T): {
114
+ new (): TypedConfigService<z.core.output<T>>;
115
+ };
116
+
117
+ /**
118
+ * Vite plugin that watches `.env` files and triggers a full reload
119
+ * when they change. This ensures the dev server picks up environment
120
+ * variable changes without a manual restart.
121
+ *
122
+ * @example
123
+ * ```ts
124
+ * // vite.config.ts
125
+ * import { envWatchPlugin } from '@forinda/kickjs-config'
126
+ *
127
+ * export default defineConfig({
128
+ * plugins: [swc.vite(), envWatchPlugin()],
129
+ * })
130
+ * ```
131
+ */
132
+ declare function envWatchPlugin(): Plugin;
53
133
 
54
- export { ConfigService, type Env, baseEnvSchema, defineEnv, getEnv, loadEnv, resetEnvCache };
134
+ export { ConfigService, type Env, type TypedConfigService, baseEnvSchema, createConfigService, defineEnv, envWatchPlugin, getEnv, loadEnv, reloadEnv, resetEnvCache };
package/dist/index.js CHANGED
@@ -1,5 +1,11 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
4
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
5
+ }) : x)(function(x) {
6
+ if (typeof require !== "undefined") return require.apply(this, arguments);
7
+ throw Error('Dynamic require of "' + x + '" is not supported');
8
+ });
3
9
 
4
10
  // src/env.ts
5
11
  import { z } from "zod";
@@ -28,11 +34,19 @@ function loadEnv(schema) {
28
34
  return cachedEnv;
29
35
  }
30
36
  __name(loadEnv, "loadEnv");
31
- function getEnv(key) {
32
- const env = loadEnv();
37
+ function getEnv(key, schema) {
38
+ const env = loadEnv(schema);
33
39
  return env[key];
34
40
  }
35
41
  __name(getEnv, "getEnv");
42
+ function reloadEnv() {
43
+ __require("dotenv").config({
44
+ override: true
45
+ });
46
+ cachedEnv = null;
47
+ cachedSchema = null;
48
+ }
49
+ __name(reloadEnv, "reloadEnv");
36
50
  function resetEnvCache() {
37
51
  cachedEnv = null;
38
52
  cachedSchema = null;
@@ -63,6 +77,11 @@ var ConfigService = class {
63
77
  ...this.env
64
78
  });
65
79
  }
80
+ /** Reload env from .env file (for HMR / file-watch scenarios) */
81
+ reload() {
82
+ reloadEnv();
83
+ this.env = loadEnv();
84
+ }
66
85
  isProduction() {
67
86
  return this.env.NODE_ENV === "production";
68
87
  }
@@ -76,12 +95,92 @@ var ConfigService = class {
76
95
  ConfigService = _ts_decorate([
77
96
  Service()
78
97
  ], ConfigService);
98
+ function createConfigService(schema) {
99
+ let SchemaConfigService = class SchemaConfigService {
100
+ static {
101
+ __name(this, "SchemaConfigService");
102
+ }
103
+ env = loadEnv(schema);
104
+ get(key) {
105
+ return this.env[key];
106
+ }
107
+ getAll() {
108
+ return Object.freeze({
109
+ ...this.env
110
+ });
111
+ }
112
+ reload() {
113
+ reloadEnv();
114
+ this.env = loadEnv(schema);
115
+ }
116
+ isProduction() {
117
+ return this.env.NODE_ENV === "production";
118
+ }
119
+ isDevelopment() {
120
+ return this.env.NODE_ENV === "development";
121
+ }
122
+ isTest() {
123
+ return this.env.NODE_ENV === "test";
124
+ }
125
+ };
126
+ SchemaConfigService = _ts_decorate([
127
+ Service()
128
+ ], SchemaConfigService);
129
+ return SchemaConfigService;
130
+ }
131
+ __name(createConfigService, "createConfigService");
132
+
133
+ // src/vite-env-plugin.ts
134
+ import fs from "fs";
135
+ import path from "path";
136
+ function envWatchPlugin() {
137
+ const envFiles = [
138
+ ".env",
139
+ ".env.local",
140
+ ".env.development",
141
+ ".env.production",
142
+ ".env.test"
143
+ ];
144
+ return {
145
+ name: "kickjs-env-watch",
146
+ configureServer(server) {
147
+ const root = server.config.root;
148
+ for (const file of envFiles) {
149
+ const filePath = path.resolve(root, file);
150
+ if (fs.existsSync(filePath)) {
151
+ server.watcher.add(filePath);
152
+ }
153
+ }
154
+ server.watcher.on("change", (changedPath) => {
155
+ const basename = path.basename(changedPath);
156
+ if (envFiles.includes(basename)) {
157
+ server.config.logger.info(` .env changed (${basename}), triggering reload...`, {
158
+ timestamp: true
159
+ });
160
+ const mods = server.moduleGraph.getModulesByFile(path.resolve(root, "src/index.ts"));
161
+ if (mods) {
162
+ for (const mod of mods) {
163
+ server.moduleGraph.invalidateModule(mod);
164
+ }
165
+ }
166
+ server.ws.send({
167
+ type: "full-reload"
168
+ });
169
+ }
170
+ });
171
+ }
172
+ };
173
+ }
174
+ __name(envWatchPlugin, "envWatchPlugin");
79
175
  export {
80
176
  ConfigService,
81
177
  baseEnvSchema,
178
+ createConfigService,
82
179
  defineEnv,
180
+ envWatchPlugin,
83
181
  getEnv,
84
182
  loadEnv,
183
+ reloadEnv,
85
184
  resetEnvCache
86
185
  };
87
186
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/env.ts","../src/config-service.ts"],"sourcesContent":["import { z } from 'zod'\nimport 'dotenv/config'\n\n/**\n * Base environment schema with common server variables.\n * Users extend this with their own application-specific vars.\n */\nexport const baseEnvSchema = z.object({\n // Server\n PORT: z.coerce.number().default(3000),\n NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),\n LOG_LEVEL: z.string().default('info'),\n})\n\n/** Cached env config to avoid re-parsing — keyed by schema reference */\nlet cachedEnv: any = null\nlet cachedSchema: any = null\n\n/**\n * Define a custom env schema by extending the base.\n * Returns a loader function that validates process.env.\n *\n * @example\n * ```ts\n * const envSchema = defineEnv((base) =>\n * base.extend({\n * DATABASE_URL: z.string().url(),\n * JWT_SECRET: z.string().min(32),\n * REDIS_URL: z.string().url().optional(),\n * })\n * )\n *\n * const env = loadEnv(envSchema)\n * ```\n */\nexport function defineEnv<T extends z.ZodRawShape>(\n extend: (base: typeof baseEnvSchema) => z.ZodObject<any>,\n): z.ZodObject<any> {\n return extend(baseEnvSchema)\n}\n\n/** Parse and validate process.env against a Zod schema. Caches result per schema. */\nexport function loadEnv<T extends z.ZodObject<any>>(schema?: T): z.infer<T> {\n const s = schema || baseEnvSchema\n // Re-parse if schema changed or no cache yet\n if (cachedEnv && cachedSchema === s) return cachedEnv\n cachedSchema = s\n cachedEnv = s.parse(process.env)\n return cachedEnv\n}\n\n/** Get a single typed environment variable value */\nexport function getEnv<K extends string>(key: K): any {\n const env = loadEnv()\n return (env as any)[key]\n}\n\n/** Reset cached env (useful for testing) */\nexport function resetEnvCache(): void {\n cachedEnv = null\n cachedSchema = null\n}\n\nexport type Env = z.infer<typeof baseEnvSchema>\n","import { Service } from '@forinda/kickjs-core'\nimport { loadEnv } from './env'\n\n/** Injectable service for accessing typed environment configuration */\n@Service()\nexport class ConfigService {\n private env: Record<string, any> = loadEnv()\n\n /** Get an env variable by key */\n get<T = any>(key: string): T {\n return this.env[key] as T\n }\n\n /** Get all env config (readonly) */\n getAll(): Readonly<Record<string, any>> {\n return Object.freeze({ ...this.env })\n }\n\n isProduction(): boolean {\n return this.env.NODE_ENV === 'production'\n }\n\n isDevelopment(): boolean {\n return this.env.NODE_ENV === 'development'\n }\n\n isTest(): boolean {\n return this.env.NODE_ENV === 'test'\n }\n}\n"],"mappings":";;;;AAAA,SAASA,SAAS;AAClB,OAAO;AAMA,IAAMC,gBAAgBC,EAAEC,OAAO;;EAEpCC,MAAMF,EAAEG,OAAOC,OAAM,EAAGC,QAAQ,GAAA;EAChCC,UAAUN,EAAEO,KAAK;IAAC;IAAe;IAAc;GAAO,EAAEF,QAAQ,aAAA;EAChEG,WAAWR,EAAES,OAAM,EAAGJ,QAAQ,MAAA;AAChC,CAAA;AAGA,IAAIK,YAAiB;AACrB,IAAIC,eAAoB;AAmBjB,SAASC,UACdC,QAAwD;AAExD,SAAOA,OAAOd,aAAAA;AAChB;AAJgBa;AAOT,SAASE,QAAoCC,QAAU;AAC5D,QAAMC,IAAID,UAAUhB;AAEpB,MAAIW,aAAaC,iBAAiBK,EAAG,QAAON;AAC5CC,iBAAeK;AACfN,cAAYM,EAAEC,MAAMC,QAAQC,GAAG;AAC/B,SAAOT;AACT;AAPgBI;AAUT,SAASM,OAAyBC,KAAM;AAC7C,QAAMF,MAAML,QAAAA;AACZ,SAAQK,IAAYE,GAAAA;AACtB;AAHgBD;AAMT,SAASE,gBAAAA;AACdZ,cAAY;AACZC,iBAAe;AACjB;AAHgBW;;;AC1DhB,SAASC,eAAe;;;;;;;;AAKjB,IAAMC,gBAAN,MAAMA;SAAAA;;;EACHC,MAA2BC,QAAAA;;EAGnCC,IAAaC,KAAgB;AAC3B,WAAO,KAAKH,IAAIG,GAAAA;EAClB;;EAGAC,SAAwC;AACtC,WAAOC,OAAOC,OAAO;MAAE,GAAG,KAAKN;IAAI,CAAA;EACrC;EAEAO,eAAwB;AACtB,WAAO,KAAKP,IAAIQ,aAAa;EAC/B;EAEAC,gBAAyB;AACvB,WAAO,KAAKT,IAAIQ,aAAa;EAC/B;EAEAE,SAAkB;AAChB,WAAO,KAAKV,IAAIQ,aAAa;EAC/B;AACF;;;;","names":["z","baseEnvSchema","z","object","PORT","coerce","number","default","NODE_ENV","enum","LOG_LEVEL","string","cachedEnv","cachedSchema","defineEnv","extend","loadEnv","schema","s","parse","process","env","getEnv","key","resetEnvCache","Service","ConfigService","env","loadEnv","get","key","getAll","Object","freeze","isProduction","NODE_ENV","isDevelopment","isTest"]}
1
+ {"version":3,"sources":["../src/env.ts","../src/config-service.ts","../src/vite-env-plugin.ts"],"sourcesContent":["import { z } from 'zod'\nimport 'dotenv/config'\n\n/**\n * Base environment schema with common server variables.\n * Users extend this with their own application-specific vars.\n */\nexport const baseEnvSchema = z.object({\n // Server\n PORT: z.coerce.number().default(3000),\n NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),\n LOG_LEVEL: z.string().default('info'),\n})\n\n/** Cached env config to avoid re-parsing — keyed by schema reference */\nlet cachedEnv: any = null\nlet cachedSchema: any = null\n\n/**\n * Define a custom env schema by extending the base.\n * Returns a Zod schema that validates process.env.\n *\n * @example\n * ```ts\n * const envSchema = defineEnv((base) =>\n * base.extend({\n * DATABASE_URL: z.string().url(),\n * JWT_SECRET: z.string().min(32),\n * REDIS_URL: z.string().url().optional(),\n * })\n * )\n *\n * const env = loadEnv(envSchema)\n * env.DATABASE_URL // string — fully typed, autocompletes\n * ```\n */\nexport function defineEnv<T extends z.ZodRawShape>(\n extend: (base: typeof baseEnvSchema) => z.ZodObject<any>,\n): ReturnType<typeof extend> {\n return extend(baseEnvSchema) as ReturnType<typeof extend>\n}\n\n/** Parse and validate process.env against a Zod schema. Caches result per schema. */\nexport function loadEnv<T extends z.ZodObject<any>>(schema?: T): z.infer<T> {\n const s = schema || baseEnvSchema\n // Re-parse if schema changed or no cache yet\n if (cachedEnv && cachedSchema === s) return cachedEnv\n cachedSchema = s\n cachedEnv = s.parse(process.env)\n return cachedEnv\n}\n\n/**\n * Get a single typed environment variable value.\n *\n * @example\n * ```ts\n * // Without schema — returns `any`\n * const port = getEnv('PORT')\n *\n * // With schema — fully typed key + return value\n * const dbUrl = getEnv('DATABASE_URL', envSchema)\n * ```\n */\nexport function getEnv<T extends z.ZodObject<any>, K extends string & keyof z.infer<T>>(\n key: K,\n schema?: T,\n): z.infer<T>[K] {\n const env = loadEnv(schema)\n return env[key]\n}\n\n/**\n * Reload env from process.env (re-reads dotenv, clears cache).\n * Called during HMR rebuild to pick up .env file changes.\n */\nexport function reloadEnv(): void {\n // Re-read .env file into process.env\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n require('dotenv').config({ override: true })\n\n // Clear the parse cache so next loadEnv() re-validates\n cachedEnv = null\n cachedSchema = null\n}\n\n/** Reset cached env (useful for testing) */\nexport function resetEnvCache(): void {\n cachedEnv = null\n cachedSchema = null\n}\n\nexport type Env = z.infer<typeof baseEnvSchema>\n","import { Service } from '@forinda/kickjs-core'\nimport type { z } from 'zod'\nimport { loadEnv, reloadEnv } from './env'\n\n/** Injectable service for accessing typed environment configuration */\n@Service()\nexport class ConfigService {\n private env: Record<string, any> = loadEnv()\n\n /** Get an env variable by key */\n get<T = any>(key: string): T {\n return this.env[key] as T\n }\n\n /** Get all env config (readonly) */\n getAll(): Readonly<Record<string, any>> {\n return Object.freeze({ ...this.env })\n }\n\n /** Reload env from .env file (for HMR / file-watch scenarios) */\n reload(): void {\n reloadEnv()\n this.env = loadEnv()\n }\n\n isProduction(): boolean {\n return this.env.NODE_ENV === 'production'\n }\n\n isDevelopment(): boolean {\n return this.env.NODE_ENV === 'development'\n }\n\n isTest(): boolean {\n return this.env.NODE_ENV === 'test'\n }\n}\n\n/**\n * Typed config service interface — provides autocomplete for env keys.\n * Use with `createConfigService()` for full type safety.\n */\nexport interface TypedConfigService<TEnv extends Record<string, any>> {\n get<K extends string & keyof TEnv>(key: K): TEnv[K]\n getAll(): Readonly<TEnv>\n reload(): void\n isProduction(): boolean\n isDevelopment(): boolean\n isTest(): boolean\n}\n\n/**\n * Create a typed ConfigService class bound to a specific Zod env schema.\n * The returned class is DI-injectable via `@Service()` and provides\n * fully typed `get()` with key autocomplete.\n *\n * @example\n * ```ts\n * const envSchema = defineEnv((base) =>\n * base.extend({\n * DATABASE_URL: z.string().url(),\n * JWT_SECRET: z.string().min(32),\n * })\n * )\n *\n * // Create a typed, injectable config service\n * export const AppConfigService = createConfigService(envSchema)\n * export type AppConfigService = InstanceType<typeof AppConfigService>\n *\n * // In a controller or service — inject it:\n * @Controller('/users')\n * class UserController {\n * constructor(@Inject(AppConfigService) private config: AppConfigService) {\n * const dbUrl = config.get('DATABASE_URL') // string — autocompletes!\n * const bad = config.get('NOPE') // TS error\n * }\n * }\n * ```\n */\nexport function createConfigService<T extends z.ZodObject<any>>(schema: T) {\n type TEnv = z.infer<T>\n\n @Service()\n class SchemaConfigService implements TypedConfigService<TEnv> {\n private env: TEnv = loadEnv(schema)\n\n get<K extends string & keyof TEnv>(key: K): TEnv[K] {\n return this.env[key]\n }\n\n getAll(): Readonly<TEnv> {\n return Object.freeze({ ...this.env })\n }\n\n reload(): void {\n reloadEnv()\n this.env = loadEnv(schema)\n }\n\n isProduction(): boolean {\n return this.env.NODE_ENV === 'production'\n }\n\n isDevelopment(): boolean {\n return this.env.NODE_ENV === 'development'\n }\n\n isTest(): boolean {\n return this.env.NODE_ENV === 'test'\n }\n }\n\n return SchemaConfigService as {\n new (): TypedConfigService<TEnv>\n }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport type { Plugin } from 'vite'\n\n/**\n * Vite plugin that watches `.env` files and triggers a full reload\n * when they change. This ensures the dev server picks up environment\n * variable changes without a manual restart.\n *\n * @example\n * ```ts\n * // vite.config.ts\n * import { envWatchPlugin } from '@forinda/kickjs-config'\n *\n * export default defineConfig({\n * plugins: [swc.vite(), envWatchPlugin()],\n * })\n * ```\n */\nexport function envWatchPlugin(): Plugin {\n const envFiles = ['.env', '.env.local', '.env.development', '.env.production', '.env.test']\n\n return {\n name: 'kickjs-env-watch',\n\n configureServer(server) {\n const root = server.config.root\n\n for (const file of envFiles) {\n const filePath = path.resolve(root, file)\n if (fs.existsSync(filePath)) {\n server.watcher.add(filePath)\n }\n }\n\n server.watcher.on('change', (changedPath) => {\n const basename = path.basename(changedPath)\n if (envFiles.includes(basename)) {\n server.config.logger.info(` .env changed (${basename}), triggering reload...`, {\n timestamp: true,\n })\n\n // Invalidate all modules to trigger full HMR rebuild\n const mods = server.moduleGraph.getModulesByFile(path.resolve(root, 'src/index.ts'))\n if (mods) {\n for (const mod of mods) {\n server.moduleGraph.invalidateModule(mod)\n }\n }\n\n server.ws.send({ type: 'full-reload' })\n }\n })\n },\n }\n}\n"],"mappings":"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","names":["z","baseEnvSchema","z","object","PORT","coerce","number","default","NODE_ENV","enum","LOG_LEVEL","string","cachedEnv","cachedSchema","defineEnv","extend","loadEnv","schema","s","parse","process","env","getEnv","key","reloadEnv","require","config","override","resetEnvCache","Service","ConfigService","env","loadEnv","get","key","getAll","Object","freeze","reload","reloadEnv","isProduction","NODE_ENV","isDevelopment","isTest","createConfigService","schema","SchemaConfigService","fs","path","envWatchPlugin","envFiles","name","configureServer","server","root","config","file","filePath","path","resolve","fs","existsSync","watcher","add","on","changedPath","basename","includes","logger","info","timestamp","mods","moduleGraph","getModulesByFile","mod","invalidateModule","ws","send","type"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forinda/kickjs-config",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "description": "Zod-based environment validation and typed configuration for KickJS",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -17,13 +17,22 @@
17
17
  "dependencies": {
18
18
  "dotenv": "^17.3.1",
19
19
  "zod": "^4.3.6",
20
- "@forinda/kickjs-core": "0.3.1"
20
+ "@forinda/kickjs-core": "0.3.2"
21
+ },
22
+ "peerDependencies": {
23
+ "vite": ">=5.0.0"
24
+ },
25
+ "peerDependenciesMeta": {
26
+ "vite": {
27
+ "optional": true
28
+ }
21
29
  },
22
30
  "devDependencies": {
23
31
  "@swc/core": "^1.7.28",
24
32
  "@types/node": "^24.5.2",
25
33
  "tsup": "^8.5.0",
26
34
  "typescript": "^5.9.2",
35
+ "vite": "^6.3.5",
27
36
  "vitest": "^3.2.4"
28
37
  },
29
38
  "publishConfig": {