envis-node 0.0.1 → 0.0.2

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "envis-node",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "Secure, simple secret management",
5
5
  "keywords": [
6
6
  "secret",
package/src/main.js CHANGED
@@ -33,13 +33,21 @@ async function get(projectId, secretName) {
33
33
  throw new Error("Both project id and secret name are required.");
34
34
  }
35
35
 
36
- await ensureSession();
37
- const session = await loadSession();
36
+ const ciToken = process.env.ENVIS_CI_TOKEN;
37
+ let session = null;
38
+ if (!ciToken) {
39
+ await ensureSession();
40
+ session = await loadSession();
41
+ }
38
42
 
39
43
  const headers = {
40
- Authorization: `Bearer ${session.access_token}`,
41
44
  "Content-Type": "application/json",
42
45
  };
46
+ if (ciToken) {
47
+ headers["X-CI-Token"] = ciToken;
48
+ } else {
49
+ headers.Authorization = `Bearer ${session.access_token}`;
50
+ }
43
51
 
44
52
  const url = `${BASE_URL}/v1/projects/${encodeURIComponent(
45
53
  projectId
package/src/session.js CHANGED
@@ -11,6 +11,76 @@ const REQUIRED_SESSION_KEYS = ["access_token", "refresh_token"];
11
11
  const WAIT_TIME = 120; // seconds
12
12
  const POLL_DELAY_SECONDS = 5;
13
13
 
14
+ function findDotEnv(startDir) {
15
+ let current = startDir;
16
+ while (current && current !== path.dirname(current)) {
17
+ const candidate = path.join(current, ".env");
18
+ if (fs.existsSync(candidate)) {
19
+ return candidate;
20
+ }
21
+ current = path.dirname(current);
22
+ }
23
+ const fallback = path.join(startDir, ".env");
24
+ return fs.existsSync(fallback) ? fallback : null;
25
+ }
26
+
27
+ function parseDotEnvLine(line) {
28
+ const trimmed = line.trim();
29
+ if (!trimmed || trimmed.startsWith("#")) {
30
+ return null;
31
+ }
32
+ const normalized = trimmed.startsWith("export ")
33
+ ? trimmed.slice(7).trim()
34
+ : trimmed;
35
+ const splitIndex = normalized.indexOf("=");
36
+ if (splitIndex <= 0) {
37
+ return null;
38
+ }
39
+ const key = normalized.slice(0, splitIndex).trim();
40
+ let value = normalized.slice(splitIndex + 1).trim();
41
+ if (
42
+ (value.startsWith('"') && value.endsWith('"')) ||
43
+ (value.startsWith("'") && value.endsWith("'"))
44
+ ) {
45
+ value = value.slice(1, -1);
46
+ }
47
+ value = value.replace(/\\n/g, "\n");
48
+ return { key, value };
49
+ }
50
+
51
+ function loadDotEnv() {
52
+ const envPath = findDotEnv(process.cwd());
53
+ if (!envPath) {
54
+ return;
55
+ }
56
+ let raw;
57
+ try {
58
+ raw = fs.readFileSync(envPath, "utf-8");
59
+ } catch {
60
+ return;
61
+ }
62
+ raw.split(/\r?\n/).forEach((line) => {
63
+ const parsed = parseDotEnvLine(line);
64
+ if (!parsed || process.env[parsed.key] !== undefined) {
65
+ return;
66
+ }
67
+ process.env[parsed.key] = parsed.value;
68
+ });
69
+ }
70
+
71
+ function isHeadless() {
72
+ if (process.env.ENVIS_CI_TOKEN) {
73
+ return true;
74
+ }
75
+ try {
76
+ return !(process.stdin.isTTY && process.stdout.isTTY);
77
+ } catch {
78
+ return true;
79
+ }
80
+ }
81
+
82
+ loadDotEnv();
83
+
14
84
  function printc(text, color = "white") {
15
85
  const colorFn = chalk[color];
16
86
  if (typeof colorFn === "function") {
@@ -206,6 +276,12 @@ async function ensureSession() {
206
276
  return;
207
277
  }
208
278
 
279
+ if (isHeadless()) {
280
+ throw new Error(
281
+ "No cached session and headless environment detected. Set ENVIS_CI_TOKEN or run `envis login` on a machine with a browser."
282
+ );
283
+ }
284
+
209
285
  const { waitForAuth } = require("./auth");
210
286
  let openBrowser;
211
287
  try {