@nlxai/cli 1.2.2-alpha.9 → 1.2.3-alpha.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.
@@ -4,22 +4,28 @@ import open from "open";
4
4
  import * as os from "os";
5
5
  import * as path from "path";
6
6
  import { consola } from "consola";
7
+ import { singleton } from "../../utils/index.js";
7
8
  export const ACCOUNTS_PATH = path.join(os.homedir(), ".nlx-cli-auth.json");
8
9
  let _keytar;
9
- async function getKeytar() {
10
+ export async function getKeytar() {
10
11
  if (_keytar)
11
12
  return _keytar;
12
- _keytar = await import("keytar");
13
+ _keytar = (await import("keytar")).default;
13
14
  return _keytar;
14
15
  }
15
16
  async function saveTokens(account, tokenData) {
16
- const keytar = await getKeytar();
17
- await keytar.setPassword("nlx-cli", account, JSON.stringify(tokenData));
17
+ if (!process.env.NLX_ACCESS_TOKEN) {
18
+ const keytar = await getKeytar();
19
+ await keytar.setPassword("nlx-cli", account, JSON.stringify(tokenData));
20
+ }
21
+ else {
22
+ process.env.NLX_ACCESS_TOKEN = btoa(JSON.stringify([account, tokenData]));
23
+ }
18
24
  }
19
25
  async function loadTokens() {
20
26
  if (process.env.NLX_ACCESS_TOKEN) {
21
27
  try {
22
- console.log("Using access token from NLX_ACCESS_TOKEN environment variable");
28
+ consola.info("Using access token from NLX_ACCESS_TOKEN environment variable");
23
29
  return JSON.parse(atob(process.env.NLX_ACCESS_TOKEN));
24
30
  }
25
31
  catch (error) {
@@ -41,7 +47,7 @@ async function loadTokens() {
41
47
  throw new Error("Failed to load tokens");
42
48
  }
43
49
  }
44
- async function refreshTokenIfNeeded() {
50
+ const refreshTokenIfNeeded = singleton(async function () {
45
51
  let account, tokens;
46
52
  try {
47
53
  [account, tokens] = await loadTokens();
@@ -79,7 +85,7 @@ async function refreshTokenIfNeeded() {
79
85
  return newTokens.access_token;
80
86
  }
81
87
  return null;
82
- }
88
+ });
83
89
  const AUTH0_DOMAIN = process.env.AUTH0_DOMAIN || "nlxdev.us.auth0.com"; // e.g. 'dev-xxxxxx.us.auth0.com'
84
90
  const CLIENT_ID = process.env.AUTH0_CLIENT_ID || "A0qluq7wJQjFjMLle9pvrWWaVHM1QHE3";
85
91
  const AUDIENCE = process.env.AUTH0_AUDIENCE || "https://nlxdev.us.auth0.com/api/v2/";
@@ -151,11 +157,10 @@ export const loginCommand = new Command("login")
151
157
  tokenData.obtained_at = Math.floor(Date.now() / 1000);
152
158
  await saveTokens(userData.email, tokenData);
153
159
  if (opts.printToken) {
154
- console.log("Access token", btoa(JSON.stringify([userData.email, tokenData])));
160
+ consola.success("Access token", btoa(JSON.stringify([userData.email, tokenData])));
155
161
  }
156
162
  consola.success("Login successful! Access token stored securely.");
157
163
  });
158
- // Example usage: get a valid access token
159
164
  export async function ensureToken() {
160
165
  const accessToken = await refreshTokenIfNeeded();
161
166
  if (!accessToken) {
@@ -1,7 +1,6 @@
1
1
  import { Command } from "commander";
2
2
  import { consola } from "consola";
3
- import { ACCOUNTS_PATH } from "./login.js";
4
- import keytar from "keytar";
3
+ import { ACCOUNTS_PATH, getKeytar } from "./login.js";
5
4
  import * as fs from "fs";
6
5
  export const logoutCommand = new Command("logout")
7
6
  .description("Clear stored authentication tokens")
@@ -13,6 +12,7 @@ export const logoutCommand = new Command("logout")
13
12
  accounts = JSON.parse(data);
14
13
  }
15
14
  if (accounts.currentAccount) {
15
+ const keytar = await getKeytar();
16
16
  await keytar.deletePassword("nlx-cli", accounts.currentAccount);
17
17
  accounts.accounts = accounts.accounts.filter((acc) => acc !== accounts.currentAccount);
18
18
  if (accounts.accounts.length > 0) {
@@ -20,3 +20,14 @@ export const fetchManagementApi = async (path, method = "GET", body) => {
20
20
  consola.debug("Response:", JSON.stringify(result));
21
21
  return result;
22
22
  };
23
+ export const singleton = (fn) => {
24
+ let running = null;
25
+ return async () => {
26
+ if (!running) {
27
+ running = fn().finally(() => {
28
+ running = null;
29
+ });
30
+ }
31
+ return running;
32
+ };
33
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nlxai/cli",
3
- "version": "1.2.2-alpha.9",
3
+ "version": "1.2.3-alpha.0",
4
4
  "description": "Tools for integrating with NLX apps",
5
5
  "keywords": [
6
6
  "NLX",
@@ -58,5 +58,5 @@
58
58
  "@vitest/ui": "^3.2.4",
59
59
  "vitest": "^3.2.4"
60
60
  },
61
- "gitHead": "690c384cd98ec1fba1811e6913c8c5a5b498bd59"
61
+ "gitHead": "2e39f684bb39b0ccbed58486a4f82f93693218ca"
62
62
  }