@dotenvx/next-env 2.0.3 → 2.1.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.
Files changed (2) hide show
  1. package/dist/index.cjs +147 -49
  2. package/package.json +2 -2
package/dist/index.cjs CHANGED
@@ -5889,6 +5889,9 @@ var require_dist = __commonJS({
5889
5889
  "src/encrypted.js"(exports22, module22) {
5890
5890
  var PREFIX = "encrypted:";
5891
5891
  function encrypted2(value) {
5892
+ if (!value) {
5893
+ return false;
5894
+ }
5892
5895
  return value.startsWith(PREFIX);
5893
5896
  }
5894
5897
  module22.exports = encrypted2;
@@ -5958,9 +5961,9 @@ var require_dist = __commonJS({
5958
5961
  function chomp(value) {
5959
5962
  return value.replace(/[\r\n]+$/, "");
5960
5963
  }
5961
- function evaluate2(value, opts) {
5962
- const processEnv2 = opts.processEnv || process.env;
5963
- const runningParsed = opts.runningParsed || {};
5964
+ function evaluate2(value, options) {
5965
+ const processEnv2 = options.processEnv || process.env;
5966
+ const runningParsed = options.runningParsed || {};
5964
5967
  const matches = value.match(/\$\(([^)]+(?:\)[^(]*)*)\)/g) || [];
5965
5968
  return matches.reduce((newValue, match) => {
5966
5969
  const command = match.slice(2, -1);
@@ -5979,11 +5982,11 @@ var require_dist = __commonJS({
5979
5982
  });
5980
5983
  var require_expand = __commonJS2({
5981
5984
  "src/expand.js"(exports22, module22) {
5982
- function expand2(value, opts) {
5983
- const overload = opts.overload;
5984
- const processEnv2 = opts.processEnv || process.env;
5985
- const runningParsed = opts.runningParsed || {};
5986
- const literals = opts.literals || {};
5985
+ function expand2(value, options) {
5986
+ const overload = options.overload;
5987
+ const processEnv2 = options.processEnv || process.env;
5988
+ const runningParsed = options.runningParsed || {};
5989
+ const literals = options.literals || {};
5987
5990
  let env = { ...runningParsed, ...processEnv2 };
5988
5991
  if (overload) {
5989
5992
  env = { ...processEnv2, ...runningParsed };
@@ -6026,6 +6029,19 @@ var require_dist = __commonJS({
6026
6029
  module22.exports = expand2;
6027
6030
  }
6028
6031
  });
6032
+ var require_keypair = __commonJS2({
6033
+ "src/keypair.js"(exports22, module22) {
6034
+ var { PrivateKey } = require_dist2();
6035
+ function keypair2() {
6036
+ const kp = new PrivateKey();
6037
+ return {
6038
+ publicKey: kp.publicKey.toHex(),
6039
+ privateKey: Buffer.from(kp.secret).toString("hex")
6040
+ };
6041
+ }
6042
+ module22.exports = keypair2;
6043
+ }
6044
+ });
6029
6045
  var require_scan = __commonJS2({
6030
6046
  "src/scan.js"(exports22, module22) {
6031
6047
  function trimmer(value) {
@@ -6054,26 +6070,33 @@ var require_dist = __commonJS({
6054
6070
  }
6055
6071
  return q;
6056
6072
  }
6057
- function clean(value, quote) {
6073
+ function clean(value, quote, options) {
6058
6074
  let v = trimmer(value);
6059
6075
  v = v.replace(/^(['"`])([\s\S]*)\1$/mg, "$2");
6060
- if (quote === '"') {
6076
+ if (quote === '"' && options.expandDoubleQuotedNewlines !== false) {
6061
6077
  v = v.replace(/\\n/g, "\n");
6062
6078
  v = v.replace(/\\r/g, "\r");
6063
6079
  v = v.replace(/\\t/g, " ");
6064
6080
  }
6065
6081
  return v;
6066
6082
  }
6067
- function scan2(src, transform) {
6083
+ function scan2(src, options = {}, transform) {
6084
+ if (typeof options === "function") {
6085
+ transform = options;
6086
+ options = {};
6087
+ }
6068
6088
  const LINE = /(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg;
6069
6089
  const parsed = {};
6070
- const lines = (src || "").toString().replace(/\r\n?/mg, "\n");
6090
+ let lines = (src || "").toString();
6091
+ if (options.convertWindowsNewlines !== false) {
6092
+ lines = lines.replace(/\r\n?/mg, "\n");
6093
+ }
6071
6094
  let match;
6072
6095
  while ((match = LINE.exec(lines)) !== null) {
6073
6096
  const name = match[1];
6074
6097
  const raw = match[2];
6075
6098
  const quote = getQuote(raw);
6076
- const value = clean(raw, quote);
6099
+ const value = clean(raw, quote, options);
6077
6100
  let parsedValue = value;
6078
6101
  if (typeof transform === "function") {
6079
6102
  parsedValue = transform({
@@ -6082,7 +6105,8 @@ var require_dist = __commonJS({
6082
6105
  quote
6083
6106
  });
6084
6107
  }
6085
- parsed[name] = parsedValue;
6108
+ parsed[name] = parsed[name] || [];
6109
+ parsed[name].push(parsedValue);
6086
6110
  }
6087
6111
  return {
6088
6112
  parsed
@@ -6100,35 +6124,57 @@ var require_dist = __commonJS({
6100
6124
  try {
6101
6125
  const src = fs2.readFileSync(filepath, "utf8");
6102
6126
  const { parsed } = scan2(src);
6103
- return parsed;
6127
+ const result = [];
6128
+ for (const name in parsed) {
6129
+ if (name.startsWith("DOTENV_PRIVATE_KEY")) {
6130
+ result.push(parsed[name][parsed[name].length - 1]);
6131
+ }
6132
+ }
6133
+ return result;
6104
6134
  } catch (_e) {
6105
- return {};
6135
+ return [];
6106
6136
  }
6107
6137
  }
6108
- function keyring2() {
6109
- const mem = {};
6110
- const processEnv2 = process.env;
6111
- const keysFilepath = ".env.keys";
6112
- const sources = {
6113
- ...keysFromFile(keysFilepath),
6114
- ...processEnv2
6115
- // process.env wins
6116
- };
6117
- for (const name in sources) {
6138
+ function keyring2(options = {}) {
6139
+ const ring = options.ring || {};
6140
+ const processEnv2 = options.processEnv || process.env;
6141
+ const keysFilepaths = Array.isArray(options.fk) ? options.fk : [options.fk || ".env.keys"];
6142
+ const privateKeyValues = keysFilepaths.reduce((acc, filepath) => {
6143
+ return acc.concat(keysFromFile(filepath));
6144
+ }, []);
6145
+ for (const name in processEnv2) {
6118
6146
  if (name.startsWith("DOTENV_PRIVATE_KEY")) {
6119
- try {
6120
- const privateKeyHex = sources[name];
6121
- const publicKeyHex = derive2(privateKeyHex);
6122
- mem[publicKeyHex] = privateKeyHex;
6123
- } catch (_e) {
6124
- }
6147
+ privateKeyValues.push(processEnv2[name]);
6148
+ }
6149
+ }
6150
+ for (const privateKeyHex of privateKeyValues) {
6151
+ try {
6152
+ const publicKeyHex = derive2(privateKeyHex);
6153
+ ring[publicKeyHex] = privateKeyHex;
6154
+ } catch (_e) {
6125
6155
  }
6126
6156
  }
6127
- return mem;
6157
+ return ring;
6128
6158
  }
6129
6159
  module22.exports = keyring2;
6130
6160
  }
6131
6161
  });
6162
+ var require_publickeys = __commonJS2({
6163
+ "src/publickeys.js"(exports22, module22) {
6164
+ var scan2 = require_scan();
6165
+ function publickeys2(src) {
6166
+ const { parsed } = scan2(src);
6167
+ const result = [];
6168
+ for (const name in parsed) {
6169
+ if (name.startsWith("DOTENV_PUBLIC_KEY")) {
6170
+ result.push(parsed[name][parsed[name].length - 1]);
6171
+ }
6172
+ }
6173
+ return result;
6174
+ }
6175
+ module22.exports = publickeys2;
6176
+ }
6177
+ });
6132
6178
  var require_parse = __commonJS2({
6133
6179
  "src/parse.js"(exports22, module22) {
6134
6180
  var decrypt2 = require_decrypt();
@@ -6136,32 +6182,56 @@ var require_dist = __commonJS({
6136
6182
  var encrypted2 = require_encrypted();
6137
6183
  var evaluate2 = require_evaluate();
6138
6184
  var expand2 = require_expand();
6185
+ var publickeys2 = require_publickeys();
6139
6186
  var scan2 = require_scan();
6140
6187
  function resolveEscapeSequences(value) {
6141
6188
  return value.replace(/\\\$/g, "$");
6142
6189
  }
6143
- function parse22(src, opts = {}) {
6144
- const overload = opts.overload;
6145
- const processEnv2 = opts.processEnv || process.env;
6146
- const ring = keyring2();
6190
+ function decryptWithKeyring(ring, value, publicKeyHexes) {
6191
+ const tried = {};
6192
+ for (const publicKeyHex of publicKeyHexes) {
6193
+ const privateKeyHex = ring[publicKeyHex];
6194
+ if (!privateKeyHex) {
6195
+ continue;
6196
+ }
6197
+ tried[privateKeyHex] = true;
6198
+ try {
6199
+ return decrypt2(privateKeyHex, value);
6200
+ } catch (_e) {
6201
+ }
6202
+ }
6203
+ for (const privateKeyHex of Object.values(ring)) {
6204
+ if (!privateKeyHex || tried[privateKeyHex]) {
6205
+ continue;
6206
+ }
6207
+ try {
6208
+ return decrypt2(privateKeyHex, value);
6209
+ } catch (_e) {
6210
+ }
6211
+ }
6212
+ return value;
6213
+ }
6214
+ function parse22(src, options = {}) {
6215
+ const overload = options.overload;
6216
+ const processEnv2 = options.processEnv || process.env;
6217
+ const publicKeyHexes = publickeys2(src);
6218
+ let ring = {};
6219
+ for (const publicKeyHex of publicKeyHexes) {
6220
+ ring[publicKeyHex] = "";
6221
+ }
6222
+ ring = keyring2({ processEnv: processEnv2, ring });
6147
6223
  function inProcessEnv(name) {
6148
6224
  return Object.prototype.hasOwnProperty.call(processEnv2, name);
6149
6225
  }
6150
- let publicKeyHex;
6151
- let runningParsed = {};
6152
- let literals = {};
6153
- const { parsed } = scan2(src, ({ name, value, quote }) => {
6226
+ const runningParsed = {};
6227
+ const literals = {};
6228
+ const parsed = {};
6229
+ scan2(src, ({ name, value, quote }) => {
6154
6230
  let parsedValue = value;
6155
- if (name.startsWith("DOTENV_PUBLIC_KEY")) {
6156
- publicKeyHex = parsedValue;
6157
- }
6158
6231
  if (!overload && inProcessEnv(name)) {
6159
6232
  parsedValue = processEnv2[name];
6160
6233
  }
6161
- try {
6162
- parsedValue = decrypt2(ring[publicKeyHex], parsedValue);
6163
- } catch (_e) {
6164
- }
6234
+ parsedValue = decryptWithKeyring(ring, parsedValue, publicKeyHexes);
6165
6235
  const encryptedPrefixed = encrypted2(parsedValue);
6166
6236
  let evaled = false;
6167
6237
  if (!encryptedPrefixed && quote !== "'" && (!inProcessEnv(name) || processEnv2[name] === parsedValue)) {
@@ -6181,6 +6251,7 @@ var require_dist = __commonJS({
6181
6251
  literals[name] = parsedValue;
6182
6252
  }
6183
6253
  runningParsed[name] = parsedValue;
6254
+ parsed[name] = parsedValue;
6184
6255
  if (Object.prototype.hasOwnProperty.call(processEnv2, name) && !overload) {
6185
6256
  } else {
6186
6257
  }
@@ -6193,15 +6264,39 @@ var require_dist = __commonJS({
6193
6264
  module22.exports = parse22;
6194
6265
  }
6195
6266
  });
6267
+ var require_sealed = __commonJS2({
6268
+ "src/sealed.js"(exports22, module22) {
6269
+ var encrypted2 = require_encrypted();
6270
+ var scan2 = require_scan();
6271
+ function publicKey(name) {
6272
+ return name.startsWith("DOTENV_PUBLIC_KEY");
6273
+ }
6274
+ function sealed2(src) {
6275
+ const { parsed } = scan2(src);
6276
+ for (const [name, values] of Object.entries(parsed)) {
6277
+ for (const value of values) {
6278
+ if (!encrypted2(value) && !publicKey(name)) {
6279
+ return false;
6280
+ }
6281
+ }
6282
+ }
6283
+ return true;
6284
+ }
6285
+ module22.exports = sealed2;
6286
+ }
6287
+ });
6196
6288
  var decrypt = require_decrypt();
6197
6289
  var derive = require_derive();
6198
6290
  var encrypt = require_encrypt();
6199
6291
  var encrypted = require_encrypted();
6200
6292
  var evaluate = require_evaluate();
6201
6293
  var expand = require_expand();
6294
+ var keypair = require_keypair();
6202
6295
  var keyring = require_keyring();
6203
6296
  var parse2 = require_parse();
6297
+ var publickeys = require_publickeys();
6204
6298
  var scan = require_scan();
6299
+ var sealed = require_sealed();
6205
6300
  module2.exports = {
6206
6301
  decrypt,
6207
6302
  derive,
@@ -6209,9 +6304,12 @@ var require_dist = __commonJS({
6209
6304
  encrypted,
6210
6305
  evaluate,
6211
6306
  expand,
6307
+ keypair,
6212
6308
  keyring,
6213
6309
  parse: parse2,
6214
- scan
6310
+ publickeys,
6311
+ scan,
6312
+ sealed
6215
6313
  };
6216
6314
  }
6217
6315
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dotenvx/next-env",
3
- "version": "2.0.3",
3
+ "version": "2.1.0",
4
4
  "description": "dotenvx drop-in replacement for @next/env",
5
5
  "license": "BSD-3-Clause",
6
6
  "repository": {
@@ -23,7 +23,7 @@
23
23
  "prepublishOnly": "npm pack --dry-run"
24
24
  },
25
25
  "devDependencies": {
26
- "@dotenvx/primitives": "^0.6.0",
26
+ "@dotenvx/primitives": "^0.9.0",
27
27
  "esbuild": "^0.28.1"
28
28
  }
29
29
  }