@orth/cli 0.2.33 → 0.2.34

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/api.d.ts CHANGED
@@ -13,6 +13,7 @@ export interface SearchResponse {
13
13
  price?: number;
14
14
  hasDynamicPricing?: boolean;
15
15
  pricing_formula?: string;
16
+ apiSlug?: string;
16
17
  }>;
17
18
  }>;
18
19
  count: number;
@@ -139,6 +140,7 @@ export interface ApiBySlugResponse {
139
140
  required: boolean;
140
141
  description?: string;
141
142
  }>;
143
+ apiSlug?: string;
142
144
  }>;
143
145
  count: number;
144
146
  }
@@ -7,6 +7,7 @@ exports.apiCommand = apiCommand;
7
7
  const chalk_1 = __importDefault(require("chalk"));
8
8
  const ora_1 = __importDefault(require("ora"));
9
9
  const api_js_1 = require("../api.js");
10
+ const utils_js_1 = require("../utils.js");
10
11
  async function apiCommand(slug, path, options) {
11
12
  const spinner = (0, ora_1.default)("Loading...").start();
12
13
  try {
@@ -162,7 +163,14 @@ async function apiCommand(slug, path, options) {
162
163
  ? chalk_1.default.dim(ep)
163
164
  : chalk_1.default.dim(`$${parseFloat(Number(ep).toFixed(4))}`);
164
165
  })();
165
- console.log(`${method} ${chalk_1.default.white(endpoint.path)} ${price}`);
166
+ // Group members commonly collide on the same upstream path (e.g.
167
+ // AbstractAPI's many products all expose "/v1") — when the endpoint's
168
+ // own callable slug differs from the card's flat slug, show it so the
169
+ // right identifier is obvious before calling `orth run`.
170
+ const memberTag = endpoint.apiSlug && endpoint.apiSlug !== api.slug
171
+ ? chalk_1.default.dim(` [${(0, utils_js_1.sanitizeForTerminal)(endpoint.apiSlug)}]`)
172
+ : "";
173
+ console.log(`${method} ${chalk_1.default.white(endpoint.path)} ${price}${memberTag}`);
166
174
  if (endpoint.description) {
167
175
  console.log(chalk_1.default.gray(` ${endpoint.description.slice(0, 80)}${endpoint.description.length > 80 ? "..." : ""}`));
168
176
  }
@@ -195,7 +203,10 @@ async function apiCommand(slug, path, options) {
195
203
  ? chalk_1.default.dim(ep2)
196
204
  : chalk_1.default.dim(`$${parseFloat(Number(ep2).toFixed(4))}`);
197
205
  })();
198
- console.log(`${method} ${chalk_1.default.white(endpoint.path)} ${price}`);
206
+ const memberTag = endpoint.apiSlug && endpoint.apiSlug !== api.slug
207
+ ? chalk_1.default.dim(` [${(0, utils_js_1.sanitizeForTerminal)(endpoint.apiSlug)}]`)
208
+ : "";
209
+ console.log(`${method} ${chalk_1.default.white(endpoint.path)} ${price}${memberTag}`);
199
210
  if (endpoint.description) {
200
211
  console.log(chalk_1.default.gray(` ${endpoint.description.slice(0, 80)}${endpoint.description.length > 80 ? "..." : ""}`));
201
212
  }
@@ -7,6 +7,7 @@ exports.searchCommand = searchCommand;
7
7
  const chalk_1 = __importDefault(require("chalk"));
8
8
  const ora_1 = __importDefault(require("ora"));
9
9
  const api_js_1 = require("../api.js");
10
+ const utils_js_1 = require("../utils.js");
10
11
  async function searchCommand(query, options) {
11
12
  const spinner = (0, ora_1.default)("Searching APIs...").start();
12
13
  try {
@@ -21,9 +22,17 @@ async function searchCommand(query, options) {
21
22
  console.log(chalk_1.default.cyan.bold(`${api.name}`) + chalk_1.default.gray(` (${api.slug})`));
22
23
  for (const endpoint of api.endpoints.slice(0, 3)) {
23
24
  const method = endpoint.method.padEnd(6);
25
+ // Group members commonly collide on the same upstream path (e.g.
26
+ // AbstractAPI's many products all expose "/v1") — when the endpoint's
27
+ // own callable slug differs from the card's flat slug, show it so the
28
+ // right identifier is obvious before calling `orth run`.
29
+ const memberTag = endpoint.apiSlug && endpoint.apiSlug !== api.slug
30
+ ? chalk_1.default.dim(` [${(0, utils_js_1.sanitizeForTerminal)(endpoint.apiSlug)}]`)
31
+ : "";
24
32
  console.log(chalk_1.default.gray(" ") +
25
33
  chalk_1.default.yellow(method) +
26
- chalk_1.default.white(endpoint.path));
34
+ chalk_1.default.white(endpoint.path) +
35
+ memberTag);
27
36
  if (endpoint.description) {
28
37
  console.log(chalk_1.default.gray(` ${endpoint.description.slice(0, 80)}${endpoint.description.length > 80 ? "..." : ""}`));
29
38
  }
@@ -0,0 +1 @@
1
+ export declare function sanitizeForTerminal(value: string): string;
package/dist/utils.js ADDED
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sanitizeForTerminal = sanitizeForTerminal;
4
+ // Strips ASCII control characters (including ESC, 0x1B) from a string before
5
+ // it's written to the terminal. Needed for any remotely-sourced value we
6
+ // render directly (e.g. apiSlug, which an API owner sets) — without this, a
7
+ // crafted value containing terminal escape sequences could manipulate another
8
+ // user's terminal (spoofed output, hidden/cleared text, deceptive hyperlinks).
9
+ function sanitizeForTerminal(value) {
10
+ // eslint-disable-next-line no-control-regex
11
+ return value.replace(/[\x00-\x1F\x7F]/g, "");
12
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orth/cli",
3
- "version": "0.2.33",
3
+ "version": "0.2.34",
4
4
  "description": "CLI to access all APIs and skills on the Orthogonal platform",
5
5
  "main": "dist/index.js",
6
6
  "bin": {