@stacksjs/env 0.70.261 → 0.70.263
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.js +1 -1
- package/dist/types.d.ts +2 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -21,6 +21,6 @@ ${Y}="${Q.privateKey}"
|
|
|
21
21
|
`);break;case"json":default:T=g.prettyPrint?JSON.stringify(G,null,2):JSON.stringify(G);break}return{success:!0,output:T}}catch($){return{success:!1,error:`Failed to get: ${$ instanceof Error?$.message:"Unknown error"}`}}}function m2(f,g={}){let B=g.cwd||process.cwd(),A=L(B,g.keysFile||".env.keys");if(!q(A))return{success:!1,error:`Keys file not found: ${A}`};try{let $=E(A,"utf-8"),{parsed:_}=M($),W=((g.file||".env").split("/").pop()||"").replace(/^\.env\./,"").replace(/^\.env$/,"").toUpperCase(),D=W?`DOTENV_PUBLIC_KEY_${W}`:"DOTENV_PUBLIC_KEY",O=W?`DOTENV_PRIVATE_KEY_${W}`:"DOTENV_PRIVATE_KEY";if(f){let T=_[f];if(!T)return{success:!1,error:`Key not found: ${f}`};return{success:!0,output:T}}let R={[D]:_[D],[O]:_[O]};return{success:!0,output:g.format==="shell"?`${D}=${R[D]} ${O}=${R[O]}`:JSON.stringify(R)}}catch($){return{success:!1,error:`Failed to get keypair: ${$ instanceof Error?$.message:"Unknown error"}`}}}function d2(f={}){let g=lf({file:f.file,keysFile:f.keysFile,stdout:!0,cwd:f.cwd});if(!g.success)return g;let B=f.cwd||process.cwd(),A=L(B,f.file||".env"),$=L(B,f.keysFile||".env.keys");if(g.output===void 0)return{success:!1,error:"Rotation produced no decrypted content"};let _=S(),X=E(A),H=E($),W=H.toString("utf8").split(`
|
|
22
22
|
`),D=f.file||".env",O=a(D).replace(/^\.env\./,"").replace(/^\.env$/,"").toUpperCase(),R=O?`DOTENV_PUBLIC_KEY_${O}`:"DOTENV_PUBLIC_KEY",G=O?`DOTENV_PRIVATE_KEY_${O}`:"DOTENV_PRIVATE_KEY",T=!1,Y=!1;for(let w=0;w<W.length;w++){let x=W[w];if(x===void 0)continue;if(x.startsWith(`${R}=`))W[w]=`${R}="${_.publicKey}"`,T=!0;else if(x.startsWith(`${G}=`))W[w]=`${G}="${_.privateKey}"`,Y=!0}if(!T)W.push(`${R}="${_.publicKey}"`);if(!Y)W.push(`${G}="${_.privateKey}"`);let Z=`${W.join(`
|
|
23
23
|
`).replace(/\n+$/,"")}
|
|
24
|
-
`,U=Jf(g.output,_.publicKey,R,f),Q=`${process.pid}-${Date.now()}`,I=L(Gf(A),`.${a(A)}.${Q}.rotate`),J=L(Gf($),`.${a($)}.${Q}.rotate`);try{if(z(I,U,{encoding:"utf8",mode:384}),z(J,Z,{encoding:"utf8",mode:384}),f.stdout)return s(J,$),{success:!0,output:U};s(I,A);try{s(J,$)}catch(w){throw z(A,X),w}return{success:!0,output:`\u2714 rotated (${f.file||".env"}) to encrypted:v2`}}catch(w){if(!q($))z($,H,{mode:384});return{success:!1,error:`Failed to rotate without exposing plaintext: ${w instanceof Error?w.message:"Unknown error"}`}}finally{jf(I,{force:!0}),jf(J,{force:!0})}}import j from"process";import{platform as sf}from"os";var Zf=typeof Bun<"u",Qf=typeof j<"u"&&j.versions?.node!==void 0,af=Zf?"bun":Qf?"node":"unknown",y2={name:af,version:Zf?Bun.version:Qf?j.version:void 0},ff=sf(),v2=ff==="win32",i2=ff==="darwin",n2=ff==="linux",If=Boolean(j.stdout?.isTTY),o2=typeof globalThis.window<"u",ef=Boolean(j.env.CI||j.env.CONTINUOUS_INTEGRATION||j.env.BUILD_NUMBER||j.env.RUN_ID),p2=Boolean(j.env.DEBUG||j.env.VERBOSE||j.argv.includes("--debug")||j.argv.includes("--verbose")),f2=ef||!If,l2=Boolean(!f2&&(If||j.env.COLORTERM||j.env.FORCE_COLOR||j.env.TERM&&j.env.TERM!=="dumb")),e={github:{name:"GitHub Actions",detected:Boolean(j.env.GITHUB_ACTIONS)},gitlab:{name:"GitLab CI",detected:Boolean(j.env.GITLAB_CI)},circle:{name:"CircleCI",detected:Boolean(j.env.CIRCLECI)},travis:{name:"Travis CI",detected:Boolean(j.env.TRAVIS)},jenkins:{name:"Jenkins",detected:Boolean(j.env.JENKINS_URL)},vercel:{name:"Vercel",detected:Boolean(j.env.VERCEL)},netlify:{name:"Netlify",detected:Boolean(j.env.NETLIFY)},heroku:{name:"Heroku",detected:Boolean(j.env.DYNO)},aws:{name:"AWS",detected:Boolean(j.env.AWS_REGION||j.env.AWS_LAMBDA_FUNCTION_NAME)},azure:{name:"Azure",detected:Boolean(j.env.AZURE_HTTP_USER_AGENT)},cloudflare:{name:"Cloudflare",detected:Boolean(j.env.CF_PAGES)},railway:{name:"Railway",detected:Boolean(j.env.RAILWAY_ENVIRONMENT)},render:{name:"Render",detected:Boolean(j.env.RENDER)}},g2=Object.keys(e).find((f)=>{let g=e[f];return g!==void 0&&g.detected})||"unknown",s2=e[g2]||{name:"Unknown",detected:!1};import $2 from"process";import{projectPath as A2}from"@stacksjs/path";import Lf from"fs";var wf={APP_ENV:["local","dev","development","staging","prod","production"],DB_CONNECTION:["mysql","sqlite","postgres","dynamodb"],DB_MIGRATE_FRESH:["allow","confirm","disabled"],MAIL_MAILER:["smtp","mailgun","ses","log","sendgrid","mailtrap","capture"],SEARCH_ENGINE_DRIVER:["opensearch","meilisearch","algolia","typesense"],FRONTEND_APP_ENV:["development","staging","production"]};function Uf(f){return`${f.replace(/[^a-z0-9]/gi,"").toUpperCase()}_`}function B2(f,g={}){let B=g.self?Uf(g.self):void 0,A=(g.tenants??[]).filter((X)=>typeof X==="string"&&X.trim().length>0).map((X)=>({slug:X,prefix:Uf(X)})).filter(({prefix:X})=>X!==B).sort((X,H)=>H.prefix.length-X.prefix.length),$={},_={};for(let[X,H]of Object.entries(f)){let W=A.find(({prefix:D})=>X.startsWith(D));if(W){(_[W.slug]??={})[X]=H;continue}$[X]=H}return{own:$,foreign:_}}function f5(f,g={}){return B2(f,g).own}function g5(f){return Object.entries(f.foreign).map(([g,B])=>({tenant:g,keys:Object.keys(B).sort()})).sort((g,B)=>g.tenant.localeCompare(B.tenant))}var Mf=new Set;function _2(f){if(Mf.has(f))return;Mf.add(f);let g=l();console.warn(`[env] warning: "${f}" is encrypted but no usable private key was found for the "${g}" environment; falling back to its default. Set DOTENV_PRIVATE_KEY_${g.toUpperCase()} or ship .env.keys.`)}var X2={get:(f,g)=>{let B=f[g];if(typeof B==="string"&&(B.startsWith("encrypted:")||B.startsWith("enc:"))){let $=Tf(B);if($===void 0){_2(g),delete f[g];return}f[g]=$,B=$}let A=["_PORT","_TIMEOUT","_TTL","_SIZE","_LIMIT","_MAX","_MIN","_INTERVAL","_RETRIES","_CONCURRENCY","_WORKERS","_CONNECTIONS"];if(typeof B==="string"&&/^\d+$/.test(B)&&!B.startsWith("0")&&A.some(($)=>g.endsWith($)))return Number(B);if(typeof B==="string"){let $=B.toLowerCase();if($==="true")return!0;if($==="false")return!1}return B}};function D2(){return typeof Bun<"u"?Bun.env:$2.env}var Ef=new Proxy(D2(),X2);function H5(f,g,B){let A=B?.path||A2(".env"),_=Lf.readFileSync(A,"utf-8").split(`
|
|
24
|
+
`,U=Jf(g.output,_.publicKey,R,f),Q=`${process.pid}-${Date.now()}`,I=L(Gf(A),`.${a(A)}.${Q}.rotate`),J=L(Gf($),`.${a($)}.${Q}.rotate`);try{if(z(I,U,{encoding:"utf8",mode:384}),z(J,Z,{encoding:"utf8",mode:384}),f.stdout)return s(J,$),{success:!0,output:U};s(I,A);try{s(J,$)}catch(w){throw z(A,X),w}return{success:!0,output:`\u2714 rotated (${f.file||".env"}) to encrypted:v2`}}catch(w){if(!q($))z($,H,{mode:384});return{success:!1,error:`Failed to rotate without exposing plaintext: ${w instanceof Error?w.message:"Unknown error"}`}}finally{jf(I,{force:!0}),jf(J,{force:!0})}}import j from"process";import{platform as sf}from"os";var Zf=typeof Bun<"u",Qf=typeof j<"u"&&j.versions?.node!==void 0,af=Zf?"bun":Qf?"node":"unknown",y2={name:af,version:Zf?Bun.version:Qf?j.version:void 0},ff=sf(),v2=ff==="win32",i2=ff==="darwin",n2=ff==="linux",If=Boolean(j.stdout?.isTTY),o2=typeof globalThis.window<"u",ef=Boolean(j.env.CI||j.env.CONTINUOUS_INTEGRATION||j.env.BUILD_NUMBER||j.env.RUN_ID),p2=Boolean(j.env.DEBUG||j.env.VERBOSE||j.argv.includes("--debug")||j.argv.includes("--verbose")),f2=ef||!If,l2=Boolean(!f2&&(If||j.env.COLORTERM||j.env.FORCE_COLOR||j.env.TERM&&j.env.TERM!=="dumb")),e={github:{name:"GitHub Actions",detected:Boolean(j.env.GITHUB_ACTIONS)},gitlab:{name:"GitLab CI",detected:Boolean(j.env.GITLAB_CI)},circle:{name:"CircleCI",detected:Boolean(j.env.CIRCLECI)},travis:{name:"Travis CI",detected:Boolean(j.env.TRAVIS)},jenkins:{name:"Jenkins",detected:Boolean(j.env.JENKINS_URL)},vercel:{name:"Vercel",detected:Boolean(j.env.VERCEL)},netlify:{name:"Netlify",detected:Boolean(j.env.NETLIFY)},heroku:{name:"Heroku",detected:Boolean(j.env.DYNO)},aws:{name:"AWS",detected:Boolean(j.env.AWS_REGION||j.env.AWS_LAMBDA_FUNCTION_NAME)},azure:{name:"Azure",detected:Boolean(j.env.AZURE_HTTP_USER_AGENT)},cloudflare:{name:"Cloudflare",detected:Boolean(j.env.CF_PAGES)},railway:{name:"Railway",detected:Boolean(j.env.RAILWAY_ENVIRONMENT)},render:{name:"Render",detected:Boolean(j.env.RENDER)}},g2=Object.keys(e).find((f)=>{let g=e[f];return g!==void 0&&g.detected})||"unknown",s2=e[g2]||{name:"Unknown",detected:!1};import $2 from"process";import{projectPath as A2}from"@stacksjs/path";import Lf from"fs";var wf={APP_ENV:["local","dev","development","staging","prod","production"],DB_CONNECTION:["mysql","sqlite","postgres","singlestore","vitess","dynamodb"],DB_MIGRATE_FRESH:["allow","confirm","disabled"],MAIL_MAILER:["smtp","mailgun","ses","log","sendgrid","mailtrap","capture"],SEARCH_ENGINE_DRIVER:["opensearch","meilisearch","algolia","typesense"],FRONTEND_APP_ENV:["development","staging","production"]};function Uf(f){return`${f.replace(/[^a-z0-9]/gi,"").toUpperCase()}_`}function B2(f,g={}){let B=g.self?Uf(g.self):void 0,A=(g.tenants??[]).filter((X)=>typeof X==="string"&&X.trim().length>0).map((X)=>({slug:X,prefix:Uf(X)})).filter(({prefix:X})=>X!==B).sort((X,H)=>H.prefix.length-X.prefix.length),$={},_={};for(let[X,H]of Object.entries(f)){let W=A.find(({prefix:D})=>X.startsWith(D));if(W){(_[W.slug]??={})[X]=H;continue}$[X]=H}return{own:$,foreign:_}}function f5(f,g={}){return B2(f,g).own}function g5(f){return Object.entries(f.foreign).map(([g,B])=>({tenant:g,keys:Object.keys(B).sort()})).sort((g,B)=>g.tenant.localeCompare(B.tenant))}var Mf=new Set;function _2(f){if(Mf.has(f))return;Mf.add(f);let g=l();console.warn(`[env] warning: "${f}" is encrypted but no usable private key was found for the "${g}" environment; falling back to its default. Set DOTENV_PRIVATE_KEY_${g.toUpperCase()} or ship .env.keys.`)}var X2={get:(f,g)=>{let B=f[g];if(typeof B==="string"&&(B.startsWith("encrypted:")||B.startsWith("enc:"))){let $=Tf(B);if($===void 0){_2(g),delete f[g];return}f[g]=$,B=$}let A=["_PORT","_TIMEOUT","_TTL","_SIZE","_LIMIT","_MAX","_MIN","_INTERVAL","_RETRIES","_CONCURRENCY","_WORKERS","_CONNECTIONS"];if(typeof B==="string"&&/^\d+$/.test(B)&&!B.startsWith("0")&&A.some(($)=>g.endsWith($)))return Number(B);if(typeof B==="string"){let $=B.toLowerCase();if($==="true")return!0;if($==="false")return!1}return B}};function D2(){return typeof Bun<"u"?Bun.env:$2.env}var Ef=new Proxy(D2(),X2);function H5(f,g,B){let A=B?.path||A2(".env"),_=Lf.readFileSync(A,"utf-8").split(`
|
|
25
25
|
`),X=_.findIndex((D)=>D.startsWith(`${f}=`)),W=/[\s"'#$\\]/.test(g)?`"${g.replace(/"/g,"\\\"")}"`:g;if(X!==-1)_[X]=`${f}=${W}`;else _.push(`${f}=${W}`);Lf.writeFileSync(A,_.join(`
|
|
26
26
|
`))}function O5(f=Ef){let g=[];for(let[B,A]of Object.entries(wf)){let $=f[B];if($!==void 0&&$!==""&&!A.includes(String($)))g.push(`${B}="${$}" is not valid. Allowed values: ${A.join(", ")}`)}return g}function W5(f,g=Ef){let B=[];for(let A of f){let $=g[A];if($===void 0||$===""||$===null)B.push(A)}if(B.length>0)throw Error(`[env] Missing required environment variable(s): ${B.join(", ")}. Set them in .env or your process environment before booting.`);return g}export{H5 as writeEnv,O5 as validateEnv,Uf as tenantEnvPrefix,f5 as stripForeignTenantEnv,c2 as setEnv,y2 as runtimeInfo,af as runtime,d2 as rotateKeypair,of as resolvePrivateKey,N2 as resolveEnvFile,V2 as resetPrivateKeyCache,W5 as requireEnv,s2 as providerInfo,g2 as provider,D2 as process,ff as platform,B2 as partitionTenantEnv,T2 as parseEnvFromKey,M as parse,R2 as migrateEncryptedValue,I2 as loadEnvFiles,Yf as loadEnv,v2 as isWindows,Qf as isNode,f2 as isMinimal,i2 as isMacOS,n2 as isLinux,W2 as isLegacyEncryptedValue,p2 as isDebug,l2 as isColorSupported,ef as isCI,Zf as isBun,o2 as hasWindow,If as hasTTY,n as getPrivateKey,m2 as getKeypair,k2 as getEnv,S as generateKeypair,g5 as foreignTenantKeys,pf as envPlugin,wf as envEnum,Ef as env,c as encryptValue,P2 as encryptEnv,b as decryptValue,Tf as decryptEnvValue,lf as decryptEnv,x2 as autoLoadEnv,O2 as aesEncrypt,zf as aesDecrypt,l as activeEnvName};
|
package/dist/types.d.ts
CHANGED
|
@@ -44,7 +44,7 @@ export declare interface StacksEnv {
|
|
|
44
44
|
PORT_SYSTEM_TRAY: number | undefined
|
|
45
45
|
API_PREFIX: string | undefined
|
|
46
46
|
DOCS_PREFIX: string | undefined
|
|
47
|
-
DB_CONNECTION: 'mysql' | 'sqlite' | 'postgres' | undefined
|
|
47
|
+
DB_CONNECTION: 'mysql' | 'sqlite' | 'postgres' | 'singlestore' | 'vitess' | undefined
|
|
48
48
|
DB_HOST: string | undefined
|
|
49
49
|
DB_PORT: number | undefined
|
|
50
50
|
DB_DATABASE: string | undefined
|
|
@@ -54,6 +54,7 @@ export declare interface StacksEnv {
|
|
|
54
54
|
DB_PREFIX: string | undefined
|
|
55
55
|
DB_SCHEMA: string | undefined
|
|
56
56
|
DB_POOL_MAX: number | undefined
|
|
57
|
+
DB_VITESS_SHARDED: boolean | undefined
|
|
57
58
|
DB_POOL_IDLE_TIMEOUT_MS: number | undefined
|
|
58
59
|
DB_POOL_ACQUIRE_TIMEOUT_MS: number | undefined
|
|
59
60
|
DB_READ_HOSTS: string | undefined
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@stacksjs/env",
|
|
3
3
|
"type": "module",
|
|
4
4
|
"sideEffects": false,
|
|
5
|
-
"version": "0.70.
|
|
5
|
+
"version": "0.70.263",
|
|
6
6
|
"description": "Stacks env helper methods.",
|
|
7
7
|
"author": "Chris Breuer",
|
|
8
8
|
"contributors": [
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
58
|
"better-dx": "^0.2.17",
|
|
59
|
-
"@stacksjs/path": "0.70.
|
|
60
|
-
"@stacksjs/validation": "0.70.
|
|
59
|
+
"@stacksjs/path": "0.70.263",
|
|
60
|
+
"@stacksjs/validation": "0.70.263"
|
|
61
61
|
}
|
|
62
62
|
}
|