@instantapihq/cli 1.0.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.
package/README.md ADDED
@@ -0,0 +1,163 @@
1
+ # Instant API CLI
2
+
3
+ Share your local server with the internet, like ngrok but integrated with Instant API.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install -g @instantapihq/cli
9
+ ```
10
+
11
+ Or use directly with npx:
12
+
13
+ ```bash
14
+ npx @instantapihq/cli expose http://localhost:3000/api
15
+ ```
16
+
17
+ ## Usage
18
+
19
+ ### Expose Local Server
20
+
21
+ ```bash
22
+ instant-api expose http://localhost:3000/api/users
23
+ ```
24
+
25
+ You get:
26
+ - ✅ Public URL instantly
27
+ - ✅ Requests forwarded to your local server
28
+ - ✅ Works with any framework (Express, NestJS, Flask, FastAPI, etc.)
29
+ - ✅ Supports SSE/streaming
30
+ - ✅ Press Ctrl+C to stop
31
+
32
+ ### Quick Test (No Auth)
33
+
34
+ ```bash
35
+ # 1 hour temporary tunnel, perfect for quick tests
36
+ instant-api expose http://localhost:3000/api
37
+ ```
38
+
39
+ ### Persistent Tunnel (With Auth)
40
+
41
+ ```bash
42
+ # 1. Sign up and get API key
43
+ export INSTANT_API_KEY=ik_your_key_here
44
+
45
+ # 2. Expose with no time limit
46
+ instant-api expose http://localhost:3000/api
47
+ ```
48
+
49
+ ### Options
50
+
51
+ ```bash
52
+ instant-api expose <targetUrl> [options]
53
+
54
+ Options:
55
+ --backend, -b Backend URL [default: "http://localhost:3001"]
56
+ --help, -h Show help
57
+ --version, -v Show version
58
+ ```
59
+
60
+ ## Examples
61
+
62
+ ### Expose Express Server
63
+
64
+ ```bash
65
+ # Terminal 1: Start your server
66
+ npm run dev # Running on http://localhost:3000
67
+
68
+ # Terminal 2: Expose an endpoint
69
+ instant-api expose http://localhost:3000/api/users/create
70
+
71
+ # Output:
72
+ # 🚀 Instant API - Framework Mode
73
+ # ✓ Tunnel registered successfully!
74
+ #
75
+ # Public URL: http://localhost:3001/t/clx123...
76
+ # Target URL: http://localhost:3000/api/users/create
77
+ #
78
+ # Waiting for requests...
79
+
80
+ # Terminal 3: Test it
81
+ curl -X POST http://localhost:3001/t/clx123... \
82
+ -H "Content-Type: application/json" \
83
+ -d '{"name": "John Doe"}'
84
+ ```
85
+
86
+ ### Expose Streaming Endpoint
87
+
88
+ ```bash
89
+ # Your SSE endpoint
90
+ instant-api expose http://localhost:3000/events
91
+
92
+ # Test streaming
93
+ curl -N http://localhost:3001/t/clx123...
94
+ ```
95
+
96
+ ### Configure API Key
97
+
98
+ ```bash
99
+ # Save API key to config file
100
+ instant-api config --api-key ik_your_key_here
101
+
102
+ # View current config
103
+ instant-api config
104
+ ```
105
+
106
+ ## How It Works
107
+
108
+ 1. **Register**: CLI registers your target URL with the backend
109
+ 2. **Poll**: CLI continuously polls for incoming requests
110
+ 3. **Forward**: Requests are forwarded to your local server
111
+ 4. **Respond**: Your server's response is sent back through the tunnel
112
+
113
+ ## Features
114
+
115
+ - ✅ **No signup for quick tests** - 1 hour temporary tunnels
116
+ - ✅ **Streaming support** - SSE and WebSocket
117
+ - ✅ **All HTTP methods** - GET, POST, PUT, DELETE, etc.
118
+ - ✅ **Header forwarding** - Preserves important headers
119
+ - ✅ **Error handling** - Clear error messages
120
+ - ✅ **Auto-reconnect** - Handles network issues
121
+
122
+ ## Requirements
123
+
124
+ - Node.js 18+
125
+ - Instant API backend running (or production URL)
126
+ - Your local server running
127
+
128
+ ## Development
129
+
130
+ Build from source:
131
+
132
+ ```bash
133
+ # Clone repo
134
+ git clone https://github.com/treadiehq/instantapi.git
135
+ cd instantapi/cli
136
+
137
+ # Build
138
+ npm install
139
+ npm run build
140
+
141
+ # Test locally
142
+ node dist/index.js expose http://localhost:3000
143
+ ```
144
+
145
+ ## Troubleshooting
146
+
147
+ **Connection refused:**
148
+ - Make sure your local server is running
149
+ - Check the target URL is correct
150
+
151
+ **Backend not responding:**
152
+ - Verify backend is running at the correct URL
153
+ - Use `--backend` flag if needed
154
+
155
+ **Tunnel expired:**
156
+ - Without auth, tunnels last 1 hour
157
+ - Sign up and set API key for longer tunnels
158
+
159
+ ## License
160
+
161
+ FSL-1.1-MIT - See [LICENSE](../LICENSE)
162
+
163
+ Built by [Treadie, Inc.](https://treadie.com)
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,386 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ const axios_1 = __importDefault(require("axios"));
41
+ const yargs_1 = __importDefault(require("yargs"));
42
+ const helpers_1 = require("yargs/helpers");
43
+ const chalk_1 = __importDefault(require("chalk"));
44
+ const fs = __importStar(require("fs"));
45
+ const path = __importStar(require("path"));
46
+ const os = __importStar(require("os"));
47
+ let isShuttingDown = false;
48
+ // Get API key from environment or config file
49
+ function getApiKey() {
50
+ // First check environment variable
51
+ const envKey = process.env.INSTANT_API_KEY;
52
+ if (envKey) {
53
+ return envKey;
54
+ }
55
+ // Check config file in home directory
56
+ const configPath = path.join(os.homedir(), '.instant-api-config.json');
57
+ if (fs.existsSync(configPath)) {
58
+ try {
59
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
60
+ return config.apiKey;
61
+ }
62
+ catch (error) {
63
+ console.warn(chalk_1.default.yellow('Warning: Failed to read config file'));
64
+ }
65
+ }
66
+ return undefined;
67
+ }
68
+ // Save API key to config file
69
+ function saveApiKey(apiKey) {
70
+ const configPath = path.join(os.homedir(), '.instant-api-config.json');
71
+ const config = { apiKey };
72
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
73
+ console.log(chalk_1.default.green(`✓ API key saved to ${configPath}`));
74
+ }
75
+ // Get auth headers (optional - can work without API key with 1hr restrictions)
76
+ function getAuthHeaders(warnIfMissing = false) {
77
+ const apiKey = getApiKey();
78
+ if (apiKey) {
79
+ return {
80
+ 'x-api-key': apiKey,
81
+ };
82
+ }
83
+ // Warn user about 1hr limitation
84
+ if (warnIfMissing) {
85
+ console.log(chalk_1.default.yellow('\n⚠️ Running without authentication - tunnel will have temporary restrictions'));
86
+ console.log(chalk_1.default.gray(' To use for longer than 1 hour, create an account and set your API key:'));
87
+ console.log(chalk_1.default.gray(' 1. Sign up at your-instance.com'));
88
+ console.log(chalk_1.default.gray(' 2. Generate an API key'));
89
+ console.log(chalk_1.default.gray(' 3. Run: npx instant-api config --api-key ik_...\n'));
90
+ }
91
+ return {};
92
+ }
93
+ function detectSDKMetadata() {
94
+ const metadataPath = path.join(process.cwd(), '.instant-api-sdk.json');
95
+ if (fs.existsSync(metadataPath)) {
96
+ try {
97
+ const content = fs.readFileSync(metadataPath, 'utf-8');
98
+ return JSON.parse(content);
99
+ }
100
+ catch (error) {
101
+ return null;
102
+ }
103
+ }
104
+ return null;
105
+ }
106
+ function resolveTargetUrl(input) {
107
+ // Check if it's already a full URL
108
+ try {
109
+ new URL(input);
110
+ return input;
111
+ }
112
+ catch {
113
+ // Not a URL, might be a function name
114
+ const sdkMetadata = detectSDKMetadata();
115
+ if (sdkMetadata && sdkMetadata.functions.includes(input)) {
116
+ // It's a function name - construct URL
117
+ const url = `http://localhost:${sdkMetadata.port}/fn/${input}`;
118
+ console.log(chalk_1.default.gray(`Detected SDK function: ${input}`));
119
+ console.log(chalk_1.default.gray(`Resolved to: ${url}\n`));
120
+ return url;
121
+ }
122
+ // Assume it's a malformed URL, try to use it anyway
123
+ return input;
124
+ }
125
+ }
126
+ async function exposeRoute(targetUrl, backendUrl) {
127
+ console.log(chalk_1.default.blue('🚀 Instant API - Framework Mode\n'));
128
+ // Check if this is SDK/Function mode (requires API key)
129
+ const isFunctionMode = targetUrl.includes('/fn/');
130
+ const apiKey = getApiKey();
131
+ if (isFunctionMode && !apiKey) {
132
+ console.error(chalk_1.default.red('✗ Function mode requires an API key'));
133
+ console.log(chalk_1.default.yellow('\nTo use function mode:'));
134
+ console.log(chalk_1.default.gray(' 1. Sign up at your-instance.com'));
135
+ console.log(chalk_1.default.gray(' 2. Generate an API key'));
136
+ console.log(chalk_1.default.gray(' 3. Run: npx instant-api config --api-key ik_...'));
137
+ console.log(chalk_1.default.gray('\n Or set environment variable: export INSTANT_API_KEY=ik_...\n'));
138
+ process.exit(1);
139
+ }
140
+ const authHeaders = getAuthHeaders(!isFunctionMode);
141
+ try {
142
+ // Register tunnel with backend
143
+ console.log(chalk_1.default.gray(`Registering tunnel for ${targetUrl}...`));
144
+ const registerResponse = await axios_1.default.post(`${backendUrl}/api/tunnels/register`, { targetUrl }, { headers: authHeaders });
145
+ const { id, publicUrl } = registerResponse.data;
146
+ console.log(chalk_1.default.green('✓ Tunnel registered successfully!\n'));
147
+ console.log(chalk_1.default.bold('Public URL:'), chalk_1.default.cyan(publicUrl));
148
+ console.log(chalk_1.default.bold('Target URL:'), chalk_1.default.yellow(targetUrl));
149
+ console.log(chalk_1.default.bold('Tunnel ID:'), chalk_1.default.gray(id));
150
+ console.log(chalk_1.default.gray('\nPress Ctrl+C to stop the tunnel\n'));
151
+ // Set up graceful shutdown
152
+ process.on('SIGINT', async () => {
153
+ if (isShuttingDown)
154
+ return;
155
+ isShuttingDown = true;
156
+ console.log(chalk_1.default.yellow('\n\n🛑 Shutting down tunnel...'));
157
+ try {
158
+ await axios_1.default.delete(`${backendUrl}/api/tunnels/${id}`, { headers: authHeaders });
159
+ console.log(chalk_1.default.green('✓ Tunnel deactivated'));
160
+ }
161
+ catch (error) {
162
+ console.log(chalk_1.default.gray('(Tunnel cleanup skipped)'));
163
+ }
164
+ process.exit(0);
165
+ });
166
+ // Start polling loop
167
+ let requestCount = 0;
168
+ console.log(chalk_1.default.gray('Waiting for requests...\n'));
169
+ while (!isShuttingDown) {
170
+ try {
171
+ // Poll for new requests
172
+ const pollResponse = await axios_1.default.post(`${backendUrl}/api/tunnels/${id}/poll`, { maxWaitMs: 25000 }, { timeout: 30000, headers: authHeaders });
173
+ const { requestId, method, path, headers, body, isStreaming } = pollResponse.data;
174
+ if (!requestId) {
175
+ // No request received, continue polling
176
+ continue;
177
+ }
178
+ requestCount++;
179
+ const timestamp = new Date().toLocaleTimeString();
180
+ console.log(chalk_1.default.cyan(`[${timestamp}]`), chalk_1.default.bold(`${method} ${path}`), isStreaming ? chalk_1.default.magenta('[STREAMING]') : '', chalk_1.default.gray(`(#${requestCount})`));
181
+ // Handle streaming vs standard requests
182
+ if (isStreaming) {
183
+ // Streaming request (SSE/WebSocket fallback)
184
+ try {
185
+ const localResponse = await (0, axios_1.default)({
186
+ method: 'get',
187
+ url: targetUrl + (path || ''),
188
+ headers: { ...headers, accept: 'text/event-stream' },
189
+ responseType: 'stream',
190
+ timeout: 300000, // 5 minute timeout for streams
191
+ });
192
+ let sequence = 0;
193
+ // Stream chunks to backend
194
+ localResponse.data.on('data', async (chunk) => {
195
+ try {
196
+ await axios_1.default.post(`${backendUrl}/api/tunnels/${id}/stream`, {
197
+ requestId,
198
+ sequence: sequence++,
199
+ chunk: chunk.toString(),
200
+ }, { headers: authHeaders });
201
+ }
202
+ catch (streamError) {
203
+ console.log(chalk_1.default.gray(` └─`), chalk_1.default.red('Stream error'), chalk_1.default.red(streamError));
204
+ }
205
+ });
206
+ localResponse.data.on('end', async () => {
207
+ // Send EOF signal
208
+ await axios_1.default.post(`${backendUrl}/api/tunnels/${id}/stream`, {
209
+ requestId,
210
+ eof: true,
211
+ }, { headers: authHeaders });
212
+ console.log(chalk_1.default.gray(` └─`), chalk_1.default.green('Stream completed'));
213
+ });
214
+ localResponse.data.on('error', async (streamError) => {
215
+ console.log(chalk_1.default.gray(` └─`), chalk_1.default.red('✗'), chalk_1.default.red(streamError.message));
216
+ // Mark as failed
217
+ await axios_1.default.post(`${backendUrl}/api/tunnels/${id}/stream`, {
218
+ requestId,
219
+ eof: true,
220
+ }, { headers: authHeaders });
221
+ });
222
+ }
223
+ catch (localError) {
224
+ const errorMessage = localError.code === 'ECONNREFUSED'
225
+ ? 'Connection refused - is your local server running?'
226
+ : localError.message;
227
+ console.log(chalk_1.default.gray(` └─`), chalk_1.default.red('✗'), chalk_1.default.red(errorMessage));
228
+ // Mark as failed
229
+ await axios_1.default.post(`${backendUrl}/api/tunnels/${id}/stream`, {
230
+ requestId,
231
+ eof: true,
232
+ });
233
+ }
234
+ }
235
+ else {
236
+ // Standard request-response
237
+ try {
238
+ const localResponse = await (0, axios_1.default)({
239
+ method: method?.toLowerCase(),
240
+ url: targetUrl + (path || ''),
241
+ headers: headers || {},
242
+ data: body,
243
+ validateStatus: () => true, // Accept any status code
244
+ timeout: 25000,
245
+ });
246
+ // Send response back to backend
247
+ await axios_1.default.post(`${backendUrl}/api/tunnels/${id}/respond`, {
248
+ requestId,
249
+ statusCode: localResponse.status,
250
+ headers: localResponse.headers,
251
+ body: localResponse.data,
252
+ }, { headers: authHeaders });
253
+ const statusColor = localResponse.status >= 200 && localResponse.status < 300
254
+ ? chalk_1.default.green
255
+ : localResponse.status >= 400
256
+ ? chalk_1.default.red
257
+ : chalk_1.default.yellow;
258
+ console.log(chalk_1.default.gray(` └─`), statusColor(`${localResponse.status}`), chalk_1.default.gray(`${JSON.stringify(localResponse.data).substring(0, 100)}${JSON.stringify(localResponse.data).length > 100 ? '...' : ''}`));
259
+ }
260
+ catch (localError) {
261
+ // Local request failed
262
+ const errorMessage = localError.code === 'ECONNREFUSED'
263
+ ? 'Connection refused - is your local server running?'
264
+ : localError.message;
265
+ console.log(chalk_1.default.gray(` └─`), chalk_1.default.red('✗'), chalk_1.default.red(errorMessage));
266
+ // Send error response back
267
+ await axios_1.default.post(`${backendUrl}/api/tunnels/${id}/respond`, {
268
+ requestId,
269
+ statusCode: 502,
270
+ headers: { 'content-type': 'application/json' },
271
+ body: {
272
+ error: 'Bad Gateway',
273
+ message: errorMessage,
274
+ },
275
+ }, { headers: authHeaders });
276
+ }
277
+ }
278
+ }
279
+ catch (pollError) {
280
+ if (isShuttingDown)
281
+ break;
282
+ // Handle polling errors
283
+ if (pollError.code === 'ECONNABORTED') {
284
+ // Timeout is expected, continue
285
+ continue;
286
+ }
287
+ if (axios_1.default.isAxiosError(pollError)) {
288
+ const axiosError = pollError;
289
+ if (axiosError.response?.status === 404) {
290
+ console.log(chalk_1.default.red('\n✗ Tunnel not found or expired'));
291
+ break;
292
+ }
293
+ }
294
+ console.error(chalk_1.default.red('Poll error:'), pollError.message);
295
+ // Wait a bit before retrying
296
+ await new Promise((resolve) => setTimeout(resolve, 2000));
297
+ }
298
+ }
299
+ }
300
+ catch (error) {
301
+ if (axios_1.default.isAxiosError(error)) {
302
+ const axiosError = error;
303
+ if (axiosError.code === 'ECONNREFUSED') {
304
+ console.error(chalk_1.default.red('\n✗ Could not connect to Instant API backend'));
305
+ console.error(chalk_1.default.gray(` Make sure the backend is running at ${backendUrl}`));
306
+ }
307
+ else if (axiosError.response) {
308
+ console.error(chalk_1.default.red('\n✗ Error:'), axiosError.response.data || axiosError.message);
309
+ }
310
+ else {
311
+ console.error(chalk_1.default.red('\n✗ Error:'), axiosError.message);
312
+ }
313
+ }
314
+ else {
315
+ console.error(chalk_1.default.red('\n✗ Unexpected error:'), error.message);
316
+ }
317
+ process.exit(1);
318
+ }
319
+ }
320
+ // CLI setup with yargs
321
+ (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
322
+ .command('expose <targetUrl>', 'Expose a local HTTP endpoint to the internet', (yargs) => {
323
+ return yargs
324
+ .positional('targetUrl', {
325
+ describe: 'Local URL to expose (e.g., http://localhost:3000/api/users)',
326
+ type: 'string',
327
+ demandOption: true,
328
+ })
329
+ .option('backend', {
330
+ alias: 'b',
331
+ describe: 'Instant API backend URL',
332
+ type: 'string',
333
+ default: 'http://localhost:3001',
334
+ });
335
+ }, (argv) => {
336
+ const inputUrl = argv.targetUrl;
337
+ const backendUrl = argv.backend;
338
+ // Resolve target URL (handles both full URLs and function names)
339
+ const targetUrl = resolveTargetUrl(inputUrl);
340
+ // Validate final targetUrl format
341
+ try {
342
+ new URL(targetUrl);
343
+ }
344
+ catch {
345
+ console.error(chalk_1.default.red('✗ Invalid target URL format'));
346
+ console.error(chalk_1.default.gray(' Example: http://localhost:3000/api/users'));
347
+ console.error(chalk_1.default.gray(' Or function name: myFunction (if SDK is running)'));
348
+ process.exit(1);
349
+ }
350
+ exposeRoute(targetUrl, backendUrl);
351
+ })
352
+ .command('config', 'Configure Instant API CLI', (yargs) => {
353
+ return yargs.option('api-key', {
354
+ describe: 'Set your Instant API key',
355
+ type: 'string',
356
+ });
357
+ }, (argv) => {
358
+ const apiKey = argv['api-key'];
359
+ if (apiKey) {
360
+ if (!apiKey.startsWith('ik_')) {
361
+ console.error(chalk_1.default.red('✗ Invalid API key format. Should start with "ik_"'));
362
+ process.exit(1);
363
+ }
364
+ saveApiKey(apiKey);
365
+ console.log(chalk_1.default.green('\n✓ Configuration saved!'));
366
+ console.log(chalk_1.default.gray('\nYou can now use: npx instant-api expose <url>'));
367
+ }
368
+ else {
369
+ // Show current config
370
+ const currentKey = getApiKey();
371
+ if (currentKey) {
372
+ console.log(chalk_1.default.green('API Key:'), chalk_1.default.gray(currentKey.substring(0, 10) + '...'));
373
+ }
374
+ else {
375
+ console.log(chalk_1.default.yellow('No API key configured'));
376
+ console.log(chalk_1.default.gray('\nSet one with: npx instant-api config --api-key ik_...'));
377
+ }
378
+ }
379
+ })
380
+ .demandCommand(1, 'You need to specify a command')
381
+ .help()
382
+ .alias('help', 'h')
383
+ .version('1.0.0')
384
+ .alias('version', 'v')
385
+ .parse();
386
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@instantapihq/cli",
3
+ "version": "1.0.0",
4
+ "description": "CLI for Instant API - expose local routes to the internet",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "instant-api": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "README.md"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "dev": "tsc --watch",
16
+ "start": "node dist/index.js",
17
+ "prepublishOnly": "npm run build"
18
+ },
19
+ "keywords": [
20
+ "api",
21
+ "tunnel",
22
+ "ngrok",
23
+ "proxy",
24
+ "instant-api",
25
+ "cli",
26
+ "expose",
27
+ "localhost"
28
+ ],
29
+ "author": "Treadie, Inc.",
30
+ "license": "FSL-1.1-MIT",
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "https://github.com/treadiehq/instantapi.git",
34
+ "directory": "cli"
35
+ },
36
+ "homepage": "https://github.com/treadiehq/instantapi#readme",
37
+ "bugs": {
38
+ "url": "https://github.com/treadiehq/instantapi/issues"
39
+ },
40
+ "dependencies": {
41
+ "axios": "^1.6.2",
42
+ "chalk": "^4.1.2",
43
+ "yargs": "^17.7.2"
44
+ },
45
+ "devDependencies": {
46
+ "@types/node": "^20.10.5",
47
+ "@types/yargs": "^17.0.32",
48
+ "typescript": "^5.3.3"
49
+ }
50
+ }
51
+