@atoship/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 +121 -0
- package/dist/api.d.ts +25 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +93 -0
- package/dist/api.js.map +1 -0
- package/dist/commands/balance.d.ts +9 -0
- package/dist/commands/balance.d.ts.map +1 -0
- package/dist/commands/balance.js +31 -0
- package/dist/commands/balance.js.map +1 -0
- package/dist/commands/buy.d.ts +14 -0
- package/dist/commands/buy.d.ts.map +1 -0
- package/dist/commands/buy.js +136 -0
- package/dist/commands/buy.js.map +1 -0
- package/dist/commands/config.d.ts +11 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +63 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/labels.d.ts +11 -0
- package/dist/commands/labels.d.ts.map +1 -0
- package/dist/commands/labels.js +56 -0
- package/dist/commands/labels.js.map +1 -0
- package/dist/commands/rate.d.ts +10 -0
- package/dist/commands/rate.d.ts.map +1 -0
- package/dist/commands/rate.js +116 -0
- package/dist/commands/rate.js.map +1 -0
- package/dist/commands/track.d.ts +11 -0
- package/dist/commands/track.d.ts.map +1 -0
- package/dist/commands/track.js +59 -0
- package/dist/commands/track.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/output.d.ts +11 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +143 -0
- package/dist/output.js.map +1 -0
- package/package.json +49 -0
package/README.md
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# @atoship/cli
|
|
2
|
+
|
|
3
|
+
Command-line tool for the [atoship](https://atoship.com) shipping platform. Compare rates, buy labels, and track packages from your terminal.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g @atoship/cli
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Or run without installing:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npx @atoship/cli rate --from "LA, CA 90001" --to "NY, NY 10001" --weight 2oz
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Setup
|
|
18
|
+
|
|
19
|
+
Get your API key at [atoship.com/dashboard/settings/api](https://atoship.com/dashboard/settings/api), then:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
ship config set-key ak_live_your_key_here
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Or set via environment variable:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
export ATOSHIP_API_KEY=ak_live_your_key_here
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Commands
|
|
32
|
+
|
|
33
|
+
### `ship rate` — Compare shipping rates
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
# By city/state
|
|
37
|
+
ship rate --from "Los Angeles, CA 90001" --to "New York, NY 10001" --weight 2oz
|
|
38
|
+
|
|
39
|
+
# By ZIP code
|
|
40
|
+
ship rate --from-zip 90001 --to-zip 10001 --weight 1lb
|
|
41
|
+
|
|
42
|
+
# Filter by carrier
|
|
43
|
+
ship rate --from "LA, CA" --to "NY, NY" --weight 16oz --carrier USPS,FEDEX
|
|
44
|
+
|
|
45
|
+
# Show cheapest per carrier only
|
|
46
|
+
ship rate --from-zip 90001 --to-zip 10001 --weight 2oz --cheapest
|
|
47
|
+
|
|
48
|
+
# With package dimensions
|
|
49
|
+
ship rate --from "LA, CA" --to "NY, NY" --weight 2oz --length 12 --width 8 --height 6
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### `ship buy` — Purchase a shipping label
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
# From a rate ID (run "ship rate" first)
|
|
56
|
+
ship buy --rate rate_abc123 \
|
|
57
|
+
--from "John Doe|123 Main St|Los Angeles|CA|90001" \
|
|
58
|
+
--to "Jane Smith|456 Oak Ave|New York|NY|10001" \
|
|
59
|
+
--weight 2oz
|
|
60
|
+
|
|
61
|
+
# With carrier and service
|
|
62
|
+
ship buy --from "John Doe|123 Main St|Los Angeles|CA|90001" \
|
|
63
|
+
--to "Jane Smith|456 Oak Ave|New York|NY|10001" \
|
|
64
|
+
--weight 1lb --carrier USPS --service "Priority Mail"
|
|
65
|
+
|
|
66
|
+
# With options
|
|
67
|
+
ship buy --from "..." --to "..." --weight 2oz \
|
|
68
|
+
--signature --insurance 100 --reference "ORDER-123"
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### `ship track` — Track a package
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
ship track 9400111899223456789012
|
|
75
|
+
ship track 9400111899223456789012 --carrier USPS
|
|
76
|
+
ship track 1Z999AA10123456784 --watch # Poll every 5min until delivered
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### `ship labels` — List labels
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
ship labels
|
|
83
|
+
ship labels --status shipped
|
|
84
|
+
ship labels --carrier FEDEX --status delivered
|
|
85
|
+
ship labels --limit 50 --page 2
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### `ship balance` — Account info
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
ship balance
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### `ship config` — Manage configuration
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
ship config set-key ak_live_... # Save API key
|
|
98
|
+
ship config set-url https://... # Custom API URL
|
|
99
|
+
ship config show # View current config
|
|
100
|
+
ship config clear # Remove saved config
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Output Format
|
|
104
|
+
|
|
105
|
+
All commands support `--json` for machine-readable output:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
ship labels --json | jq '.data[].tracking_number'
|
|
109
|
+
ship balance --json | jq '.balance.available'
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Environment Variables
|
|
113
|
+
|
|
114
|
+
| Variable | Description |
|
|
115
|
+
|----------|-------------|
|
|
116
|
+
| `ATOSHIP_API_KEY` | Your atoship API key (overrides saved config) |
|
|
117
|
+
| `ATOSHIP_BASE_URL` | Custom API base URL (default: https://atoship.com) |
|
|
118
|
+
|
|
119
|
+
## Requirements
|
|
120
|
+
|
|
121
|
+
- Node.js >= 18
|
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight HTTP client for atoship CLI
|
|
3
|
+
* Shared by all commands — reads API key from env or config file.
|
|
4
|
+
*/
|
|
5
|
+
export declare const CONFIG_FILE: string;
|
|
6
|
+
export interface CliConfig {
|
|
7
|
+
apiKey?: string;
|
|
8
|
+
baseUrl?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function readConfig(): CliConfig;
|
|
11
|
+
export declare function writeConfig(config: CliConfig): void;
|
|
12
|
+
export declare function getApiKey(): string;
|
|
13
|
+
export declare function getBaseUrl(): string;
|
|
14
|
+
export declare class ApiError extends Error {
|
|
15
|
+
statusCode: number;
|
|
16
|
+
data?: any | undefined;
|
|
17
|
+
constructor(message: string, statusCode: number, data?: any | undefined);
|
|
18
|
+
}
|
|
19
|
+
export declare function apiRequest<T = any>(method: string, path: string, body?: Record<string, any>, params?: Record<string, any>): Promise<T>;
|
|
20
|
+
export declare const api: {
|
|
21
|
+
get: <T = any>(path: string, params?: Record<string, any>) => Promise<T>;
|
|
22
|
+
post: <T = any>(path: string, body?: Record<string, any>) => Promise<T>;
|
|
23
|
+
del: <T = any>(path: string) => Promise<T>;
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,eAAO,MAAM,WAAW,QAAkC,CAAA;AAE1D,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,UAAU,IAAI,SAAS,CAOtC;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAGnD;AAID,wBAAgB,SAAS,IAAI,MAAM,CAUlC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAID,qBAAa,QAAS,SAAQ,KAAK;IAGxB,UAAU,EAAE,MAAM;IAClB,IAAI,CAAC,EAAE,GAAG;gBAFjB,OAAO,EAAE,MAAM,EACR,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,GAAG,YAAA;CAKpB;AAED,wBAAsB,UAAU,CAAC,CAAC,GAAG,GAAG,EACtC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC3B,OAAO,CAAC,CAAC,CAAC,CAmCZ;AAED,eAAO,MAAM,GAAG;UACR,CAAC,cAAc,MAAM,WAAW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;WAClD,CAAC,cAAc,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;UAClD,CAAC,cAAc,MAAM;CAC5B,CAAA"}
|
package/dist/api.js
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight HTTP client for atoship CLI
|
|
3
|
+
* Shared by all commands — reads API key from env or config file.
|
|
4
|
+
*/
|
|
5
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
|
|
6
|
+
import { homedir } from 'node:os';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
// ── Config file management ─────────────────────────────────────────
|
|
9
|
+
const CONFIG_DIR = join(homedir(), '.config', 'atoship');
|
|
10
|
+
export const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
|
|
11
|
+
export function readConfig() {
|
|
12
|
+
try {
|
|
13
|
+
if (existsSync(CONFIG_FILE)) {
|
|
14
|
+
return JSON.parse(readFileSync(CONFIG_FILE, 'utf-8'));
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
catch { }
|
|
18
|
+
return {};
|
|
19
|
+
}
|
|
20
|
+
export function writeConfig(config) {
|
|
21
|
+
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
22
|
+
writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
23
|
+
}
|
|
24
|
+
// ── API key resolution ─────────────────────────────────────────────
|
|
25
|
+
export function getApiKey() {
|
|
26
|
+
const fromEnv = process.env.ATOSHIP_API_KEY;
|
|
27
|
+
if (fromEnv)
|
|
28
|
+
return fromEnv;
|
|
29
|
+
const fromConfig = readConfig().apiKey;
|
|
30
|
+
if (fromConfig)
|
|
31
|
+
return fromConfig;
|
|
32
|
+
throw new Error('No API key found.\n\n' +
|
|
33
|
+
'Set it with: ship config set-key ak_live_...\n' +
|
|
34
|
+
'Or via env: ATOSHIP_API_KEY=ak_live_... ship <command>');
|
|
35
|
+
}
|
|
36
|
+
export function getBaseUrl() {
|
|
37
|
+
return process.env.ATOSHIP_BASE_URL || readConfig().baseUrl || 'https://atoship.com';
|
|
38
|
+
}
|
|
39
|
+
// ── HTTP client ────────────────────────────────────────────────────
|
|
40
|
+
export class ApiError extends Error {
|
|
41
|
+
statusCode;
|
|
42
|
+
data;
|
|
43
|
+
constructor(message, statusCode, data) {
|
|
44
|
+
super(message);
|
|
45
|
+
this.statusCode = statusCode;
|
|
46
|
+
this.data = data;
|
|
47
|
+
this.name = 'ApiError';
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export async function apiRequest(method, path, body, params) {
|
|
51
|
+
const apiKey = getApiKey();
|
|
52
|
+
const baseUrl = getBaseUrl();
|
|
53
|
+
let url = `${baseUrl}${path}`;
|
|
54
|
+
if (params) {
|
|
55
|
+
const qs = new URLSearchParams();
|
|
56
|
+
for (const [k, v] of Object.entries(params)) {
|
|
57
|
+
if (v !== undefined && v !== null)
|
|
58
|
+
qs.set(k, String(v));
|
|
59
|
+
}
|
|
60
|
+
const qstr = qs.toString();
|
|
61
|
+
if (qstr)
|
|
62
|
+
url += `?${qstr}`;
|
|
63
|
+
}
|
|
64
|
+
const res = await fetch(url, {
|
|
65
|
+
method,
|
|
66
|
+
headers: {
|
|
67
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
68
|
+
'Content-Type': 'application/json',
|
|
69
|
+
'User-Agent': 'atoship-cli/1.0.0',
|
|
70
|
+
},
|
|
71
|
+
...(body && method !== 'GET' ? { body: JSON.stringify(body) } : {}),
|
|
72
|
+
signal: AbortSignal.timeout(30_000),
|
|
73
|
+
});
|
|
74
|
+
const text = await res.text();
|
|
75
|
+
let data;
|
|
76
|
+
try {
|
|
77
|
+
data = text ? JSON.parse(text) : {};
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
data = { message: text };
|
|
81
|
+
}
|
|
82
|
+
if (!res.ok) {
|
|
83
|
+
const msg = data?.error?.message || data?.error || data?.message || `HTTP ${res.status}`;
|
|
84
|
+
throw new ApiError(String(msg), res.status, data);
|
|
85
|
+
}
|
|
86
|
+
return data;
|
|
87
|
+
}
|
|
88
|
+
export const api = {
|
|
89
|
+
get: (path, params) => apiRequest('GET', path, undefined, params),
|
|
90
|
+
post: (path, body) => apiRequest('POST', path, body),
|
|
91
|
+
del: (path) => apiRequest('DELETE', path),
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"balance.d.ts","sourceRoot":"","sources":["../../src/commands/balance.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,wBAAgB,cAAc,IAAI,OAAO,CAoBxC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ship balance — show account info and wallet balance
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* ship balance
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from 'commander';
|
|
8
|
+
import { api } from '../api.js';
|
|
9
|
+
import { printAccount, printError } from '../output.js';
|
|
10
|
+
export function balanceCommand() {
|
|
11
|
+
const cmd = new Command('balance');
|
|
12
|
+
cmd
|
|
13
|
+
.description('Show account info and wallet balance')
|
|
14
|
+
.option('--json', 'Output raw JSON')
|
|
15
|
+
.action(async (opts) => {
|
|
16
|
+
try {
|
|
17
|
+
const result = await api.get('/api/v1/account');
|
|
18
|
+
if (opts.json) {
|
|
19
|
+
console.log(JSON.stringify(result, null, 2));
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
printAccount(result);
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
25
|
+
printError(e);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
return cmd;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=balance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"balance.js","sourceRoot":"","sources":["../../src/commands/balance.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAC/B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEvD,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC,CAAA;IAClC,GAAG;SACA,WAAW,CAAC,sCAAsC,CAAC;SACnD,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAAC;SACnC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;YAC/C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;gBAC5C,OAAM;YACR,CAAC;YACD,YAAY,CAAC,MAAM,CAAC,CAAA;QACtB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,UAAU,CAAC,CAAC,CAAC,CAAA;YACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC,CAAC,CAAA;IAEJ,OAAO,GAAG,CAAA;AACZ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ship buy — purchase a shipping label
|
|
3
|
+
*
|
|
4
|
+
* Usage (from rate ID):
|
|
5
|
+
* ship buy --rate rate_abc123
|
|
6
|
+
*
|
|
7
|
+
* Usage (inline):
|
|
8
|
+
* ship buy --from "John Doe|123 Main St|Los Angeles|CA|90001" \
|
|
9
|
+
* --to "Jane Smith|456 Oak Ave|New York|NY|10001" \
|
|
10
|
+
* --weight 2oz --carrier USPS --service "Priority Mail"
|
|
11
|
+
*/
|
|
12
|
+
import { Command } from 'commander';
|
|
13
|
+
export declare function buyCommand(): Command;
|
|
14
|
+
//# sourceMappingURL=buy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buy.d.ts","sourceRoot":"","sources":["../../src/commands/buy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA+BnC,wBAAgB,UAAU,IAAI,OAAO,CAqGpC"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ship buy — purchase a shipping label
|
|
3
|
+
*
|
|
4
|
+
* Usage (from rate ID):
|
|
5
|
+
* ship buy --rate rate_abc123
|
|
6
|
+
*
|
|
7
|
+
* Usage (inline):
|
|
8
|
+
* ship buy --from "John Doe|123 Main St|Los Angeles|CA|90001" \
|
|
9
|
+
* --to "Jane Smith|456 Oak Ave|New York|NY|10001" \
|
|
10
|
+
* --weight 2oz --carrier USPS --service "Priority Mail"
|
|
11
|
+
*/
|
|
12
|
+
import { Command } from 'commander';
|
|
13
|
+
import chalk from 'chalk';
|
|
14
|
+
import { api } from '../api.js';
|
|
15
|
+
import { printLabel, printError } from '../output.js';
|
|
16
|
+
/** Parse "Name|Street|City|State|ZIP" format */
|
|
17
|
+
function parseAddress(input, role) {
|
|
18
|
+
const parts = input.split('|').map(p => p.trim());
|
|
19
|
+
if (parts.length < 5) {
|
|
20
|
+
throw new Error(`Invalid ${role} address format. Use: "Name|Street|City|State|ZIP"\n` +
|
|
21
|
+
` Example: "John Doe|123 Main St|Los Angeles|CA|90001"`);
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
name: parts[0],
|
|
25
|
+
street1: parts[1],
|
|
26
|
+
street2: parts[2] && parts.length > 5 ? parts[2] : '',
|
|
27
|
+
city: parts.length > 5 ? parts[3] : parts[2],
|
|
28
|
+
state: parts.length > 5 ? parts[4] : parts[3],
|
|
29
|
+
zip: parts.length > 5 ? parts[5] : parts[4],
|
|
30
|
+
country: 'US',
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function parseWeight(input) {
|
|
34
|
+
const match = input.toLowerCase().match(/^([\d.]+)\s*(oz|lb|g|kg)?$/);
|
|
35
|
+
if (!match)
|
|
36
|
+
throw new Error(`Invalid weight: "${input}". Use e.g. 2oz, 1lb`);
|
|
37
|
+
return { weight: parseFloat(match[1]), weight_unit: match[2] || 'oz' };
|
|
38
|
+
}
|
|
39
|
+
export function buyCommand() {
|
|
40
|
+
const cmd = new Command('buy');
|
|
41
|
+
cmd
|
|
42
|
+
.description('Purchase a shipping label')
|
|
43
|
+
.option('--rate <rate_id>', 'Rate ID from "ship rate" (recommended)')
|
|
44
|
+
.option('--from <address>', 'Sender: "Name|Street|City|State|ZIP"')
|
|
45
|
+
.option('--to <address>', 'Recipient: "Name|Street|City|State|ZIP"')
|
|
46
|
+
.option('--weight <weight>', 'Package weight (e.g. 2oz, 1lb)', '1lb')
|
|
47
|
+
.option('--carrier <name>', 'Carrier: USPS, FEDEX, UPS')
|
|
48
|
+
.option('--service <name>', 'Service name (e.g. "Priority Mail")')
|
|
49
|
+
.option('--service-code <code>', 'Service code (e.g. usps_priority)')
|
|
50
|
+
.option('--format <fmt>', 'Label format: pdf, png, zpl', 'pdf')
|
|
51
|
+
.option('--reference <ref>', 'Your reference number/order ID')
|
|
52
|
+
.option('--insurance <amount>', 'Insurance amount in USD')
|
|
53
|
+
.option('--signature', 'Require signature on delivery')
|
|
54
|
+
.option('--json', 'Output raw JSON')
|
|
55
|
+
.action(async (opts) => {
|
|
56
|
+
try {
|
|
57
|
+
let body;
|
|
58
|
+
if (opts.rate) {
|
|
59
|
+
// ── Simple: just a rate ID ───────────────────────────────
|
|
60
|
+
// The API accepts rate_id and fills in the rest automatically.
|
|
61
|
+
// We still need from/to/parcel for the create step.
|
|
62
|
+
// Prompt user if not provided.
|
|
63
|
+
if (!opts.from || !opts.to) {
|
|
64
|
+
console.error(chalk.red('\n When using --rate, also provide --from and --to addresses.\n'));
|
|
65
|
+
console.error(chalk.gray(' Example:'));
|
|
66
|
+
console.error(chalk.gray(' ship buy --rate rate_abc123 \\'));
|
|
67
|
+
console.error(chalk.gray(' --from "John Doe|123 Main St|LA|CA|90001" \\'));
|
|
68
|
+
console.error(chalk.gray(' --to "Jane Smith|456 Oak Ave|NY|NY|10001" --weight 2oz\n'));
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
const { weight, weight_unit } = parseWeight(opts.weight);
|
|
72
|
+
body = {
|
|
73
|
+
rate_id: opts.rate,
|
|
74
|
+
from_address: parseAddress(opts.from, 'sender'),
|
|
75
|
+
to_address: parseAddress(opts.to, 'recipient'),
|
|
76
|
+
parcel: { weight, weight_unit, length: 6, width: 4, height: 4 },
|
|
77
|
+
label_format: opts.format,
|
|
78
|
+
...(opts.reference && { reference: opts.reference }),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// ── Full: carrier + service specified ────────────────────
|
|
83
|
+
if (!opts.from || !opts.to) {
|
|
84
|
+
console.error(chalk.red('\n Error: --from and --to are required\n'));
|
|
85
|
+
cmd.help();
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const { weight, weight_unit } = parseWeight(opts.weight);
|
|
89
|
+
body = {
|
|
90
|
+
from_address: parseAddress(opts.from, 'sender'),
|
|
91
|
+
to_address: parseAddress(opts.to, 'recipient'),
|
|
92
|
+
parcel: { weight, weight_unit, length: 6, width: 4, height: 4 },
|
|
93
|
+
label_format: opts.format,
|
|
94
|
+
...(opts.carrier && { carrier: opts.carrier.toUpperCase() }),
|
|
95
|
+
...(opts.service && { service: opts.service }),
|
|
96
|
+
...(opts.serviceCode && { service_code: opts.serviceCode }),
|
|
97
|
+
...(opts.reference && { reference: opts.reference }),
|
|
98
|
+
...(opts.insurance || opts.signature ? {
|
|
99
|
+
options: {
|
|
100
|
+
...(opts.insurance && { insurance_amount: parseFloat(opts.insurance) }),
|
|
101
|
+
...(opts.signature && { signature_confirmation: true }),
|
|
102
|
+
},
|
|
103
|
+
} : {}),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
console.log(chalk.gray(' Creating label...'));
|
|
107
|
+
// Step 1: create draft
|
|
108
|
+
const draft = await api.post('/api/v1/labels', body);
|
|
109
|
+
if (!draft.id) {
|
|
110
|
+
if (opts.json) {
|
|
111
|
+
console.log(JSON.stringify(draft, null, 2));
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
console.log(JSON.stringify(draft, null, 2));
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
// Step 2: purchase
|
|
118
|
+
console.log(chalk.gray(' Purchasing...'));
|
|
119
|
+
const label = await api.post(`/api/v1/labels/${draft.id}/purchase`);
|
|
120
|
+
if (opts.json) {
|
|
121
|
+
console.log(JSON.stringify(label, null, 2));
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
printLabel(label);
|
|
125
|
+
if (label.tracking_number) {
|
|
126
|
+
console.log(chalk.gray(` Track with: ship track ${label.tracking_number}\n`));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch (e) {
|
|
130
|
+
printError(e);
|
|
131
|
+
process.exit(1);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
return cmd;
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=buy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buy.js","sourceRoot":"","sources":["../../src/commands/buy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ship config — manage CLI configuration
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* ship config set-key ak_live_xxx
|
|
6
|
+
* ship config show
|
|
7
|
+
* ship config clear
|
|
8
|
+
*/
|
|
9
|
+
import { Command } from 'commander';
|
|
10
|
+
export declare function configCommand(): Command;
|
|
11
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,wBAAgB,aAAa,IAAI,OAAO,CAsDvC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ship config — manage CLI configuration
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* ship config set-key ak_live_xxx
|
|
6
|
+
* ship config show
|
|
7
|
+
* ship config clear
|
|
8
|
+
*/
|
|
9
|
+
import { Command } from 'commander';
|
|
10
|
+
import chalk from 'chalk';
|
|
11
|
+
import { readConfig, writeConfig, CONFIG_FILE } from '../api.js';
|
|
12
|
+
export function configCommand() {
|
|
13
|
+
const cmd = new Command('config');
|
|
14
|
+
cmd.description('Manage CLI configuration (API key, base URL)');
|
|
15
|
+
cmd
|
|
16
|
+
.command('set-key <api_key>')
|
|
17
|
+
.description('Save your atoship API key')
|
|
18
|
+
.action((apiKey) => {
|
|
19
|
+
if (!apiKey.startsWith('ak_')) {
|
|
20
|
+
console.warn(chalk.yellow('\n Warning: API keys typically start with "ak_live_" or "ak_test_"\n'));
|
|
21
|
+
}
|
|
22
|
+
const config = readConfig();
|
|
23
|
+
writeConfig({ ...config, apiKey });
|
|
24
|
+
console.log(chalk.green('\n API key saved to ' + CONFIG_FILE + '\n'));
|
|
25
|
+
console.log(chalk.gray(' You can also set it via: export ATOSHIP_API_KEY=' + apiKey + '\n'));
|
|
26
|
+
});
|
|
27
|
+
cmd
|
|
28
|
+
.command('set-url <base_url>')
|
|
29
|
+
.description('Set a custom API base URL (default: https://atoship.com)')
|
|
30
|
+
.action((baseUrl) => {
|
|
31
|
+
const config = readConfig();
|
|
32
|
+
writeConfig({ ...config, baseUrl });
|
|
33
|
+
console.log(chalk.green(`\n Base URL saved: ${baseUrl}\n`));
|
|
34
|
+
});
|
|
35
|
+
cmd
|
|
36
|
+
.command('show')
|
|
37
|
+
.description('Show current configuration')
|
|
38
|
+
.action(() => {
|
|
39
|
+
const config = readConfig();
|
|
40
|
+
console.log('');
|
|
41
|
+
if (config.apiKey) {
|
|
42
|
+
const preview = config.apiKey.slice(0, 12) + '...' + config.apiKey.slice(-4);
|
|
43
|
+
console.log(` API Key: ${chalk.cyan(preview)}`);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
console.log(` API Key: ${chalk.yellow('not set')}`);
|
|
47
|
+
}
|
|
48
|
+
if (config.baseUrl) {
|
|
49
|
+
console.log(` Base URL: ${config.baseUrl}`);
|
|
50
|
+
}
|
|
51
|
+
console.log(` Config: ${chalk.gray(CONFIG_FILE)}`);
|
|
52
|
+
console.log('');
|
|
53
|
+
});
|
|
54
|
+
cmd
|
|
55
|
+
.command('clear')
|
|
56
|
+
.description('Clear saved configuration')
|
|
57
|
+
.action(() => {
|
|
58
|
+
writeConfig({});
|
|
59
|
+
console.log(chalk.yellow('\n Configuration cleared.\n'));
|
|
60
|
+
});
|
|
61
|
+
return cmd;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ship labels — list shipping labels
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* ship labels
|
|
6
|
+
* ship labels --status shipped --carrier USPS
|
|
7
|
+
* ship labels --limit 50 --json
|
|
8
|
+
*/
|
|
9
|
+
import { Command } from 'commander';
|
|
10
|
+
export declare function labelsCommand(): Command;
|
|
11
|
+
//# sourceMappingURL=labels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"labels.d.ts","sourceRoot":"","sources":["../../src/commands/labels.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,wBAAgB,aAAa,IAAI,OAAO,CA4CvC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ship labels — list shipping labels
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* ship labels
|
|
6
|
+
* ship labels --status shipped --carrier USPS
|
|
7
|
+
* ship labels --limit 50 --json
|
|
8
|
+
*/
|
|
9
|
+
import { Command } from 'commander';
|
|
10
|
+
import { api } from '../api.js';
|
|
11
|
+
import { printLabelsList, printError } from '../output.js';
|
|
12
|
+
export function labelsCommand() {
|
|
13
|
+
const cmd = new Command('labels');
|
|
14
|
+
cmd
|
|
15
|
+
.description('List your shipping labels')
|
|
16
|
+
.option('--status <status>', 'Filter: draft, purchased, shipped, delivered, returned, voided')
|
|
17
|
+
.option('--carrier <name>', 'Filter by carrier: USPS, FEDEX, UPS')
|
|
18
|
+
.option('--order <order_id>', 'Filter by order ID')
|
|
19
|
+
.option('--page <n>', 'Page number', '1')
|
|
20
|
+
.option('--limit <n>', 'Results per page (max 100)', '20')
|
|
21
|
+
.option('--json', 'Output raw JSON')
|
|
22
|
+
.action(async (opts) => {
|
|
23
|
+
try {
|
|
24
|
+
const params = {
|
|
25
|
+
page: parseInt(opts.page),
|
|
26
|
+
limit: parseInt(opts.limit),
|
|
27
|
+
};
|
|
28
|
+
if (opts.status)
|
|
29
|
+
params.status = opts.status.toLowerCase();
|
|
30
|
+
if (opts.carrier)
|
|
31
|
+
params.carrier = opts.carrier.toUpperCase();
|
|
32
|
+
if (opts.order)
|
|
33
|
+
params.order_id = opts.order;
|
|
34
|
+
const result = await api.get('/api/v1/labels', params);
|
|
35
|
+
const labels = result.data || result.labels || result || [];
|
|
36
|
+
if (opts.json) {
|
|
37
|
+
console.log(JSON.stringify(result, null, 2));
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
printLabelsList(Array.isArray(labels) ? labels : []);
|
|
41
|
+
if (result.pagination) {
|
|
42
|
+
const { page, pages, total } = result.pagination;
|
|
43
|
+
const p = result.pagination;
|
|
44
|
+
if (p.has_more) {
|
|
45
|
+
console.log(` Page ${page} of ${pages} (${total} total) — use --page ${page + 1} for more\n`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch (e) {
|
|
50
|
+
printError(e);
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
return cmd;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=labels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"labels.js","sourceRoot":"","sources":["../../src/commands/labels.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAC/B,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAE1D,MAAM,UAAU,aAAa;IAC3B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAA;IACjC,GAAG;SACA,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,mBAAmB,EAAE,gEAAgE,CAAC;SAC7F,MAAM,CAAC,kBAAkB,EAAE,qCAAqC,CAAC;SACjE,MAAM,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;SAClD,MAAM,CAAC,YAAY,EAAE,aAAa,EAAE,GAAG,CAAC;SACxC,MAAM,CAAC,aAAa,EAAE,4BAA4B,EAAE,IAAI,CAAC;SACzD,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAAC;SACnC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,MAAM,GAAwB;gBAClC,IAAI,EAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;aAC5B,CAAA;YACD,IAAI,IAAI,CAAC,MAAM;gBAAG,MAAM,CAAC,MAAM,GAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAA;YAC5D,IAAI,IAAI,CAAC,OAAO;gBAAE,MAAM,CAAC,OAAO,GAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAA;YAC9D,IAAI,IAAI,CAAC,KAAK;gBAAI,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAA;YAE9C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAA;YACtD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,IAAI,EAAE,CAAA;YAE3D,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;gBAC5C,OAAM;YACR,CAAC;YAED,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YAEpD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACtB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,UAAU,CAAA;gBAChD,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAAA;gBAC3B,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;oBACf,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,KAAK,KAAK,KAAK,wBAAwB,IAAI,GAAG,CAAC,aAAa,CAAC,CAAA;gBAChG,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,UAAU,CAAC,CAAC,CAAC,CAAA;YACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC,CAAC,CAAA;IAEJ,OAAO,GAAG,CAAA;AACZ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ship rate — get shipping rates
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* ship rate --from "Los Angeles, CA 90001" --to "New York, NY 10001" --weight 2oz
|
|
6
|
+
* ship rate --from-zip 90001 --to-zip 10001 --weight 1lb --carrier USPS
|
|
7
|
+
*/
|
|
8
|
+
import { Command } from 'commander';
|
|
9
|
+
export declare function rateCommand(): Command;
|
|
10
|
+
//# sourceMappingURL=rate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate.d.ts","sourceRoot":"","sources":["../../src/commands/rate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAmCnC,wBAAgB,WAAW,IAAI,OAAO,CAkFrC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ship rate — get shipping rates
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* ship rate --from "Los Angeles, CA 90001" --to "New York, NY 10001" --weight 2oz
|
|
6
|
+
* ship rate --from-zip 90001 --to-zip 10001 --weight 1lb --carrier USPS
|
|
7
|
+
*/
|
|
8
|
+
import { Command } from 'commander';
|
|
9
|
+
import chalk from 'chalk';
|
|
10
|
+
import { api } from '../api.js';
|
|
11
|
+
import { printRates, printError } from '../output.js';
|
|
12
|
+
/** Parse weight strings like "2oz", "1.5lb", "500g", "1kg" */
|
|
13
|
+
function parseWeight(input) {
|
|
14
|
+
const match = input.toLowerCase().match(/^([\d.]+)\s*(oz|lb|g|kg)?$/);
|
|
15
|
+
if (!match)
|
|
16
|
+
throw new Error(`Invalid weight format: "${input}". Use e.g. 2oz, 1lb, 500g`);
|
|
17
|
+
return { weight: parseFloat(match[1]), unit: match[2] || 'oz' };
|
|
18
|
+
}
|
|
19
|
+
/** Parse "City, State ZIP" or just ZIP into address object */
|
|
20
|
+
function parseLocation(input, name = 'Sender') {
|
|
21
|
+
// Just a ZIP code
|
|
22
|
+
if (/^\d{5}(-\d{4})?$/.test(input.trim())) {
|
|
23
|
+
return { name, street1: '1 Main St', city: '', state: '', zip: input.trim(), country: 'US' };
|
|
24
|
+
}
|
|
25
|
+
// "City, State ZIP" or "City, State"
|
|
26
|
+
const match = input.match(/^(.+),\s*([A-Z]{2})\s*(\d{5})?$/i);
|
|
27
|
+
if (match) {
|
|
28
|
+
return {
|
|
29
|
+
name,
|
|
30
|
+
street1: '1 Main St',
|
|
31
|
+
city: match[1].trim(),
|
|
32
|
+
state: match[2].toUpperCase(),
|
|
33
|
+
zip: match[3] || '',
|
|
34
|
+
country: 'US',
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
throw new Error(`Cannot parse location: "${input}". Use "City, State ZIP" or ZIP code`);
|
|
38
|
+
}
|
|
39
|
+
export function rateCommand() {
|
|
40
|
+
const cmd = new Command('rate');
|
|
41
|
+
cmd
|
|
42
|
+
.description('Get shipping rates from multiple carriers')
|
|
43
|
+
.option('--from <location>', 'Origin location: "City, ST ZIP" or ZIP code')
|
|
44
|
+
.option('--to <location>', 'Destination: "City, ST ZIP" or ZIP code')
|
|
45
|
+
.option('--from-zip <zip>', 'Origin ZIP code (shorthand)')
|
|
46
|
+
.option('--to-zip <zip>', 'Destination ZIP code (shorthand)')
|
|
47
|
+
.option('--weight <weight>', 'Package weight (e.g. 2oz, 1lb, 500g)', '1lb')
|
|
48
|
+
.option('--length <in>', 'Length in inches')
|
|
49
|
+
.option('--width <in>', 'Width in inches')
|
|
50
|
+
.option('--height <in>', 'Height in inches')
|
|
51
|
+
.option('--carrier <carriers>', 'Filter carriers: USPS,FEDEX,UPS')
|
|
52
|
+
.option('--cheapest', 'Show only the cheapest rate per carrier')
|
|
53
|
+
.option('--json', 'Output raw JSON')
|
|
54
|
+
.action(async (opts) => {
|
|
55
|
+
try {
|
|
56
|
+
const fromStr = opts.from || opts.fromZip;
|
|
57
|
+
const toStr = opts.to || opts.toZip;
|
|
58
|
+
if (!fromStr || !toStr) {
|
|
59
|
+
console.error(chalk.red('\n Error: --from and --to are required\n'));
|
|
60
|
+
cmd.help();
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const fromAddr = parseLocation(fromStr, 'Sender');
|
|
64
|
+
const toAddr = parseLocation(toStr, 'Recipient');
|
|
65
|
+
const { weight, unit: weightUnit } = parseWeight(opts.weight);
|
|
66
|
+
const body = {
|
|
67
|
+
from_address: fromAddr,
|
|
68
|
+
to_address: toAddr,
|
|
69
|
+
parcel: {
|
|
70
|
+
weight,
|
|
71
|
+
weight_unit: weightUnit,
|
|
72
|
+
// API requires all dimensions; default to 6x4x4 in if not provided
|
|
73
|
+
length: opts.length ? parseFloat(opts.length) : 6,
|
|
74
|
+
width: opts.width ? parseFloat(opts.width) : 4,
|
|
75
|
+
height: opts.height ? parseFloat(opts.height) : 4,
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
if (opts.carrier) {
|
|
79
|
+
body.carriers = opts.carrier.split(',').map((c) => c.trim().toUpperCase());
|
|
80
|
+
}
|
|
81
|
+
console.log(chalk.gray(` Fetching rates from ${fromStr} → ${toStr} (${opts.weight})...`));
|
|
82
|
+
const result = await api.post('/api/v1/rates', body);
|
|
83
|
+
let rates = result.data || result.rates || result || [];
|
|
84
|
+
if (opts.cheapest && Array.isArray(rates)) {
|
|
85
|
+
const byCarrier = new Map();
|
|
86
|
+
for (const r of rates) {
|
|
87
|
+
const key = r.carrier;
|
|
88
|
+
if (!byCarrier.has(key) || (r.rate ?? r.cost) < (byCarrier.get(key).rate ?? byCarrier.get(key).cost)) {
|
|
89
|
+
byCarrier.set(key, r);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
rates = Array.from(byCarrier.values());
|
|
93
|
+
}
|
|
94
|
+
if (opts.json) {
|
|
95
|
+
console.log(JSON.stringify(rates, null, 2));
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (Array.isArray(rates)) {
|
|
99
|
+
printRates(rates);
|
|
100
|
+
if (rates.length > 0) {
|
|
101
|
+
const first = rates[0];
|
|
102
|
+
console.log(chalk.gray(` Tip: Purchase with ship buy --rate ${first.id || '<rate_id>'}\n`));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
console.log(JSON.stringify(result, null, 2));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch (e) {
|
|
110
|
+
printError(e);
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
return cmd;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=rate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate.js","sourceRoot":"","sources":["../../src/commands/rate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ship track — track a package
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* ship track 9400111899223456789012
|
|
6
|
+
* ship track 9400111899223456789012 --carrier USPS
|
|
7
|
+
* ship track 9400111899223456789012 --watch
|
|
8
|
+
*/
|
|
9
|
+
import { Command } from 'commander';
|
|
10
|
+
export declare function trackCommand(): Command;
|
|
11
|
+
//# sourceMappingURL=track.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../../src/commands/track.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKnC,wBAAgB,YAAY,IAAI,OAAO,CA+CtC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ship track — track a package
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* ship track 9400111899223456789012
|
|
6
|
+
* ship track 9400111899223456789012 --carrier USPS
|
|
7
|
+
* ship track 9400111899223456789012 --watch
|
|
8
|
+
*/
|
|
9
|
+
import { Command } from 'commander';
|
|
10
|
+
import chalk from 'chalk';
|
|
11
|
+
import { api } from '../api.js';
|
|
12
|
+
import { printTracking, printError } from '../output.js';
|
|
13
|
+
export function trackCommand() {
|
|
14
|
+
const cmd = new Command('track');
|
|
15
|
+
cmd
|
|
16
|
+
.description('Track a package by tracking number')
|
|
17
|
+
.argument('<tracking_number>', 'Package tracking number')
|
|
18
|
+
.option('--carrier <name>', 'Carrier hint: USPS, FEDEX, UPS (speeds up lookup)')
|
|
19
|
+
.option('--watch', 'Poll every 5 minutes until delivered')
|
|
20
|
+
.option('--json', 'Output raw JSON')
|
|
21
|
+
.action(async (trackingNumber, opts) => {
|
|
22
|
+
try {
|
|
23
|
+
const params = {};
|
|
24
|
+
if (opts.carrier)
|
|
25
|
+
params.carrier = opts.carrier.toUpperCase();
|
|
26
|
+
const track = async () => {
|
|
27
|
+
const result = await api.get(`/api/v1/tracking/${trackingNumber}`, params);
|
|
28
|
+
if (opts.json) {
|
|
29
|
+
console.log(JSON.stringify(result, null, 2));
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
printTracking(result);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
if (!opts.watch) {
|
|
36
|
+
await track();
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
// Watch mode: poll until delivered
|
|
40
|
+
console.log(chalk.gray(` Watching ${trackingNumber} (Ctrl+C to stop)...\n`));
|
|
41
|
+
while (true) {
|
|
42
|
+
const result = await track();
|
|
43
|
+
const status = (result?.status || '').toLowerCase();
|
|
44
|
+
if (status === 'delivered') {
|
|
45
|
+
console.log(chalk.green(' Package delivered!'));
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
console.log(chalk.gray(` Next check in 5 minutes...`));
|
|
49
|
+
await new Promise(r => setTimeout(r, 5 * 60 * 1000));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
printError(e);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
return cmd;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=track.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track.js","sourceRoot":"","sources":["../../src/commands/track.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAC/B,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAExD,MAAM,UAAU,YAAY;IAC1B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IAChC,GAAG;SACA,WAAW,CAAC,oCAAoC,CAAC;SACjD,QAAQ,CAAC,mBAAmB,EAAE,yBAAyB,CAAC;SACxD,MAAM,CAAC,kBAAkB,EAAE,mDAAmD,CAAC;SAC/E,MAAM,CAAC,SAAS,EAAE,sCAAsC,CAAC;SACzD,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAAC;SACnC,MAAM,CAAC,KAAK,EAAE,cAAsB,EAAE,IAAI,EAAE,EAAE;QAC7C,IAAI,CAAC;YACH,MAAM,MAAM,GAA2B,EAAE,CAAA;YACzC,IAAI,IAAI,CAAC,OAAO;gBAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAA;YAE7D,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE;gBACvB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,oBAAoB,cAAc,EAAE,EAAE,MAAM,CAAC,CAAA;gBAC1E,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;oBAC5C,OAAO,MAAM,CAAA;gBACf,CAAC;gBACD,aAAa,CAAC,MAAM,CAAC,CAAA;gBACrB,OAAO,MAAM,CAAA;YACf,CAAC,CAAA;YAED,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAChB,MAAM,KAAK,EAAE,CAAA;gBACb,OAAM;YACR,CAAC;YAED,mCAAmC;YACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,cAAc,wBAAwB,CAAC,CAAC,CAAA;YAC7E,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,MAAM,GAAG,MAAM,KAAK,EAAE,CAAA;gBAC5B,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;gBACnD,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;oBAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAA;oBAChD,MAAK;gBACP,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAA;gBACvD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;YACtD,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,UAAU,CAAC,CAAC,CAAC,CAAA;YACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC,CAAC,CAAA;IAEJ,OAAO,GAAG,CAAA;AACZ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* atoship CLI — ship packages from your terminal
|
|
4
|
+
*
|
|
5
|
+
* Setup:
|
|
6
|
+
* ship config set-key ak_live_...
|
|
7
|
+
*
|
|
8
|
+
* Quick start:
|
|
9
|
+
* ship rate --from "LA, CA 90001" --to "NY, NY 10001" --weight 2oz
|
|
10
|
+
* ship buy --rate rate_abc123 --from "..." --to "..."
|
|
11
|
+
* ship track 9400111899223456789012
|
|
12
|
+
* ship labels --status shipped
|
|
13
|
+
* ship balance
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;GAYG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* atoship CLI — ship packages from your terminal
|
|
4
|
+
*
|
|
5
|
+
* Setup:
|
|
6
|
+
* ship config set-key ak_live_...
|
|
7
|
+
*
|
|
8
|
+
* Quick start:
|
|
9
|
+
* ship rate --from "LA, CA 90001" --to "NY, NY 10001" --weight 2oz
|
|
10
|
+
* ship buy --rate rate_abc123 --from "..." --to "..."
|
|
11
|
+
* ship track 9400111899223456789012
|
|
12
|
+
* ship labels --status shipped
|
|
13
|
+
* ship balance
|
|
14
|
+
*/
|
|
15
|
+
import { Command } from 'commander';
|
|
16
|
+
import { rateCommand } from './commands/rate.js';
|
|
17
|
+
import { buyCommand } from './commands/buy.js';
|
|
18
|
+
import { trackCommand } from './commands/track.js';
|
|
19
|
+
import { labelsCommand } from './commands/labels.js';
|
|
20
|
+
import { balanceCommand } from './commands/balance.js';
|
|
21
|
+
import { configCommand } from './commands/config.js';
|
|
22
|
+
const program = new Command();
|
|
23
|
+
program
|
|
24
|
+
.name('ship')
|
|
25
|
+
.description('atoship CLI — compare rates, buy labels, and track packages')
|
|
26
|
+
.version('1.0.0');
|
|
27
|
+
program.addCommand(rateCommand());
|
|
28
|
+
program.addCommand(buyCommand());
|
|
29
|
+
program.addCommand(trackCommand());
|
|
30
|
+
program.addCommand(labelsCommand());
|
|
31
|
+
program.addCommand(balanceCommand());
|
|
32
|
+
program.addCommand(configCommand());
|
|
33
|
+
// Show help by default if no command given
|
|
34
|
+
if (process.argv.length <= 2) {
|
|
35
|
+
program.help();
|
|
36
|
+
}
|
|
37
|
+
program.parse();
|
|
38
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,WAAW,EAAE,MAAQ,oBAAoB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAS,mBAAmB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAO,qBAAqB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAC,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,6DAA6D,CAAC;KAC1E,OAAO,CAAC,OAAO,CAAC,CAAA;AAEnB,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAA;AACjC,OAAO,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAA;AAChC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAA;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAA;AACnC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAA;AACpC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAA;AAEnC,2CAA2C;AAC3C,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;IAC7B,OAAO,CAAC,IAAI,EAAE,CAAA;AAChB,CAAC;AAED,OAAO,CAAC,KAAK,EAAE,CAAA"}
|
package/dist/output.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI output helpers — colored, formatted, human-readable output.
|
|
3
|
+
*/
|
|
4
|
+
export declare function colorStatus(status: string): string;
|
|
5
|
+
export declare function printRates(rates: any[]): void;
|
|
6
|
+
export declare function printLabel(label: any): void;
|
|
7
|
+
export declare function printTracking(info: any): void;
|
|
8
|
+
export declare function printLabelsList(labels: any[]): void;
|
|
9
|
+
export declare function printAccount(account: any): void;
|
|
10
|
+
export declare function printError(err: unknown): void;
|
|
11
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqBH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGlD;AAID,wBAAgB,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CA8B7C;AAID,wBAAgB,UAAU,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,CAgB3C;AAID,wBAAgB,aAAa,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,CA2B7C;AAID,wBAAgB,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAoBnD;AAID,wBAAgB,YAAY,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI,CAkB/C;AAID,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAG7C"}
|
package/dist/output.js
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI output helpers — colored, formatted, human-readable output.
|
|
3
|
+
*/
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
// ── Status colors ──────────────────────────────────────────────────
|
|
6
|
+
const STATUS_COLORS = {
|
|
7
|
+
delivered: chalk.green,
|
|
8
|
+
shipped: chalk.cyan,
|
|
9
|
+
in_transit: chalk.cyan,
|
|
10
|
+
out_for_delivery: chalk.blue,
|
|
11
|
+
pre_transit: chalk.gray,
|
|
12
|
+
purchased: chalk.cyan,
|
|
13
|
+
draft: chalk.yellow,
|
|
14
|
+
returned: chalk.yellow,
|
|
15
|
+
cancelled: chalk.red,
|
|
16
|
+
voided: chalk.red,
|
|
17
|
+
failure: chalk.red,
|
|
18
|
+
unknown: chalk.gray,
|
|
19
|
+
};
|
|
20
|
+
export function colorStatus(status) {
|
|
21
|
+
const fn = STATUS_COLORS[status.toLowerCase()] || chalk.white;
|
|
22
|
+
return fn(status.toUpperCase());
|
|
23
|
+
}
|
|
24
|
+
// ── Rate table ─────────────────────────────────────────────────────
|
|
25
|
+
export function printRates(rates) {
|
|
26
|
+
if (!rates?.length) {
|
|
27
|
+
console.log(chalk.yellow('No rates available for this shipment.'));
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const colW = { idx: 4, carrier: 10, service: 32, rate: 10, days: 8 };
|
|
31
|
+
const header = [
|
|
32
|
+
'#'.padEnd(colW.idx),
|
|
33
|
+
'Carrier'.padEnd(colW.carrier),
|
|
34
|
+
'Service'.padEnd(colW.service),
|
|
35
|
+
'Rate'.padStart(colW.rate),
|
|
36
|
+
'Est. Days'.padStart(colW.days),
|
|
37
|
+
].join(' ');
|
|
38
|
+
console.log('');
|
|
39
|
+
console.log(chalk.bold(header));
|
|
40
|
+
console.log(chalk.gray('─'.repeat(header.length)));
|
|
41
|
+
rates.forEach((r, i) => {
|
|
42
|
+
const idx = String(i + 1).padEnd(colW.idx);
|
|
43
|
+
const carrier = (r.carrier || '').padEnd(colW.carrier);
|
|
44
|
+
const service = (r.service || '').slice(0, colW.service - 1).padEnd(colW.service);
|
|
45
|
+
const rate = `$${Number(r.rate ?? r.cost ?? 0).toFixed(2)}`.padStart(colW.rate);
|
|
46
|
+
const days = (r.delivery_days != null ? `${r.delivery_days}d` : r.estimated_days ?? '—').padStart(colW.days);
|
|
47
|
+
const line = [idx, carrier, service, chalk.green(rate), chalk.gray(days)].join(' ');
|
|
48
|
+
console.log(line);
|
|
49
|
+
});
|
|
50
|
+
console.log('');
|
|
51
|
+
}
|
|
52
|
+
// ── Label summary ──────────────────────────────────────────────────
|
|
53
|
+
export function printLabel(label) {
|
|
54
|
+
console.log('');
|
|
55
|
+
console.log(chalk.bold(' Label Purchased'));
|
|
56
|
+
console.log(chalk.gray(' ──────────────────────────────'));
|
|
57
|
+
console.log(` ID: ${chalk.cyan(label.id)}`);
|
|
58
|
+
console.log(` Status: ${colorStatus(label.status || 'purchased')}`);
|
|
59
|
+
console.log(` Carrier: ${label.carrier || '—'}`);
|
|
60
|
+
console.log(` Service: ${label.service || '—'}`);
|
|
61
|
+
console.log(` Cost: ${chalk.green('$' + Number(label.rate ?? label.cost ?? 0).toFixed(2))}`);
|
|
62
|
+
if (label.tracking_number) {
|
|
63
|
+
console.log(` Tracking: ${chalk.bold(label.tracking_number)}`);
|
|
64
|
+
}
|
|
65
|
+
if (label.label_url) {
|
|
66
|
+
console.log(` Label URL: ${chalk.underline(label.label_url)}`);
|
|
67
|
+
}
|
|
68
|
+
console.log('');
|
|
69
|
+
}
|
|
70
|
+
// ── Tracking info ──────────────────────────────────────────────────
|
|
71
|
+
export function printTracking(info) {
|
|
72
|
+
console.log('');
|
|
73
|
+
console.log(chalk.bold(` ${info.tracking_number || info.trackingNumber}`));
|
|
74
|
+
console.log(` Status: ${colorStatus(info.status || 'unknown')}`);
|
|
75
|
+
if (info.status_detail || info.statusDescription) {
|
|
76
|
+
console.log(` Detail: ${info.status_detail || info.statusDescription}`);
|
|
77
|
+
}
|
|
78
|
+
if (info.estimated_delivery) {
|
|
79
|
+
console.log(` Est. Del: ${chalk.cyan(new Date(info.estimated_delivery).toLocaleDateString())}`);
|
|
80
|
+
}
|
|
81
|
+
if (info.actual_delivery) {
|
|
82
|
+
console.log(` Delivered: ${chalk.green(new Date(info.actual_delivery).toLocaleDateString())}`);
|
|
83
|
+
}
|
|
84
|
+
const events = info.events || info.trackingEvents || [];
|
|
85
|
+
if (events.length) {
|
|
86
|
+
console.log('');
|
|
87
|
+
console.log(chalk.bold(' Events:'));
|
|
88
|
+
events.slice(0, 10).forEach((e) => {
|
|
89
|
+
const time = e.datetime || e.timestamp;
|
|
90
|
+
const dateStr = time ? chalk.gray(new Date(time).toLocaleString()) : '';
|
|
91
|
+
const msg = e.message || e.description || e.status || '';
|
|
92
|
+
const loc = e.location ? chalk.gray(` — ${e.location}`) : '';
|
|
93
|
+
console.log(` ${dateStr} ${msg}${loc}`);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
console.log('');
|
|
97
|
+
}
|
|
98
|
+
// ── Labels list ────────────────────────────────────────────────────
|
|
99
|
+
export function printLabelsList(labels) {
|
|
100
|
+
if (!labels?.length) {
|
|
101
|
+
console.log(chalk.yellow('No labels found.'));
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
console.log('');
|
|
105
|
+
labels.forEach((l) => {
|
|
106
|
+
const tracking = l.tracking_number ? chalk.bold(l.tracking_number) : chalk.gray('(no tracking)');
|
|
107
|
+
const cost = l.rate != null ? chalk.green(` $${Number(l.rate).toFixed(2)}`) : '';
|
|
108
|
+
console.log(` ${chalk.cyan(l.id)} ${colorStatus(l.status || 'unknown')} ` +
|
|
109
|
+
`${(l.carrier || '').padEnd(6)} ${tracking}${cost}`);
|
|
110
|
+
if (l.to_address) {
|
|
111
|
+
const to = l.to_address;
|
|
112
|
+
console.log(chalk.gray(` → ${[to.name, to.city, to.state, to.zip].filter(Boolean).join(', ')}`));
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
console.log('');
|
|
116
|
+
}
|
|
117
|
+
// ── Account info ───────────────────────────────────────────────────
|
|
118
|
+
export function printAccount(account) {
|
|
119
|
+
console.log('');
|
|
120
|
+
console.log(chalk.bold(' Account'));
|
|
121
|
+
console.log(chalk.gray(' ──────────────────────────────'));
|
|
122
|
+
console.log(` Name: ${account.name || account.email}`);
|
|
123
|
+
console.log(` Email: ${account.email}`);
|
|
124
|
+
if (account.organization) {
|
|
125
|
+
console.log(` Org: ${account.organization.name}`);
|
|
126
|
+
}
|
|
127
|
+
if (account.balance) {
|
|
128
|
+
const b = account.balance;
|
|
129
|
+
console.log(` Balance: ${chalk.green('$' + Number(b.available ?? b).toFixed(2))} available`);
|
|
130
|
+
if (b.pending)
|
|
131
|
+
console.log(` ${chalk.yellow('$' + Number(b.pending).toFixed(2))} pending`);
|
|
132
|
+
}
|
|
133
|
+
if (account.usage) {
|
|
134
|
+
console.log(` Labels: ${account.usage.monthly_labels} this month / ${account.usage.total_labels} total`);
|
|
135
|
+
}
|
|
136
|
+
console.log('');
|
|
137
|
+
}
|
|
138
|
+
// ── Error ──────────────────────────────────────────────────────────
|
|
139
|
+
export function printError(err) {
|
|
140
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
141
|
+
console.error(chalk.red('\n Error: ') + msg + '\n');
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@atoship/cli",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "CLI for atoship shipping platform — get rates, buy labels, track packages from your terminal",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"shipping",
|
|
7
|
+
"atoship",
|
|
8
|
+
"cli",
|
|
9
|
+
"usps",
|
|
10
|
+
"fedex",
|
|
11
|
+
"ups",
|
|
12
|
+
"labels",
|
|
13
|
+
"tracking"
|
|
14
|
+
],
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"author": "atoship <support@atoship.com>",
|
|
17
|
+
"homepage": "https://atoship.com/docs/cli",
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://github.com/atoship-dev/atoship.git",
|
|
21
|
+
"directory": "sdk/cli"
|
|
22
|
+
},
|
|
23
|
+
"type": "module",
|
|
24
|
+
"main": "dist/index.js",
|
|
25
|
+
"bin": {
|
|
26
|
+
"ship": "dist/index.js"
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"dist",
|
|
30
|
+
"README.md"
|
|
31
|
+
],
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build": "tsc",
|
|
34
|
+
"dev": "tsc --watch",
|
|
35
|
+
"start": "node dist/index.js",
|
|
36
|
+
"prepublishOnly": "npm run build"
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"commander": "^12.1.0",
|
|
40
|
+
"chalk": "^5.3.0"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@types/node": "^22.0.0",
|
|
44
|
+
"typescript": "^5.7.0"
|
|
45
|
+
},
|
|
46
|
+
"engines": {
|
|
47
|
+
"node": ">=18"
|
|
48
|
+
}
|
|
49
|
+
}
|