@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 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.261",
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.261",
60
- "@stacksjs/validation": "0.70.261"
59
+ "@stacksjs/path": "0.70.263",
60
+ "@stacksjs/validation": "0.70.263"
61
61
  }
62
62
  }