@ dotenvx/ 原始内容
官方节点j的实施情况 dotenvx 原始语。 。 。 .
它提供dotenv解析,扩展,命令评价,sep256k1 ECIES 加密和解密、密钥环、扫描、匹配、密封检测和 dotenv 源代码更新.
安装
npm install @dotenvx/primitives
创建一个 .env 文件 :
HELLO=World
加密它 :
$ dotenvx encrypt
阅读和解析 index.cjs,然后打印每个密钥和值:
// index.cjs
const fs = require('node:fs')
const { parseSync } = require('@dotenvx/primitives')
const path = '.env'
const src = fs.readFileSync(path, 'utf8')
const parsed = parseSync(src)
for (const [key, value] of Object.entries(parsed.parsed)) {
console.log(`${key}=${value}`)
}
那就运行它.
$ node index.cjs
HELLO=World
API 密码
一个Dotenvxfile来源为不同阶段生成两种政策:
| 生成 | 校验 | 每把钥匙的规则 | 提供给检查器的值 |
|---|---|---|---|
policy | check | env 财务报告和审定财务报表 stdout | 最终解决的环境字符串 |
storagepolicy | storagecheck | storage 仅限 | 解密前原已存储的字符串 |
这两个政策发电机都具有记忆力。 呼叫者提供源文本和 值;这些原始人不读取文件,也不装入 shell 环境.
| 节点.js | 目的 |
|---|---|
check | 对照最终环境值检查已编译的 Dotenvxfile 策略 |
decrypt | 解密加密的 dotenvx 值 |
derive | 从私人密钥中获取压缩的公钥 |
encrypt | 加密公钥的值 |
encrypted | 探测到 encrypted: 前缀 |
evaluate | 评价 $(command) 替换 |
expand | 扩展环境可变表达式 |
keypair | 生成或还原 sip256k1 键盘 |
keyring | 绘制公用至私用密钥地图 |
keyringSync | 同步构建密钥环 |
match | 创建按键模式匹配器 |
parse | 解析、扩展、解密和分类 dotenv 字符串 |
parseSync | 解析多腾v 字符串同步 |
parsearrays | 保存重复任务时分析 dotenv 值 |
parsearraysSync | 解析 dotenv 阵列同步 |
parsedotenvxfile | 从 Dotenvx 文件源返回空字符串值的已声明密钥 |
parsedotenvxfileSync | 以空字符串值同步返回已声明的密钥 |
policy | 将 Dotenvx 文件文本或缓冲输入已解决的政策对象 |
profile | 从 Dotenvx 文件配置和呼叫器输入中选择一个以逗号分隔的文件列表 |
publickeys | 提取 dotenv 公钥元数据 |
redact | 以已编辑的标记来替换秘密字符串 |
remove | 按密钥删除 dotenv 任务 |
scan | 扫描 dotenv 任务、 复制和评论 |
sealed | 检查值是加密、空白还是秘密引用 |
storagecheck | 根据存储策略验证原始存储字符串 |
storagepolicy | 从 Dotenvxfile 源代码编译一个文件的存储规则 |
upsert | 插入或替换 dotenv 任务 |
check(policy, env)
验证最后的环境对象 env 返回时 { checked, errors }返回的数值
遵循他们命名的校正规则,回到 keys["*"].stdout.redacted
未申报的密钥; 输入不变。 也使用已应用的未申报密钥
通配符环境验证规则和诊断严格性。 失踪
未申报的密钥不产生诊断. 错误包括:
键,代码,规则,消息,和严格的旗帜.
check(policy('redacted true\nenv "TOKEN"'), { TOKEN: 'abc123' })
// { checked: { TOKEN: '[REDACTED]' }, errors: [] }
decrypt
解密一个 encrypted: 使用六进制编码的私钥值。 纯值
不变地返回.
const { decrypt, encrypt, keypair } = require('@dotenvx/primitives')
const { privateKey, publicKey } = keypair()
const encryptedValue = encrypt(publicKey, 'World')
const plaintext = decrypt(privateKey, encryptedValue)
console.log(plaintext)
// World
错误会显示稳定的 dotenvx 代码 :
const { decrypt } = require('@dotenvx/primitives')
try {
decrypt('', 'encrypted:abc123')
} catch (error) {
console.log(error.code)
// MISSING_PRIVATE_KEY
}
过 { prefix: false } 作为解密基数64的第三个参数
不包括 encrypted: 前缀.
derive
为私钥衍生压缩的 secp256k1 公钥.
const { derive, keypair } = require('@dotenvx/primitives')
const { privateKey, publicKey } = keypair()
console.log(derive(privateKey) === publicKey)
// true
encrypt
使用 dotenvx 兼容的 ECIES 加密 UTF-8 值并返回一个
encrypted:- 预设值.
const { encrypt, keypair } = require('@dotenvx/primitives')
const { publicKey } = keypair()
const encryptedValue = encrypt(publicKey, 'World')
console.log(encryptedValue.startsWith('encrypted:'))
// true
加密是随机的,所以两次加密相同的值 不同的密码.
encrypted
检查一个数值是否从大小写敏感开始 encrypted: 前缀.
前缀也可作为 encrypted.PREFIX。 。 。 .
const { encrypted } = require('@dotenvx/primitives')
console.log(encrypted.PREFIX)
// encrypted:
console.log(encrypted('encrypted:abc123'))
// true
console.log(encrypted('World'))
// false
evaluate
评估 shell 命令替换并删除后面的新行 命令输出。 下面的例子使用 POSIX shell 命令.
const { evaluate } = require('@dotenvx/primitives')
const value = evaluate('HELLO=$(printf World)', {})
console.log(value)
// HELLO=World
使用 {} 默认 :
| 选项 | 默认 | 目的 |
|---|---|---|
processEnv | process.env | 提供给命令的环境值 |
runningParsed | {} | 先前解析的值; 覆盖 processEnv 对于命令 |
错误命令丢出代码错误 COMMAND_SUBSTITUTION_FAILED。 。 。 .
expand
扩展 $NAME, (中文(简体) ), ${NAME},默认值表达式,和替代值
表达.
const { expand } = require('@dotenvx/primitives')
const value = expand('postgres://${USER}:$PASS@localhost', {
processEnv: { USER: 'scott', PASS: 'secret' }
})
console.log(value)
// postgres://scott:secret@localhost
支持的运算符 :
${NAME:-fallback}在缺少或空时使用倒数.${NAME-fallback}缺少时使用倒计时.${NAME:+alternate}使用当前和非空的相交点.${NAME+alternate}使用在场时的替代.
使用 {} 默认 :
| 选项 | 默认 | 目的 |
|---|---|---|
processEnv | process.env | 现有环境价值 |
runningParsed | {} | 逐渐解析的数值 |
overload | false | 给 runningParsed 优先于 processEnv |
literals | {} | 不应再扩展表达式的字面价值 |
injectsummary
injectsummary(count, files = []) 共享注入格式
不记录、检查环境值或添加ANSI颜色.
呼叫者决定何时何地打印,并应用自己的静默设置.
const { injectsummary } = require('@dotenvx/primitives')
injectsummary(2, ['.env']) // ⟐ injected env (2) from .env
文件也可能是公共元数据对象 filepath, (中文(简体) ), publicKeys,以及
keySources (公用钥匙 ) 这包括简短的代码和
独有的监护标签,例如:
injectsummary(3, [{
filepath: '.env',
publicKeys: ['031f20abc'],
keySources: { '031f20abc': 'armor' }
}]) // ⟐ injected env (3) from .env (031 F20) via Armor ⛨
injectsummary.sources(files) 返回时 { files, suffix } 用于其他命令
摘要,因此加密和解密使用相同的标签和短码.
只通过公共元数据,从不通过私钥或环境值.
keypair
生成新密钥派或从已有的私钥中恢复密钥.
const { keypair } = require('@dotenvx/primitives')
const generated = keypair()
const restored = keypair(generated.privateKey)
console.log(generated.publicKey === restored.publicKey)
// true
返回对象包含 privateKey 财务报告和审定财务报表 publicKey 螺旋绳.
keyring
构建一个按键为公钥且其值为匹配的对象 私钥.
const { keyring, keypair } = require('@dotenvx/primitives')
const { privateKey, publicKey } = keypair()
const ring = await keyring({
processEnv: { DOTENV_PRIVATE_KEY: privateKey }
})
console.log(ring[publicKey] === privateKey)
// true
默认, keyring() 读取 .env.keys 从当前工作目录中
键 process.env。缺少或无法读取的密钥文件无声
被忽略 。 设定 fk 以覆盖路径,或 [] 以禁用文件读取.
| 选项 | 默认 | 目的 |
|---|---|---|
processEnv | process.env | 环境包含 DOTENV_PRIVATE_KEY* 财务报告和审定财务报表 DOTENV_PUBLIC_KEY* 条目 |
ring | {} | 现有公用至私用钥匙物体,已安装 |
fk | '.env.keys' | 密钥文件路径或一系列路径 |
provider | 无 | 函数在私钥缺失时使用公钥调用; 返回密钥环对象或对密钥的承诺 |
密钥文件中的私钥任务可以重复或逗号分隔. 无效的私钥被忽略 。 没有匹配的私钥的公钥 在环中保留空值.
keyringSync
与相同的选项同步构建密钥环。 提供 provider
必须同步返回对象.
const { keyringSync, keypair } = require('@dotenvx/primitives')
const { privateKey, publicKey } = keypair()
const ring = keyringSync({ processEnv: { DOTENV_PRIVATE_KEY: privateKey } })
console.log(ring[publicKey] === privateKey)
// true
也可用 keyring.sync(options)。 。 。 .
match
创建支持 glob 模式的匹配者, 包括 * 财务报告和审定财务报表 ?附加时
忽略图案。 用途 picomatch 模式和选项.
const { match } = require('@dotenvx/primitives')
const isAllowed = match(['DOTENV_*'], { ignore: ['DOTENV_PRIVATE_*'] })
console.log(isAllowed('DOTENV_PUBLIC_KEY'))
// true
console.log(isAllowed('DOTENV_PRIVATE_KEY'))
// false
parse
应用扩展、 超载优先级、 有选择 解密,并注射与已存在的分类.
const { parse } = require('@dotenvx/primitives')
const result = await parse('A=file\nB=$A\nHELLO=World', { processEnv: {} })
console.log(result.parsed.B)
// file
for (const [key, value] of Object.entries(result.parsed)) {
console.log(`${key}=${value}`)
}
parse() 自动调用 keyring()读取 .env.keys 从当前
默认工作目录。 缺少或无法读取的密钥文件无声
被忽略 。 覆盖 fk 以使用其他路径,或提供 [] 以禁用文件读取.
呼叫者仍然提供 Dotenv 源字符串; parse() 不读
.env 或将返回的值写入 process.env。 。 。 .
| 选项 | 默认 | 目的 |
|---|---|---|
processEnv | process.env | 优先、扩展和关键发现的现有环境价值 |
overload | false | 让源值凌驾于已存在的环境值 |
ik | 所有密钥 | 要解密的密钥模式或一系列模式 |
ek | 无除外情形 | 从解密中排除的关键模式或类型 |
fk | '.env.keys' | 密钥文件路径或一系列路径 |
provider | 无 | 解析缺失的私钥; 与 keyring() |
排斥模式胜过包容模式。 这些模式控制 解密; 排除的密钥仍保留在解析输出中 .
结果包括:
| 外地 | 目录 |
|---|---|
parsed | 所有解析的密钥/ 值对 |
injected | 分类为注射的值,包括已解密的已存在的密码文本 |
existed | 从所提供的环境中保存的价值 |
errors | 解析/解析出错对象 code 财务报告和审定财务报表 message |
所有三个对象中的值都是字符串. 重复的密钥保留最后的
加工价值。 检查 errors 用于未解密的加密值。 例外
关键提供者可以拒绝承诺.
parseSync
Parses dotenv source与相同的选项和结果形状同步.
提供 provider 必须是同步的.
const { parseSync } = require('@dotenvx/primitives')
const result = parseSync('HELLO=World', { processEnv: {} })
console.log(result.parsed.HELLO)
// World
也可用 parse.sync(source, options)。 。 。 .
parsearrays
使用 parsearrays(source, options) 以数组保存重复的任务.
它接受的选项与 parse()。所有三个对象(parsed, (中文(简体) ),
injected,以及 existed)包含数组,甚至对于一个单一任务的密钥也是如此.
parse() 保留最后一个值.
const { parsearrays } = require('@dotenvx/primitives')
const result = await parsearrays('HELLO=World\nHELLO=Node', { processEnv: {} })
console.log(result.parsed.HELLO)
// ['World', 'Node']
两种功能都自动建立密钥环并共享扩展,解密, 和优先行为。 排斥模式胜过包容模式.
迁移:替换 parse(source, { array: true }) 与 parsearrays(source)。 。 。 .
删除 array 从选项; 它不再改变输出类型.
parsearraysSync
解析数组与相同选项和结果形状同步
parsearrays()提供 provider 必须是同步的.
const { parsearraysSync } = require('@dotenvx/primitives')
const result = parsearraysSync('HELLO=World\nHELLO=Node', { processEnv: {} })
console.log(result.parsed.HELLO)
// ['World', 'Node']
也可用 parsearrays.sync(source, options)。 。 。 .
parsedotenvxfile(source, file = '.env')
同时可用 parsedotenvxfile.sync(source, file) 或者说
parsedotenvxfileSync(source, file)。 。 。 .
返回选定文件的空字符串值的已声明密钥.
await parsedotenvxfile('env "PORT"\nenv "TOKEN"')
// { PORT: '', TOKEN: '' }
policy(source, file = '.env')
编译 Dotenvx 文件文本或缓冲 { keys: { ... } }。每个键都有
env 审定规则和 stdout 编辑规则。 存储设置被省略 .
对于逗号分隔的文件名,第一个文件会赢得明确的规则. 汇编
在内存中工作;呼叫者读取文件并加载环境值.
const rules = policy('env "TOKEN", required: true, redacted: true')
// rules.keys.TOKEN:
// { env: { type: 'string', required: true, strict: false },
// stdout: { redacted: true } }
保留 keys["*"] 条目包含未申报密钥的默认值.
同一来源可以产生两种政策:
const source = 'storage "encrypted"\nenv "TOKEN", required: true, redacted: true'
const envRules = policy(source, '.env.production')
const storageRules = storagepolicy(source, '.env.production')
check(envRules, { TOKEN: 'resolved-secret' })
// { checked: { TOKEN: '[REDACTED]' }, errors: [] }
storagecheck(storageRules, { TOKEN: ['encrypted:example'] })
// { checked: { TOKEN: ['encrypted:example'] }, errors: [] }
storagepolicy(source, file = '.env')
为一个文件名编译同一个源 。 每个密钥只包含
storage 规则 : type (单位:千美元)any, (中文(简体) ), encrypted,或 plaintext, (中文(简体) ), required,以及
strict默认类型到 any。按规定严格遵循
决 议 policy: 每键覆盖, 所选文件设置, 根设置,
然后是虚假的.
此政策没有固定/重排设置 .
const rules = storagepolicy('storage "encrypted"\nenv "PORT", storage: "plaintext"', '.env.production')
storagecheck(rules, { PORT: ['3000'], TOKEN: ['encrypted:example'] })
将原始存储字符串传递到 storagecheck,在解密之前。 加密检查
承认 encrypted: 前缀;它们不认证密码文本.
storagecheck(policy, scanned)
检查原始存储字符串与 storagepolicy 规则和返回
checked 财务报告和审定财务报表 errors。不应用 Stdout 编辑。 使用 check 与
policy 用于解决的环境验证和编辑.
profile(source, options = {})
将 Dotenvx 文件配置文件解析为逗号分隔文件名 。 接受 f, (中文(简体) ), profile, (中文(简体) ),
processEnv,以及 environmentKeys 选项. processEnv 默认为 process.env· ;
通过 {} 忽略进程环境。 明确文件胜过配置名称;
使用开发配置文件或 .env。 。 。 .
profile('profile "production", files: [".env.production"]', { profile: 'production' })
// '.env.production'
publickeys
提取每个 DOTENV_PUBLIC_KEY* 任务时
保存密钥顺序.
const { publickeys } = require('@dotenvx/primitives')
const keys = publickeys('DOTENV_PUBLIC_KEY=public-a\nDOTENV_PUBLIC_KEY_PRODUCTION=public-b')
console.log(keys)
// ['public-a', 'public-b']
redact(text, secrets)
将字面上的秘密字符串替换为 [REDACTED],包括重叠匹配.
redact('token=abc123', ['abc123']) // 'token=[REDACTED]'
remove
删除给定密钥的每一项任务。 它保存周围的线路, 注释,其他密钥的多行值,以及 CRLF 线尾. 如果钥匙 缺少,源代码不变.
const { remove } = require('@dotenvx/primitives')
const updated = remove('HELLO=one\nFOO=bar\nHELLO=two\n', 'HELLO')
console.log(updated === 'FOO=bar\n')
// true
scan
扫描 dotenv 任务而不应用扩展或解密. 复制 值及其注释按源顺序保存.
const { scan } = require('@dotenvx/primitives')
const result = scan('HELLO=first\nHELLO=second # optional')
console.log(result.scanned.HELLO)
// ['first', 'second']
console.log(result.comments.HELLO)
// [undefined, 'optional']
| 选项 | 默认 | 目的 |
|---|---|---|
ik | 所有密钥 | 要包括的密钥模式或一系列模式 |
ek | 无除外情形 | 要排除的关键模式或类型 |
expandDoubleQuotedNewlines | true | 解码逃出的新行、车厢返回和双引号的标签 |
convertWindowsNewlines | true | 将 CRLF 和 CR 线的终点规范为 LF |
可选变换接收 { name, value, quote, comment } 每个
任务。 它的返回值被存储在相应的数组中 :
const { scan } = require('@dotenvx/primitives')
const result = scan('HELLO=World', ({ value }) => value.toUpperCase())
console.log(result.scanned.HELLO)
// ['WORLD']
如果有选项, 将变换作为第三个参数 :
scan(source, options, transform)。 。 。 .
sealed(src, storagePolicy?)
回返 true 当每个非元数据值都是加密的,只有空或白空,
或者从 op:// (1个口活字)或 bw:// (Bitwarden 密码管理器).
DOTENV_PUBLIC_KEY* 财务报告和审定财务报表 *_PLAIN 值被允许为正文.
空源被视为被封. 检查每个重复的任务 .
可选解决 storagepolicy() 允许纯文本密钥。 明确 encrypted
规则高于 _PLAIN 后缀; any 使用后缀会议。 现有
即使政策允许简单文字,密码文本仍然被接受.
秘密引用以其对大小写敏感的前缀识别;它们不是
解决或鉴定了供应商。 其他URL、可变参考文献和
命令替换不例外.
const { sealed } = require('@dotenvx/primitives')
console.log(sealed('HELLO=encrypted:abc123'))
// true
console.log(sealed('HELLO=World'))
// false
upsert
插入缺失的任务或替换现有密钥的所有出错. 它保留了现有的引号样式,导出前缀,多行值,以及 CRLF行终.
const { upsert } = require('@dotenvx/primitives')
const updated = upsert('HELLO=one\nHELLO=two', 'HELLO', ['uno', 'dos'])
console.log(updated)
// HELLO=uno
// HELLO=dos
字符串替换适用于每次发生。 对于偶发性变化, 提供一个阵列,每个现有任务有一个替换。 为了新的 键,提供字符串;插入的任务为双引出.
兼容性
采用私人节点Js兼容性测试,对实施情况进行测试.
这个 粗略执行 提供相应的原始
含有 Rust-inative 类型和命名,包括 policy, (中文(简体) ), storagepolicy, (中文(简体) ), profile, (中文(简体) ), check,以及
redact 带有相同的 Dotenvx 文件默认和优先规则.
出版
从此目录手动发布 。 保持npm 和 Rust 状态 版本匹配, 如下 发展.md,然后运行 :
npm run standard
npm run build
npm pack --dry-run
npm publish
第三方通知
此包件将下列麻省理工学院许可包件的一部分捆绑起来:
eciesjs@ecies/ciphers@noble/curves@noble/hashes@noble/ciphers
关系
MIT 许可证
版权(c) 2019-2026 李伟良
特此免费准许任何人获得副本 ,用于处理 在软件中不受限制,包括不受限制的权利 使用、复制、修改、合并、出版、分发、分许可证和/或出售 软件的复制件,并允许该软件所针对的人 满足下列条件:
上述版权通知和这项许可通知应载入所有 软件的复制件或大部分.
软件是提供的"AS IS", 没有任何的恐惧, EXPRESS OR ,包括但不限制于雇佣军的保障, 特别目的和非目的的证明。 绝对不会 B. 任何索赔、索赔或其他索赔的索赔人或 责任,在契约、契约或其他行为中,产生于, 财产、财产、财产、财产、财产或财产 软件.
@ecies/密码
MIT 许可证
版权(c) 2019-2026 李伟良
特此免费准许任何人获得副本 ,用于处理 在软件中不受限制,包括不受限制的权利 使用、复制、修改、合并、出版、分发、分许可证和/或出售 软件的复制件,并允许该软件所针对的人 满足下列条件:
上述版权通知和这项许可通知应载入所有 软件的复制件或大部分.
软件是提供的"AS IS", 没有任何的恐惧, EXPRESS OR ,包括但不限制于雇佣军的保障, 特别目的和非目的的证明。 绝对不会 B. 任何索赔、索赔或其他索赔的索赔人或 责任,在契约、契约或其他行为中,产生于, 财产、财产、财产、财产、财产或财产 软件.
@noble/曲线和 @noble/hashes
《麻省理工学院许可证》
版权 (c) 2022 保罗·米勒(英语:https://paulmiller.com (中文(简体) )(中文(简体) )
特此免费准许任何人获得副本 软件和相关文档文件(“软件”),处理 在软件中不受限制,包括不受限制的权利 使用、复制、修改、合并、出版、分发、分许可证和/或出售 软件的复制件,并允许该软件所针对的人 满足下列条件:
上述版权通知和本许可通知应列入 软件的所有副本或大部分.
软件是提供的 " AS IS " ,没有任何形式的恐惧、排斥或 ,包括但不限制于雇佣军的保障, 特别目的和非目的的证明。 绝对不会 B. 任何索赔、索赔或其他索赔的索赔人或 责任,在契约、契约或其他行为中,产生于, 或与溶剂或溶剂的使用或 软件.
@ noble/ 密码
《麻省理工学院许可证》
版权 (c) 2022 保罗·米勒(英语:https://paulmiller.com (中文(简体) )(中文(简体) ) 版权 (c) 2016 托马斯·波宁 色情制品@bolet.org
特此免费准许任何人获得副本 软件和相关文档文件(“软件”),处理 在软件中不受限制,包括不受限制的权利 使用、复制、修改、合并、出版、分发、分许可证和/或出售 软件的复制件,并允许该软件所针对的人 满足下列条件:
上述版权通知和本许可通知应列入 软件的所有副本或大部分.
软件是提供的 " AS IS " ,没有任何形式的恐惧、排斥或 ,包括但不限制于雇佣军的保障, 特别目的和非目的的证明。 绝对不会 B. 任何索赔、索赔或其他索赔的索赔人或 责任,在契约、契约或其他行为中,产生于, 或与溶剂或溶剂的使用或 软件.