@zh-moody/safe-env 0.1.16 → 0.2.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 +13 -2
- package/dist/index.cjs +3 -3
- package/dist/index.d.cts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +3 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -91,13 +91,24 @@ export default dbConfig;
|
|
|
91
91
|
#### 1. 定义字段 (`s.xxx`)
|
|
92
92
|
- `s.string(default?)`: 字符串。若无默认值则必填。
|
|
93
93
|
- `s.number(default?)`: 数字。自动将字符串转为 `number`。
|
|
94
|
-
- `s.boolean(default?)`:
|
|
94
|
+
- `s.boolean(default?)`: 布尔型。支持将 `"true"`, `"1"`, `"yes"`, `"on"` 解析为 `true`(大小写无关)。
|
|
95
|
+
- `s.array(default?, separator?)`: 数组型。支持将字符串按分隔符(默认 `,`)拆分为数组。
|
|
96
|
+
- 示例:`s.array([], '|')`
|
|
95
97
|
- `s.enum(options, default?)`: 枚举。值必须在数组中。
|
|
96
98
|
- 示例:`s.enum(['dev', 'prod'], 'dev')`
|
|
97
99
|
|
|
98
|
-
#### 2.
|
|
100
|
+
#### 2. 数据处理与增强 (链式调用)
|
|
99
101
|
每个通过 `s` 定义的字段都可以调用以下方法进行增强:
|
|
100
102
|
|
|
103
|
+
- **`.transform(fn)`**: **[New]** 自定义数据转换,支持链式调用。
|
|
104
|
+
```typescript
|
|
105
|
+
// 示例 1: 将字符串转大写
|
|
106
|
+
KEY: s.string().transform(v => v.toUpperCase())
|
|
107
|
+
|
|
108
|
+
// 示例 2: 将逗号分隔的数字字符串转为数字数组
|
|
109
|
+
SCORES: s.array().transform(arr => arr.map(Number))
|
|
110
|
+
```
|
|
111
|
+
|
|
101
112
|
- **`.from(key)`**: 指定环境变量名。
|
|
102
113
|
```typescript
|
|
103
114
|
// 即使变量叫 VITE_PATH,代码里也可以叫 port
|
package/dist/index.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunk5ZP5OWCLcjs = require('./chunk-5ZP5OWCL.cjs');function
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunk5ZP5OWCLcjs = require('./chunk-5ZP5OWCL.cjs');function m(n,e,r,i=[]){return{type:n,default:e,required:e===void 0,parse:r,metadata:i.length?{options:i}:{},from(o){return this.sourceKey=o,this},validate(o,f="Custom validation failed"){return this.metadata={...this.metadata,validate:{fn:o,message:f}},this},min(o){return this.metadata={...this.metadata,min:o},this},max(o){return this.metadata={...this.metadata,max:o},this},transform(o){let f=this.parse;return this.parse=u=>o(f(u)),this}}}var g={string:n=>m("string",n,e=>String(e)),number:n=>m("number",n,e=>{let r=Number(e);if(isNaN(r))throw new Error(`Invalid number: ${e}`);return r}),boolean:n=>m("boolean",n,e=>{if(typeof e=="boolean")return e;let r=String(e).toLowerCase();return r==="true"||r==="1"||r==="yes"||r==="on"}),enum:(n,e)=>m("enum",e,r=>{if(!n.includes(r))throw new Error(`Value "${r}" is not one of: ${n.join(", ")}`);return r},n),array:(n,e=",")=>m("array",n,r=>Array.isArray(r)?r:typeof r!="string"?[]:r.split(e).map(i=>i.trim()).filter(Boolean))};function $(n){let e={r:"\x1B[31m",g:"\x1B[32m",y:"\x1B[33m",b:"\x1B[1m",res:"\x1B[0m",d:"\x1B[2m"};console.error(`
|
|
2
2
|
${e.r}${e.b}\u274C SafeEnv Error${e.res}
|
|
3
|
-
${e.d}${"".padEnd(40,"-")}${e.res}`),
|
|
3
|
+
${e.d}${"".padEnd(40,"-")}${e.res}`),n.forEach(r=>{let i=r.value===void 0?"undefined":`"${r.value}"`;console.error(`${e.y}${r.key}${e.res} ${e.r}${r.error}${e.res} ${e.d}${i}${e.res}`)}),console.error(`${e.d}${"".padEnd(40,"-")}${e.res}
|
|
4
4
|
${e.g}\u{1F4A1} Check your .env files.${e.res}
|
|
5
|
-
`)}function D(
|
|
5
|
+
`)}function D(n,e={}){let{loadProcessEnv:r=!0,source:i,prefix:c=""}=e,o;if(i)o=i;else{let a=e.mode||(typeof process<"u"?process.env.NODE_ENV:"development"),s=[".env",".env.local",`.env.${a}`,`.env.${a}.local`],l={};for(let d of s)l={...l,..._chunk5ZP5OWCLcjs.b.call(void 0, d)};o={...l,...r&&typeof process<"u"?process.env:{}}}let f={},u=[];for(let a in n){let s=n[a],l=s.sourceKey||(o[c+a]!==void 0?c+a:a),d=o[l];try{let t;if(d===void 0||d===""&&s.default!==void 0){if(s.required&&d===void 0)throw new Error("Required field missing");t=s.default}else t=s.parse(d);if(t!==void 0&&s.metadata){let{min:p,max:y,validate:E}=s.metadata;if(typeof t=="number"){if(p!==void 0&&t<p)throw new Error(`Below min ${p}`);if(y!==void 0&&t>y)throw new Error(`Above max ${y}`)}if(E&&!E.fn(t))throw new Error(E.message)}f[a]=t}catch(t){u.push({key:l,error:t.message,value:d})}}if(u.length>0)if($(u),typeof process<"u"&&!!process.exit&&!i)process.exit(1);else throw new Error("SafeEnv: Configuration validation failed.");return f}exports.loadDotEnv = _chunk5ZP5OWCLcjs.b; exports.parseDotEnv = _chunk5ZP5OWCLcjs.a; exports.reportErrors = $; exports.s = g; exports.safeEnv = D;
|
package/dist/index.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { loadDotEnv } from './fs-node.cjs';
|
|
2
2
|
|
|
3
|
-
type BaseType = "string" | "number" | "boolean" | "enum";
|
|
3
|
+
type BaseType = "string" | "number" | "boolean" | "enum" | "array";
|
|
4
4
|
interface FieldDefinition<T = any> {
|
|
5
5
|
type: BaseType;
|
|
6
6
|
default?: T;
|
|
@@ -20,6 +20,7 @@ interface FieldDefinition<T = any> {
|
|
|
20
20
|
validate: (fn: (val: T) => boolean, message?: string) => FieldDefinition<T>;
|
|
21
21
|
min: (val: number) => FieldDefinition<T>;
|
|
22
22
|
max: (val: number) => FieldDefinition<T>;
|
|
23
|
+
transform: <U>(fn: (val: T) => U) => FieldDefinition<U>;
|
|
23
24
|
}
|
|
24
25
|
type Schema = Record<string, FieldDefinition>;
|
|
25
26
|
interface EnvError {
|
|
@@ -36,6 +37,7 @@ declare const s: {
|
|
|
36
37
|
number: (defaultValue?: number) => FieldDefinition<number>;
|
|
37
38
|
boolean: (defaultValue?: boolean) => FieldDefinition<boolean>;
|
|
38
39
|
enum: <T extends string>(options: T[], defaultValue?: T) => FieldDefinition<T>;
|
|
40
|
+
array: (defaultValue?: string[], separator?: string) => FieldDefinition<string[]>;
|
|
39
41
|
};
|
|
40
42
|
|
|
41
43
|
interface SafeEnvOptions {
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { loadDotEnv } from './fs-node.js';
|
|
2
2
|
|
|
3
|
-
type BaseType = "string" | "number" | "boolean" | "enum";
|
|
3
|
+
type BaseType = "string" | "number" | "boolean" | "enum" | "array";
|
|
4
4
|
interface FieldDefinition<T = any> {
|
|
5
5
|
type: BaseType;
|
|
6
6
|
default?: T;
|
|
@@ -20,6 +20,7 @@ interface FieldDefinition<T = any> {
|
|
|
20
20
|
validate: (fn: (val: T) => boolean, message?: string) => FieldDefinition<T>;
|
|
21
21
|
min: (val: number) => FieldDefinition<T>;
|
|
22
22
|
max: (val: number) => FieldDefinition<T>;
|
|
23
|
+
transform: <U>(fn: (val: T) => U) => FieldDefinition<U>;
|
|
23
24
|
}
|
|
24
25
|
type Schema = Record<string, FieldDefinition>;
|
|
25
26
|
interface EnvError {
|
|
@@ -36,6 +37,7 @@ declare const s: {
|
|
|
36
37
|
number: (defaultValue?: number) => FieldDefinition<number>;
|
|
37
38
|
boolean: (defaultValue?: boolean) => FieldDefinition<boolean>;
|
|
38
39
|
enum: <T extends string>(options: T[], defaultValue?: T) => FieldDefinition<T>;
|
|
40
|
+
array: (defaultValue?: string[], separator?: string) => FieldDefinition<string[]>;
|
|
39
41
|
};
|
|
40
42
|
|
|
41
43
|
interface SafeEnvOptions {
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{a as b,b as
|
|
1
|
+
import{a as b,b as h}from"./chunk-BEFKPDEA.js";function m(n,e,r,i=[]){return{type:n,default:e,required:e===void 0,parse:r,metadata:i.length?{options:i}:{},from(o){return this.sourceKey=o,this},validate(o,f="Custom validation failed"){return this.metadata={...this.metadata,validate:{fn:o,message:f}},this},min(o){return this.metadata={...this.metadata,min:o},this},max(o){return this.metadata={...this.metadata,max:o},this},transform(o){let f=this.parse;return this.parse=u=>o(f(u)),this}}}var g={string:n=>m("string",n,e=>String(e)),number:n=>m("number",n,e=>{let r=Number(e);if(isNaN(r))throw new Error(`Invalid number: ${e}`);return r}),boolean:n=>m("boolean",n,e=>{if(typeof e=="boolean")return e;let r=String(e).toLowerCase();return r==="true"||r==="1"||r==="yes"||r==="on"}),enum:(n,e)=>m("enum",e,r=>{if(!n.includes(r))throw new Error(`Value "${r}" is not one of: ${n.join(", ")}`);return r},n),array:(n,e=",")=>m("array",n,r=>Array.isArray(r)?r:typeof r!="string"?[]:r.split(e).map(i=>i.trim()).filter(Boolean))};function $(n){let e={r:"\x1B[31m",g:"\x1B[32m",y:"\x1B[33m",b:"\x1B[1m",res:"\x1B[0m",d:"\x1B[2m"};console.error(`
|
|
2
2
|
${e.r}${e.b}\u274C SafeEnv Error${e.res}
|
|
3
|
-
${e.d}${"".padEnd(40,"-")}${e.res}`),
|
|
3
|
+
${e.d}${"".padEnd(40,"-")}${e.res}`),n.forEach(r=>{let i=r.value===void 0?"undefined":`"${r.value}"`;console.error(`${e.y}${r.key}${e.res} ${e.r}${r.error}${e.res} ${e.d}${i}${e.res}`)}),console.error(`${e.d}${"".padEnd(40,"-")}${e.res}
|
|
4
4
|
${e.g}\u{1F4A1} Check your .env files.${e.res}
|
|
5
|
-
`)}function D(
|
|
5
|
+
`)}function D(n,e={}){let{loadProcessEnv:r=!0,source:i,prefix:c=""}=e,o;if(i)o=i;else{let a=e.mode||(typeof process<"u"?process.env.NODE_ENV:"development"),s=[".env",".env.local",`.env.${a}`,`.env.${a}.local`],l={};for(let d of s)l={...l,...h(d)};o={...l,...r&&typeof process<"u"?process.env:{}}}let f={},u=[];for(let a in n){let s=n[a],l=s.sourceKey||(o[c+a]!==void 0?c+a:a),d=o[l];try{let t;if(d===void 0||d===""&&s.default!==void 0){if(s.required&&d===void 0)throw new Error("Required field missing");t=s.default}else t=s.parse(d);if(t!==void 0&&s.metadata){let{min:p,max:y,validate:E}=s.metadata;if(typeof t=="number"){if(p!==void 0&&t<p)throw new Error(`Below min ${p}`);if(y!==void 0&&t>y)throw new Error(`Above max ${y}`)}if(E&&!E.fn(t))throw new Error(E.message)}f[a]=t}catch(t){u.push({key:l,error:t.message,value:d})}}if(u.length>0)if($(u),typeof process<"u"&&!!process.exit&&!i)process.exit(1);else throw new Error("SafeEnv: Configuration validation failed.");return f}export{h as loadDotEnv,b as parseDotEnv,$ as reportErrors,g as s,D as safeEnv};
|