@stephendolan/chartmogul-cli 1.0.0 → 1.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/README.md CHANGED
@@ -14,170 +14,96 @@ A command-line interface for ChartMogul analytics, designed for developers and L
14
14
 
15
15
  ## Installation
16
16
 
17
- ### From npm (recommended)
18
-
19
17
  ```bash
20
18
  npm install -g @stephendolan/chartmogul-cli
21
- # or
22
- bun install -g @stephendolan/chartmogul-cli
23
- ```
24
-
25
- ### From source
26
-
27
- ```bash
28
- git clone https://github.com/stephendolan/chartmogul-cli.git
29
- cd chartmogul-cli
30
- bun install
31
- bun run link
32
19
  ```
33
20
 
34
- ### Linux prerequisites
35
-
36
- On Linux, install libsecret for keychain support:
37
-
38
- ```bash
39
- sudo apt-get install libsecret-1-dev
40
- ```
21
+ On Linux, install libsecret for keychain support: `sudo apt-get install libsecret-1-dev`
41
22
 
42
23
  ## Authentication
43
24
 
44
- ### Using API Key (recommended)
45
-
46
25
  ```bash
47
- # Store API key in OS keychain
48
26
  chartmogul auth login --api-key YOUR_API_KEY
49
-
50
- # Check authentication status
51
27
  chartmogul auth status
52
-
53
- # Remove stored credentials
54
28
  chartmogul auth logout
55
29
  ```
56
30
 
57
- ### Using environment variable
58
-
59
- ```bash
60
- export CHARTMOGUL_API_KEY=your_api_key
61
- ```
62
-
63
- Get your API key from ChartMogul: Profile → API Keys
64
-
65
- ## Usage
31
+ Or use the environment variable: `export CHARTMOGUL_API_KEY=your_api_key`
66
32
 
67
- ### Account
33
+ Get your API key from ChartMogul: Profile -> API Keys
68
34
 
69
- ```bash
70
- # View account details
71
- chartmogul account view
72
- ```
35
+ ## Commands
73
36
 
74
37
  ### Metrics
75
38
 
76
- ```bash
77
- # Get all metrics (last 30 days by default)
78
- chartmogul metrics all
79
-
80
- # MRR (Monthly Recurring Revenue)
81
- chartmogul metrics mrr
82
- chartmogul metrics mrr --start-date 2024-01-01 --end-date 2024-12-31
83
-
84
- # ARR (Annual Recurring Revenue)
85
- chartmogul metrics arr --interval month
86
-
87
- # ARPA (Average Revenue Per Account)
88
- chartmogul metrics arpa
89
-
90
- # ASP (Average Sale Price)
91
- chartmogul metrics asp
39
+ All metric commands support `--start-date`, `--end-date`, and `--interval` (day, week, month, quarter).
92
40
 
93
- # Customer count
94
- chartmogul metrics customer-count
95
-
96
- # Customer churn rate
97
- chartmogul metrics customer-churn
98
-
99
- # MRR churn rate
100
- chartmogul metrics mrr-churn
41
+ ```bash
42
+ chartmogul metrics all # All key metrics (last 30 days)
43
+ chartmogul metrics mrr # Monthly Recurring Revenue
44
+ chartmogul metrics arr # Annual Recurring Revenue
45
+ chartmogul metrics arpa # Average Revenue Per Account
46
+ chartmogul metrics asp # Average Sale Price
47
+ chartmogul metrics customer-count # Customer count over time
48
+ chartmogul metrics customer-churn # Customer churn rate
49
+ chartmogul metrics mrr-churn # MRR churn rate
50
+ chartmogul metrics ltv # Customer Lifetime Value
101
51
 
102
- # LTV (Customer Lifetime Value)
103
- chartmogul metrics ltv
52
+ # With date range
53
+ chartmogul metrics mrr --start-date 2024-01-01 --end-date 2024-12-31 --interval month
104
54
  ```
105
55
 
106
56
  ### Customers
107
57
 
108
58
  ```bash
109
- # List customers
110
- chartmogul customers list
111
- chartmogul customers list --status Active
112
- chartmogul customers list --data-source <uuid>
113
-
114
- # View a customer
115
- chartmogul customers view <uuid>
116
-
117
- # Search by email
59
+ chartmogul customers list # List all customers
60
+ chartmogul customers list --status Active # Filter by status
61
+ chartmogul customers view <uuid> # View customer details
118
62
  chartmogul customers search --email user@example.com
119
-
120
- # View customer activities
121
- chartmogul customers activities <uuid>
122
-
123
- # View customer subscriptions
124
- chartmogul customers subscriptions <uuid>
63
+ chartmogul customers activities <uuid> # Customer activities
64
+ chartmogul customers subscriptions <uuid> # Customer subscriptions
125
65
  ```
126
66
 
127
- ### Plans
67
+ ### Other Resources
128
68
 
129
69
  ```bash
130
- # List plans
131
- chartmogul plans list
70
+ # Account
71
+ chartmogul account view
132
72
 
133
- # View a plan
73
+ # Plans
74
+ chartmogul plans list
134
75
  chartmogul plans view <uuid>
135
- ```
136
-
137
- ### Invoices
138
76
 
139
- ```bash
140
- # List invoices
77
+ # Invoices
141
78
  chartmogul invoices list
142
79
  chartmogul invoices list --customer <uuid>
143
-
144
- # View an invoice
145
80
  chartmogul invoices view <uuid>
146
- ```
147
-
148
- ### Data Sources
149
81
 
150
- ```bash
151
- # List data sources
82
+ # Data Sources
152
83
  chartmogul data-sources list
153
-
154
- # View a data source
155
84
  chartmogul data-sources view <uuid>
156
-
157
- # Set default data source for filtering
158
85
  chartmogul data-sources set-default <uuid>
159
- ```
160
-
161
- ### Activities
162
86
 
163
- ```bash
164
- # List activities
87
+ # Activities
165
88
  chartmogul activities list
166
- chartmogul activities list --type new_biz
167
- chartmogul activities list --start-date 2024-01-01 --end-date 2024-12-31
89
+ chartmogul activities list --type new_biz --start-date 2024-01-01
168
90
  ```
169
91
 
170
- ## Output Formatting
92
+ ## Output
171
93
 
172
- All commands output JSON by default:
94
+ All commands output JSON. Use `--compact` or `-c` for single-line output:
173
95
 
174
96
  ```bash
175
- # Pretty-printed JSON (default)
176
- chartmogul metrics mrr
97
+ chartmogul metrics mrr # Pretty-printed JSON
98
+ chartmogul -c metrics mrr # Compact JSON (single line)
99
+ ```
100
+
101
+ **Monetary values are in dollars** (not ChartMogul's internal cents). An MRR of `100` means $100.
177
102
 
178
- # Compact JSON (single line)
179
- chartmogul -c metrics mrr
180
- chartmogul --compact customers list
103
+ Errors are also returned as JSON:
104
+
105
+ ```json
106
+ {"error": {"name": "unauthorized", "detail": "Invalid API key", "statusCode": 401}}
181
107
  ```
182
108
 
183
109
  ## Environment Variables
@@ -187,52 +113,6 @@ chartmogul --compact customers list
187
113
  | `CHARTMOGUL_API_KEY` | API key (alternative to keychain) |
188
114
  | `CHARTMOGUL_DATA_SOURCE` | Default data source UUID |
189
115
 
190
- ## Common Patterns
191
-
192
- ### Get current MRR
193
-
194
- ```bash
195
- chartmogul metrics mrr --start-date $(date +%Y-%m-%d) --end-date $(date +%Y-%m-%d)
196
- ```
197
-
198
- ### Get monthly MRR trend
199
-
200
- ```bash
201
- chartmogul metrics mrr --start-date 2024-01-01 --end-date 2024-12-31 --interval month
202
- ```
203
-
204
- ### Find high-value customers
205
-
206
- ```bash
207
- chartmogul customers list | jq '.entries | sort_by(.mrr) | reverse | .[0:10]'
208
- ```
209
-
210
- ### Get churn analysis
211
-
212
- ```bash
213
- chartmogul metrics customer-churn --start-date 2024-01-01 --end-date 2024-12-31 --interval month
214
- ```
215
-
216
- ### View recent activities
217
-
218
- ```bash
219
- chartmogul activities list --type churn --start-date 2024-12-01
220
- ```
221
-
222
- ## Error Handling
223
-
224
- Errors are returned as JSON:
225
-
226
- ```json
227
- {
228
- "error": {
229
- "name": "unauthorized",
230
- "detail": "Invalid API key",
231
- "statusCode": 401
232
- }
233
- }
234
- ```
235
-
236
116
  ## License
237
117
 
238
118
  MIT
package/dist/cli.js CHANGED
@@ -3,14 +3,55 @@
3
3
  // src/cli.ts
4
4
  import { Command as Command9 } from "commander";
5
5
 
6
+ // src/lib/utils.ts
7
+ function centsToDollars(cents) {
8
+ return cents / 100;
9
+ }
10
+ var CENTS_FIELDS = /* @__PURE__ */ new Set([
11
+ "amount_in_cents",
12
+ "discount_amount_in_cents",
13
+ "tax_amount_in_cents",
14
+ "mrr",
15
+ "arr",
16
+ "arpa",
17
+ "asp",
18
+ "ltv",
19
+ "activity_mrr",
20
+ "activity_arr",
21
+ "activity_mrr_movement",
22
+ "new-biz",
23
+ "expansion",
24
+ "contraction",
25
+ "churn",
26
+ "reactivation"
27
+ ]);
28
+ function isCentsField(fieldName) {
29
+ return CENTS_FIELDS.has(fieldName) || fieldName.endsWith("_in_cents");
30
+ }
31
+ function convertCentsToDollars(data) {
32
+ if (data === null || data === void 0) return data;
33
+ if (Array.isArray(data)) return data.map(convertCentsToDollars);
34
+ if (typeof data !== "object") return data;
35
+ const converted = {};
36
+ for (const [key, value] of Object.entries(data)) {
37
+ if (isCentsField(key) && typeof value === "number") {
38
+ converted[key] = centsToDollars(value);
39
+ } else {
40
+ converted[key] = convertCentsToDollars(value);
41
+ }
42
+ }
43
+ return converted;
44
+ }
45
+
6
46
  // src/lib/output.ts
7
47
  var globalOutputOptions = {};
8
48
  function setOutputOptions(options) {
9
49
  globalOutputOptions = options;
10
50
  }
11
51
  function outputJson(data, options = {}) {
52
+ const convertedData = convertCentsToDollars(data);
12
53
  const mergedOptions = { ...globalOutputOptions, ...options };
13
- const jsonString = mergedOptions.compact ? JSON.stringify(data) : JSON.stringify(data, null, 2);
54
+ const jsonString = mergedOptions.compact ? JSON.stringify(convertedData) : JSON.stringify(convertedData, null, 2);
14
55
  console.log(jsonString);
15
56
  }
16
57
 
@@ -593,7 +634,7 @@ function createActivitiesCommand() {
593
634
  }
594
635
 
595
636
  // src/cli.ts
596
- var version = true ? "1.0.0" : "0.0.0-dev";
637
+ var version = true ? "1.0.2" : "0.0.0-dev";
597
638
  var program = new Command9();
598
639
  program.name("chartmogul").description("A command-line interface for ChartMogul analytics").version(version).option("-c, --compact", "Minified JSON output (single line)").hook("preAction", (thisCommand) => {
599
640
  const options = thisCommand.opts();
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/lib/output.ts","../src/commands/auth.ts","../src/lib/auth.ts","../src/lib/config.ts","../src/lib/errors.ts","../src/lib/api-client.ts","../src/lib/command-utils.ts","../src/commands/account.ts","../src/commands/data-sources.ts","../src/commands/customers.ts","../src/commands/plans.ts","../src/commands/invoices.ts","../src/commands/metrics.ts","../src/lib/dates.ts","../src/commands/activities.ts"],"sourcesContent":["#!/usr/bin/env bun\n\nimport { Command } from 'commander';\nimport { setOutputOptions } from './lib/output.js';\nimport { createAuthCommand } from './commands/auth.js';\nimport { createAccountCommand } from './commands/account.js';\nimport { createDataSourcesCommand } from './commands/data-sources.js';\nimport { createCustomersCommand } from './commands/customers.js';\nimport { createPlansCommand } from './commands/plans.js';\nimport { createInvoicesCommand } from './commands/invoices.js';\nimport { createMetricsCommand } from './commands/metrics.js';\nimport { createActivitiesCommand } from './commands/activities.js';\n\ndeclare const __VERSION__: string | undefined;\n\nconst version = typeof __VERSION__ !== 'undefined' ? __VERSION__ : '0.0.0-dev';\n\nconst program = new Command();\n\nprogram\n .name('chartmogul')\n .description('A command-line interface for ChartMogul analytics')\n .version(version)\n .option('-c, --compact', 'Minified JSON output (single line)')\n .hook('preAction', (thisCommand) => {\n const options = thisCommand.opts();\n setOutputOptions({\n compact: options.compact,\n });\n });\n\nprogram.addCommand(createAuthCommand());\nprogram.addCommand(createAccountCommand());\nprogram.addCommand(createDataSourcesCommand());\nprogram.addCommand(createCustomersCommand());\nprogram.addCommand(createPlansCommand());\nprogram.addCommand(createInvoicesCommand());\nprogram.addCommand(createMetricsCommand());\nprogram.addCommand(createActivitiesCommand());\n\nprogram.parseAsync().catch(() => {\n process.exit(1);\n});\n","import type { OutputOptions } from '../types/index.js';\n\nlet globalOutputOptions: OutputOptions = {};\n\nexport function setOutputOptions(options: OutputOptions): void {\n globalOutputOptions = options;\n}\n\nexport function outputJson(data: unknown, options: OutputOptions = {}): void {\n const mergedOptions = { ...globalOutputOptions, ...options };\n\n const jsonString = mergedOptions.compact ? JSON.stringify(data) : JSON.stringify(data, null, 2);\n\n console.log(jsonString);\n}\n","import { Command } from 'commander';\nimport { auth } from '../lib/auth.js';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createAuthCommand(): Command {\n const cmd = new Command('auth').description('Authentication operations');\n\n cmd\n .command('login')\n .description('Configure ChartMogul API credentials')\n .requiredOption('--api-key <key>', 'ChartMogul API Key')\n .action(\n withErrorHandling(async (options: { apiKey: string }) => {\n auth.setApiKey(options.apiKey);\n await client.ping();\n outputJson({ message: 'Successfully authenticated with ChartMogul' });\n })\n );\n\n cmd\n .command('logout')\n .description('Remove stored credentials')\n .action(\n withErrorHandling(async () => {\n auth.logout();\n outputJson({ message: 'Logged out successfully' });\n })\n );\n\n cmd\n .command('status')\n .description('Check authentication status')\n .action(\n withErrorHandling(async () => {\n outputJson({ authenticated: auth.isAuthenticated() });\n })\n );\n\n return cmd;\n}\n","import { Entry } from '@napi-rs/keyring';\nimport { config } from './config.js';\n\nconst SERVICE_NAME = 'chartmogul-cli';\nconst API_KEY_ACCOUNT = 'api-key';\n\nconst KEYRING_UNAVAILABLE_ERROR =\n 'Keychain storage unavailable. Cannot store credentials securely.\\n' +\n 'On Linux, install libsecret: sudo apt-get install libsecret-1-dev\\n' +\n 'Then reinstall: bun install -g @stephendolan/chartmogul-cli\\n' +\n 'Alternatively, use CHARTMOGUL_API_KEY environment variable.';\n\nfunction getKeyring(account: string): Entry | null {\n try {\n return new Entry(SERVICE_NAME, account);\n } catch {\n return null;\n }\n}\n\nfunction getPassword(account: string): string | null {\n const entry = getKeyring(account);\n if (entry) {\n try {\n return entry.getPassword();\n } catch {\n return null;\n }\n }\n return null;\n}\n\nfunction setPassword(account: string, value: string): void {\n const entry = getKeyring(account);\n if (!entry) {\n throw new Error(KEYRING_UNAVAILABLE_ERROR);\n }\n entry.setPassword(value);\n}\n\nfunction deletePassword(account: string): boolean {\n const entry = getKeyring(account);\n if (entry) {\n return entry.deletePassword();\n }\n return false;\n}\n\nexport class AuthManager {\n getApiKey(): string | null {\n return getPassword(API_KEY_ACCOUNT) || process.env.CHARTMOGUL_API_KEY || null;\n }\n\n setApiKey(apiKey: string): void {\n setPassword(API_KEY_ACCOUNT, apiKey);\n }\n\n isAuthenticated(): boolean {\n return this.getApiKey() !== null;\n }\n\n logout(): void {\n deletePassword(API_KEY_ACCOUNT);\n config.clearDefaultDataSource();\n }\n}\n\nexport const auth = new AuthManager();\n","import Conf from 'conf';\n\ninterface ConfigSchema {\n defaultDataSource?: string;\n}\n\nconst store = new Conf<ConfigSchema>({\n projectName: 'chartmogul-cli',\n});\n\nexport const config = {\n getDefaultDataSource(): string | undefined {\n return store.get('defaultDataSource') || process.env.CHARTMOGUL_DATA_SOURCE;\n },\n\n setDefaultDataSource(dataSourceUuid: string): void {\n store.set('defaultDataSource', dataSourceUuid);\n },\n\n clearDefaultDataSource(): void {\n store.delete('defaultDataSource');\n },\n\n clear(): void {\n store.clear();\n },\n};\n","import type { ChartMogulError } from '../types/index.js';\nimport { outputJson } from './output.js';\n\nexport class ChartMogulCliError extends Error {\n constructor(\n message: string,\n public statusCode?: number\n ) {\n super(message);\n this.name = 'ChartMogulCliError';\n }\n}\n\nexport class ChartMogulApiError extends Error {\n constructor(\n message: string,\n public apiError: unknown,\n public statusCode: number\n ) {\n super(message);\n this.name = 'ChartMogulApiError';\n }\n}\n\nexport function sanitizeErrorMessage(message: string): string {\n const sensitivePatterns = [\n /Bearer\\s+[\\w\\-._~+/]+=*/gi,\n /token[=:]\\s*[\\w\\-._~+/]+=*/gi,\n /api[_-]?key[=:]\\s*[\\w\\-._~+/]+=*/gi,\n /authorization:\\s*basic\\s+[\\w\\-._~+/]+=*/gi,\n ];\n\n let sanitized = message;\n for (const pattern of sensitivePatterns) {\n sanitized = sanitized.replace(pattern, '[REDACTED]');\n }\n\n return sanitized.length > 500 ? sanitized.substring(0, 500) + '...' : sanitized;\n}\n\ninterface ApiErrorResponse {\n error?: string;\n message?: string;\n errors?: Array<{\n key?: string;\n message?: string;\n }>;\n}\n\nfunction isErrorObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nexport function sanitizeApiError(error: unknown): ChartMogulError {\n if (!isErrorObject(error)) {\n return {\n name: 'api_error',\n detail: 'An error occurred',\n };\n }\n\n const apiError = error as ApiErrorResponse;\n\n let detail = 'An error occurred';\n if (apiError.message) {\n detail = apiError.message;\n } else if (apiError.errors?.length) {\n detail = apiError.errors\n .map((e) => e.message || e.key)\n .filter(Boolean)\n .join('; ');\n }\n\n return {\n name: apiError.error || 'api_error',\n detail: sanitizeErrorMessage(detail),\n };\n}\n\nfunction formatErrorResponse(name: string, detail: string, statusCode: number): never {\n const hint =\n name === 'too_many_requests'\n ? 'ChartMogul API rate limit exceeded. Wait a moment and retry.'\n : undefined;\n\n const response: { error: { name: string; detail: string; statusCode: number }; hint?: string } = {\n error: { name, detail, statusCode },\n };\n\n if (hint) {\n response.hint = hint;\n }\n\n outputJson(response);\n process.exit(1);\n}\n\nexport function handleChartMogulError(error: unknown): never {\n if (error instanceof ChartMogulCliError) {\n const sanitized = sanitizeErrorMessage(error.message);\n formatErrorResponse('cli_error', sanitized, error.statusCode || 1);\n }\n\n if (error instanceof ChartMogulApiError) {\n const cmError = sanitizeApiError(error.apiError);\n formatErrorResponse(cmError.name, cmError.detail, error.statusCode);\n }\n\n if (error instanceof Error) {\n const sanitized = sanitizeErrorMessage(error.message);\n formatErrorResponse('unknown_error', sanitized, 1);\n }\n\n formatErrorResponse('unknown_error', 'An unexpected error occurred', 1);\n}\n","import { auth } from './auth.js';\nimport { ChartMogulCliError, ChartMogulApiError } from './errors.js';\nimport type {\n Account,\n DataSource,\n Customer,\n Plan,\n Subscription,\n Invoice,\n MetricsResponse,\n Activity,\n CustomerListResponse,\n PaginatedResponse,\n} from '../types/index.js';\n\nconst API_BASE = 'https://api.chartmogul.com/v1';\n\nexport class ChartMogulClient {\n private getAuthHeader(): string {\n const apiKey = auth.getApiKey();\n if (!apiKey) {\n throw new ChartMogulCliError('Not authenticated. Please run: chartmogul auth login', 401);\n }\n return `Basic ${Buffer.from(`${apiKey}:`).toString('base64')}`;\n }\n\n private async request<T>(\n method: string,\n path: string,\n options: {\n params?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n } = {}\n ): Promise<T> {\n const { params, body } = options;\n\n const url = new URL(`${API_BASE}${path}`);\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n });\n }\n\n const authHeader = this.getAuthHeader();\n const fetchOptions: RequestInit = {\n method,\n headers: {\n Authorization: authHeader,\n 'Content-Type': 'application/json',\n },\n };\n if (body) {\n fetchOptions.body = JSON.stringify(body);\n }\n\n let response: Response;\n try {\n response = await fetch(url.toString(), fetchOptions);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown network error';\n throw new ChartMogulCliError(`Network request failed: ${message}`, 0);\n }\n\n if (response.status === 429) {\n const retryAfter = response.headers.get('Retry-After') || '60';\n throw new ChartMogulCliError(\n `Rate limited by ChartMogul API. Retry after ${retryAfter} seconds.`,\n 429\n );\n }\n\n if (response.status === 204) {\n return {} as T;\n }\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new ChartMogulApiError('API request failed', error, response.status);\n }\n\n return response.json() as Promise<T>;\n }\n\n async getAccount() {\n return this.request<Account>('GET', '/account');\n }\n\n async ping() {\n return this.request<{ data: string }>('GET', '/ping');\n }\n\n async listDataSources() {\n return this.request<{ data_sources: DataSource[] }>('GET', '/data_sources');\n }\n\n async getDataSource(uuid: string) {\n return this.request<DataSource>('GET', `/data_sources/${uuid}`);\n }\n\n async listCustomers(\n params: {\n data_source_uuid?: string;\n status?: string;\n system?: string;\n external_id?: string;\n page?: number;\n per_page?: number;\n } = {}\n ) {\n return this.request<CustomerListResponse>('GET', '/customers', { params });\n }\n\n async getCustomer(uuid: string) {\n return this.request<Customer>('GET', `/customers/${uuid}`);\n }\n\n async searchCustomers(email: string) {\n return this.request<{ entries: Customer[] }>('GET', '/customers/search', {\n params: { email },\n });\n }\n\n async getCustomerActivities(uuid: string, params: { page?: number; per_page?: number } = {}) {\n return this.request<PaginatedResponse<Activity>>('GET', `/customers/${uuid}/activities`, {\n params,\n });\n }\n\n async getCustomerSubscriptions(uuid: string) {\n return this.request<{ entries: Subscription[] }>('GET', `/customers/${uuid}/subscriptions`);\n }\n\n async listPlans(params: { data_source_uuid?: string; page?: number; per_page?: number } = {}) {\n return this.request<{ plans: Plan[]; has_more: boolean; per_page: number; page: number }>(\n 'GET',\n '/plans',\n { params }\n );\n }\n\n async getPlan(uuid: string) {\n return this.request<Plan>('GET', `/plans/${uuid}`);\n }\n\n async listInvoices(\n params: {\n customer_uuid?: string;\n data_source_uuid?: string;\n external_id?: string;\n page?: number;\n per_page?: number;\n } = {}\n ) {\n return this.request<{ invoices: Invoice[]; has_more: boolean }>('GET', '/invoices', { params });\n }\n\n async getInvoice(uuid: string) {\n return this.request<Invoice>('GET', `/invoices/${uuid}`);\n }\n\n async getMrr(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/mrr', { params });\n }\n\n async getArr(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/arr', { params });\n }\n\n async getArpa(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/arpa', { params });\n }\n\n async getAsp(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/asp', { params });\n }\n\n async getCustomerCount(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/customer-count', { params });\n }\n\n async getCustomerChurnRate(params: {\n 'start-date': string;\n 'end-date': string;\n interval?: string;\n }) {\n return this.request<MetricsResponse>('GET', '/metrics/customer-churn-rate', { params });\n }\n\n async getMrrChurnRate(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/mrr-churn-rate', { params });\n }\n\n async getLtv(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/ltv', { params });\n }\n\n async getAllMetrics(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/all', { params });\n }\n\n async listActivities(\n params: {\n 'start-date'?: string;\n 'end-date'?: string;\n type?: string;\n page?: number;\n per_page?: number;\n } = {}\n ) {\n return this.request<PaginatedResponse<Activity>>('GET', '/activities', { params });\n }\n}\n\nexport const client = new ChartMogulClient();\n","import { handleChartMogulError } from './errors.js';\n\nexport function withErrorHandling<T extends unknown[], R>(\n fn: (...args: T) => Promise<R>\n): (...args: T) => Promise<void> {\n return async (...args: T) => {\n try {\n await fn(...args);\n } catch (error) {\n handleChartMogulError(error);\n }\n };\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createAccountCommand(): Command {\n const cmd = new Command('account').description('Account operations');\n\n cmd\n .command('view')\n .description('View account details')\n .action(\n withErrorHandling(async () => {\n const account = await client.getAccount();\n outputJson(account);\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { config } from '../lib/config.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createDataSourcesCommand(): Command {\n const cmd = new Command('data-sources').description('Data source operations');\n\n cmd\n .command('list')\n .description('List all data sources')\n .action(\n withErrorHandling(async () => {\n const result = await client.listDataSources();\n outputJson(result.data_sources);\n })\n );\n\n cmd\n .command('view')\n .description('View a data source')\n .argument('<uuid>', 'Data source UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const dataSource = await client.getDataSource(uuid);\n outputJson(dataSource);\n })\n );\n\n cmd\n .command('set-default')\n .description('Set default data source for filtering')\n .argument('<uuid>', 'Data source UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n config.setDefaultDataSource(uuid);\n outputJson({ message: `Default data source set to ${uuid}` });\n })\n );\n\n cmd\n .command('get-default')\n .description('Get default data source')\n .action(\n withErrorHandling(async () => {\n const defaultDs = config.getDefaultDataSource();\n outputJson({ default_data_source: defaultDs || null });\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { config } from '../lib/config.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createCustomersCommand(): Command {\n const cmd = new Command('customers').description('Customer queries');\n\n cmd\n .command('list')\n .description('List customers')\n .option('--data-source <uuid>', 'Filter by data source UUID')\n .option('--status <status>', 'Filter by status (Lead, Active, Cancelled)')\n .option('--external-id <id>', 'Filter by external ID')\n .option('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page (max 200)')\n .action(\n withErrorHandling(\n async (options: {\n dataSource?: string;\n status?: string;\n externalId?: string;\n page?: string;\n perPage?: string;\n }) => {\n const result = await client.listCustomers({\n data_source_uuid: options.dataSource || config.getDefaultDataSource(),\n status: options.status,\n external_id: options.externalId,\n page: options.page ? parseInt(options.page, 10) : undefined,\n per_page: options.perPage ? parseInt(options.perPage, 10) : undefined,\n });\n outputJson(result);\n }\n )\n );\n\n cmd\n .command('view')\n .description('View a customer')\n .argument('<uuid>', 'Customer UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const customer = await client.getCustomer(uuid);\n outputJson(customer);\n })\n );\n\n cmd\n .command('search')\n .description('Search customers by email')\n .requiredOption('--email <email>', 'Email address to search')\n .action(\n withErrorHandling(async (options: { email: string }) => {\n const result = await client.searchCustomers(options.email);\n outputJson(result.entries);\n })\n );\n\n cmd\n .command('activities')\n .description('List customer activities')\n .argument('<uuid>', 'Customer UUID')\n .option('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page')\n .action(\n withErrorHandling(async (uuid: string, options: { page?: string; perPage?: string }) => {\n const result = await client.getCustomerActivities(uuid, {\n page: options.page ? parseInt(options.page, 10) : undefined,\n per_page: options.perPage ? parseInt(options.perPage, 10) : undefined,\n });\n outputJson(result);\n })\n );\n\n cmd\n .command('subscriptions')\n .description('List customer subscriptions')\n .argument('<uuid>', 'Customer UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const result = await client.getCustomerSubscriptions(uuid);\n outputJson(result.entries);\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { config } from '../lib/config.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createPlansCommand(): Command {\n const cmd = new Command('plans').description('Plan queries');\n\n cmd\n .command('list')\n .description('List plans')\n .option('--data-source <uuid>', 'Filter by data source UUID')\n .option('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page')\n .action(\n withErrorHandling(\n async (options: { dataSource?: string; page?: string; perPage?: string }) => {\n const result = await client.listPlans({\n data_source_uuid: options.dataSource || config.getDefaultDataSource(),\n page: options.page ? parseInt(options.page, 10) : undefined,\n per_page: options.perPage ? parseInt(options.perPage, 10) : undefined,\n });\n outputJson(result);\n }\n )\n );\n\n cmd\n .command('view')\n .description('View a plan')\n .argument('<uuid>', 'Plan UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const plan = await client.getPlan(uuid);\n outputJson(plan);\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { config } from '../lib/config.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createInvoicesCommand(): Command {\n const cmd = new Command('invoices').description('Invoice queries');\n\n cmd\n .command('list')\n .description('List invoices')\n .option('--customer <uuid>', 'Filter by customer UUID')\n .option('--data-source <uuid>', 'Filter by data source UUID')\n .option('--external-id <id>', 'Filter by external ID')\n .option('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page')\n .action(\n withErrorHandling(\n async (options: {\n customer?: string;\n dataSource?: string;\n externalId?: string;\n page?: string;\n perPage?: string;\n }) => {\n const result = await client.listInvoices({\n customer_uuid: options.customer,\n data_source_uuid: options.dataSource || config.getDefaultDataSource(),\n external_id: options.externalId,\n page: options.page ? parseInt(options.page, 10) : undefined,\n per_page: options.perPage ? parseInt(options.perPage, 10) : undefined,\n });\n outputJson(result);\n }\n )\n );\n\n cmd\n .command('view')\n .description('View an invoice')\n .argument('<uuid>', 'Invoice UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const invoice = await client.getInvoice(uuid);\n outputJson(invoice);\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\nimport { getDefaultDateRange, parseDate } from '../lib/dates.js';\n\ninterface MetricOptions {\n startDate?: string;\n endDate?: string;\n interval?: string;\n}\n\nfunction buildMetricParams(options: MetricOptions) {\n const defaults = getDefaultDateRange();\n return {\n 'start-date': options.startDate ? parseDate(options.startDate) : defaults.startDate,\n 'end-date': options.endDate ? parseDate(options.endDate) : defaults.endDate,\n interval: options.interval,\n };\n}\n\nexport function createMetricsCommand(): Command {\n const cmd = new Command('metrics').description('Metrics and analytics');\n\n cmd\n .command('all')\n .description('Get all key metrics')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getAllMetrics(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('mrr')\n .description('Get Monthly Recurring Revenue')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getMrr(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('arr')\n .description('Get Annual Recurring Revenue')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getArr(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('arpa')\n .description('Get Average Revenue Per Account')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getArpa(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('asp')\n .description('Get Average Sale Price')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getAsp(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('customer-count')\n .description('Get customer count over time')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getCustomerCount(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('customer-churn')\n .description('Get customer churn rate')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getCustomerChurnRate(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('mrr-churn')\n .description('Get MRR churn rate')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getMrrChurnRate(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('ltv')\n .description('Get Customer Lifetime Value')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getLtv(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n return cmd;\n}\n","import dayjs from 'dayjs';\nimport { ChartMogulCliError } from './errors.js';\n\nexport function parseDate(input: string): string {\n const d = dayjs(input);\n if (!d.isValid()) {\n throw new ChartMogulCliError(`Invalid date: ${input}`, 400);\n }\n return d.format('YYYY-MM-DD');\n}\n\nexport function getDefaultDateRange(): { startDate: string; endDate: string } {\n return {\n startDate: dayjs().subtract(30, 'day').format('YYYY-MM-DD'),\n endDate: dayjs().format('YYYY-MM-DD'),\n };\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createActivitiesCommand(): Command {\n const cmd = new Command('activities').description('Activity operations');\n\n cmd\n .command('list')\n .description('List activities')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--type <type>', 'Activity type (new_biz, expansion, contraction, churn, reactivation)')\n .option('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page')\n .action(\n withErrorHandling(\n async (options: {\n startDate?: string;\n endDate?: string;\n type?: string;\n page?: string;\n perPage?: string;\n }) => {\n const result = await client.listActivities({\n 'start-date': options.startDate,\n 'end-date': options.endDate,\n type: options.type,\n page: options.page ? parseInt(options.page, 10) : undefined,\n per_page: options.perPage ? parseInt(options.perPage, 10) : undefined,\n });\n outputJson(result);\n }\n )\n );\n\n return cmd;\n}\n"],"mappings":"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","names":["Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/lib/utils.ts","../src/lib/output.ts","../src/commands/auth.ts","../src/lib/auth.ts","../src/lib/config.ts","../src/lib/errors.ts","../src/lib/api-client.ts","../src/lib/command-utils.ts","../src/commands/account.ts","../src/commands/data-sources.ts","../src/commands/customers.ts","../src/commands/plans.ts","../src/commands/invoices.ts","../src/commands/metrics.ts","../src/lib/dates.ts","../src/commands/activities.ts"],"sourcesContent":["#!/usr/bin/env bun\n\nimport { Command } from 'commander';\nimport { setOutputOptions } from './lib/output.js';\nimport { createAuthCommand } from './commands/auth.js';\nimport { createAccountCommand } from './commands/account.js';\nimport { createDataSourcesCommand } from './commands/data-sources.js';\nimport { createCustomersCommand } from './commands/customers.js';\nimport { createPlansCommand } from './commands/plans.js';\nimport { createInvoicesCommand } from './commands/invoices.js';\nimport { createMetricsCommand } from './commands/metrics.js';\nimport { createActivitiesCommand } from './commands/activities.js';\n\ndeclare const __VERSION__: string | undefined;\n\nconst version = typeof __VERSION__ !== 'undefined' ? __VERSION__ : '0.0.0-dev';\n\nconst program = new Command();\n\nprogram\n .name('chartmogul')\n .description('A command-line interface for ChartMogul analytics')\n .version(version)\n .option('-c, --compact', 'Minified JSON output (single line)')\n .hook('preAction', (thisCommand) => {\n const options = thisCommand.opts();\n setOutputOptions({\n compact: options.compact,\n });\n });\n\nprogram.addCommand(createAuthCommand());\nprogram.addCommand(createAccountCommand());\nprogram.addCommand(createDataSourcesCommand());\nprogram.addCommand(createCustomersCommand());\nprogram.addCommand(createPlansCommand());\nprogram.addCommand(createInvoicesCommand());\nprogram.addCommand(createMetricsCommand());\nprogram.addCommand(createActivitiesCommand());\n\nprogram.parseAsync().catch(() => {\n process.exit(1);\n});\n","function centsToDollars(cents: number): number {\n return cents / 100;\n}\n\nconst CENTS_FIELDS = new Set([\n 'amount_in_cents',\n 'discount_amount_in_cents',\n 'tax_amount_in_cents',\n 'mrr',\n 'arr',\n 'arpa',\n 'asp',\n 'ltv',\n 'activity_mrr',\n 'activity_arr',\n 'activity_mrr_movement',\n 'new-biz',\n 'expansion',\n 'contraction',\n 'churn',\n 'reactivation',\n]);\n\nfunction isCentsField(fieldName: string): boolean {\n return CENTS_FIELDS.has(fieldName) || fieldName.endsWith('_in_cents');\n}\n\nexport function convertCentsToDollars(data: unknown): unknown {\n if (data === null || data === undefined) return data;\n if (Array.isArray(data)) return data.map(convertCentsToDollars);\n if (typeof data !== 'object') return data;\n\n const converted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n if (isCentsField(key) && typeof value === 'number') {\n converted[key] = centsToDollars(value);\n } else {\n converted[key] = convertCentsToDollars(value);\n }\n }\n return converted;\n}\n","import type { OutputOptions } from '../types/index.js';\nimport { convertCentsToDollars } from './utils.js';\n\nlet globalOutputOptions: OutputOptions = {};\n\nexport function setOutputOptions(options: OutputOptions): void {\n globalOutputOptions = options;\n}\n\nexport function outputJson(data: unknown, options: OutputOptions = {}): void {\n const convertedData = convertCentsToDollars(data);\n const mergedOptions = { ...globalOutputOptions, ...options };\n\n const jsonString = mergedOptions.compact\n ? JSON.stringify(convertedData)\n : JSON.stringify(convertedData, null, 2);\n\n console.log(jsonString);\n}\n","import { Command } from 'commander';\nimport { auth } from '../lib/auth.js';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createAuthCommand(): Command {\n const cmd = new Command('auth').description('Authentication operations');\n\n cmd\n .command('login')\n .description('Configure ChartMogul API credentials')\n .requiredOption('--api-key <key>', 'ChartMogul API Key')\n .action(\n withErrorHandling(async (options: { apiKey: string }) => {\n auth.setApiKey(options.apiKey);\n await client.ping();\n outputJson({ message: 'Successfully authenticated with ChartMogul' });\n })\n );\n\n cmd\n .command('logout')\n .description('Remove stored credentials')\n .action(\n withErrorHandling(async () => {\n auth.logout();\n outputJson({ message: 'Logged out successfully' });\n })\n );\n\n cmd\n .command('status')\n .description('Check authentication status')\n .action(\n withErrorHandling(async () => {\n outputJson({ authenticated: auth.isAuthenticated() });\n })\n );\n\n return cmd;\n}\n","import { Entry } from '@napi-rs/keyring';\nimport { config } from './config.js';\n\nconst SERVICE_NAME = 'chartmogul-cli';\nconst API_KEY_ACCOUNT = 'api-key';\n\nconst KEYRING_UNAVAILABLE_ERROR =\n 'Keychain storage unavailable. Cannot store credentials securely.\\n' +\n 'On Linux, install libsecret: sudo apt-get install libsecret-1-dev\\n' +\n 'Then reinstall: bun install -g @stephendolan/chartmogul-cli\\n' +\n 'Alternatively, use CHARTMOGUL_API_KEY environment variable.';\n\nfunction getKeyring(account: string): Entry | null {\n try {\n return new Entry(SERVICE_NAME, account);\n } catch {\n return null;\n }\n}\n\nfunction getPassword(account: string): string | null {\n const entry = getKeyring(account);\n if (entry) {\n try {\n return entry.getPassword();\n } catch {\n return null;\n }\n }\n return null;\n}\n\nfunction setPassword(account: string, value: string): void {\n const entry = getKeyring(account);\n if (!entry) {\n throw new Error(KEYRING_UNAVAILABLE_ERROR);\n }\n entry.setPassword(value);\n}\n\nfunction deletePassword(account: string): boolean {\n const entry = getKeyring(account);\n if (entry) {\n return entry.deletePassword();\n }\n return false;\n}\n\nexport class AuthManager {\n getApiKey(): string | null {\n return getPassword(API_KEY_ACCOUNT) || process.env.CHARTMOGUL_API_KEY || null;\n }\n\n setApiKey(apiKey: string): void {\n setPassword(API_KEY_ACCOUNT, apiKey);\n }\n\n isAuthenticated(): boolean {\n return this.getApiKey() !== null;\n }\n\n logout(): void {\n deletePassword(API_KEY_ACCOUNT);\n config.clearDefaultDataSource();\n }\n}\n\nexport const auth = new AuthManager();\n","import Conf from 'conf';\n\ninterface ConfigSchema {\n defaultDataSource?: string;\n}\n\nconst store = new Conf<ConfigSchema>({\n projectName: 'chartmogul-cli',\n});\n\nexport const config = {\n getDefaultDataSource(): string | undefined {\n return store.get('defaultDataSource') || process.env.CHARTMOGUL_DATA_SOURCE;\n },\n\n setDefaultDataSource(dataSourceUuid: string): void {\n store.set('defaultDataSource', dataSourceUuid);\n },\n\n clearDefaultDataSource(): void {\n store.delete('defaultDataSource');\n },\n\n clear(): void {\n store.clear();\n },\n};\n","import type { ChartMogulError } from '../types/index.js';\nimport { outputJson } from './output.js';\n\nexport class ChartMogulCliError extends Error {\n constructor(\n message: string,\n public statusCode?: number\n ) {\n super(message);\n this.name = 'ChartMogulCliError';\n }\n}\n\nexport class ChartMogulApiError extends Error {\n constructor(\n message: string,\n public apiError: unknown,\n public statusCode: number\n ) {\n super(message);\n this.name = 'ChartMogulApiError';\n }\n}\n\nexport function sanitizeErrorMessage(message: string): string {\n const sensitivePatterns = [\n /Bearer\\s+[\\w\\-._~+/]+=*/gi,\n /token[=:]\\s*[\\w\\-._~+/]+=*/gi,\n /api[_-]?key[=:]\\s*[\\w\\-._~+/]+=*/gi,\n /authorization:\\s*basic\\s+[\\w\\-._~+/]+=*/gi,\n ];\n\n let sanitized = message;\n for (const pattern of sensitivePatterns) {\n sanitized = sanitized.replace(pattern, '[REDACTED]');\n }\n\n return sanitized.length > 500 ? sanitized.substring(0, 500) + '...' : sanitized;\n}\n\ninterface ApiErrorResponse {\n error?: string;\n message?: string;\n errors?: Array<{\n key?: string;\n message?: string;\n }>;\n}\n\nfunction isErrorObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nexport function sanitizeApiError(error: unknown): ChartMogulError {\n if (!isErrorObject(error)) {\n return {\n name: 'api_error',\n detail: 'An error occurred',\n };\n }\n\n const apiError = error as ApiErrorResponse;\n\n let detail = 'An error occurred';\n if (apiError.message) {\n detail = apiError.message;\n } else if (apiError.errors?.length) {\n detail = apiError.errors\n .map((e) => e.message || e.key)\n .filter(Boolean)\n .join('; ');\n }\n\n return {\n name: apiError.error || 'api_error',\n detail: sanitizeErrorMessage(detail),\n };\n}\n\nfunction formatErrorResponse(name: string, detail: string, statusCode: number): never {\n const hint =\n name === 'too_many_requests'\n ? 'ChartMogul API rate limit exceeded. Wait a moment and retry.'\n : undefined;\n\n const response: { error: { name: string; detail: string; statusCode: number }; hint?: string } = {\n error: { name, detail, statusCode },\n };\n\n if (hint) {\n response.hint = hint;\n }\n\n outputJson(response);\n process.exit(1);\n}\n\nexport function handleChartMogulError(error: unknown): never {\n if (error instanceof ChartMogulCliError) {\n const sanitized = sanitizeErrorMessage(error.message);\n formatErrorResponse('cli_error', sanitized, error.statusCode || 1);\n }\n\n if (error instanceof ChartMogulApiError) {\n const cmError = sanitizeApiError(error.apiError);\n formatErrorResponse(cmError.name, cmError.detail, error.statusCode);\n }\n\n if (error instanceof Error) {\n const sanitized = sanitizeErrorMessage(error.message);\n formatErrorResponse('unknown_error', sanitized, 1);\n }\n\n formatErrorResponse('unknown_error', 'An unexpected error occurred', 1);\n}\n","import { auth } from './auth.js';\nimport { ChartMogulCliError, ChartMogulApiError } from './errors.js';\nimport type {\n Account,\n DataSource,\n Customer,\n Plan,\n Subscription,\n Invoice,\n MetricsResponse,\n Activity,\n CustomerListResponse,\n PaginatedResponse,\n} from '../types/index.js';\n\nconst API_BASE = 'https://api.chartmogul.com/v1';\n\nexport class ChartMogulClient {\n private getAuthHeader(): string {\n const apiKey = auth.getApiKey();\n if (!apiKey) {\n throw new ChartMogulCliError('Not authenticated. Please run: chartmogul auth login', 401);\n }\n return `Basic ${Buffer.from(`${apiKey}:`).toString('base64')}`;\n }\n\n private async request<T>(\n method: string,\n path: string,\n options: {\n params?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n } = {}\n ): Promise<T> {\n const { params, body } = options;\n\n const url = new URL(`${API_BASE}${path}`);\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n });\n }\n\n const authHeader = this.getAuthHeader();\n const fetchOptions: RequestInit = {\n method,\n headers: {\n Authorization: authHeader,\n 'Content-Type': 'application/json',\n },\n };\n if (body) {\n fetchOptions.body = JSON.stringify(body);\n }\n\n let response: Response;\n try {\n response = await fetch(url.toString(), fetchOptions);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown network error';\n throw new ChartMogulCliError(`Network request failed: ${message}`, 0);\n }\n\n if (response.status === 429) {\n const retryAfter = response.headers.get('Retry-After') || '60';\n throw new ChartMogulCliError(\n `Rate limited by ChartMogul API. Retry after ${retryAfter} seconds.`,\n 429\n );\n }\n\n if (response.status === 204) {\n return {} as T;\n }\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new ChartMogulApiError('API request failed', error, response.status);\n }\n\n return response.json() as Promise<T>;\n }\n\n async getAccount() {\n return this.request<Account>('GET', '/account');\n }\n\n async ping() {\n return this.request<{ data: string }>('GET', '/ping');\n }\n\n async listDataSources() {\n return this.request<{ data_sources: DataSource[] }>('GET', '/data_sources');\n }\n\n async getDataSource(uuid: string) {\n return this.request<DataSource>('GET', `/data_sources/${uuid}`);\n }\n\n async listCustomers(\n params: {\n data_source_uuid?: string;\n status?: string;\n system?: string;\n external_id?: string;\n page?: number;\n per_page?: number;\n } = {}\n ) {\n return this.request<CustomerListResponse>('GET', '/customers', { params });\n }\n\n async getCustomer(uuid: string) {\n return this.request<Customer>('GET', `/customers/${uuid}`);\n }\n\n async searchCustomers(email: string) {\n return this.request<{ entries: Customer[] }>('GET', '/customers/search', {\n params: { email },\n });\n }\n\n async getCustomerActivities(uuid: string, params: { page?: number; per_page?: number } = {}) {\n return this.request<PaginatedResponse<Activity>>('GET', `/customers/${uuid}/activities`, {\n params,\n });\n }\n\n async getCustomerSubscriptions(uuid: string) {\n return this.request<{ entries: Subscription[] }>('GET', `/customers/${uuid}/subscriptions`);\n }\n\n async listPlans(params: { data_source_uuid?: string; page?: number; per_page?: number } = {}) {\n return this.request<{ plans: Plan[]; has_more: boolean; per_page: number; page: number }>(\n 'GET',\n '/plans',\n { params }\n );\n }\n\n async getPlan(uuid: string) {\n return this.request<Plan>('GET', `/plans/${uuid}`);\n }\n\n async listInvoices(\n params: {\n customer_uuid?: string;\n data_source_uuid?: string;\n external_id?: string;\n page?: number;\n per_page?: number;\n } = {}\n ) {\n return this.request<{ invoices: Invoice[]; has_more: boolean }>('GET', '/invoices', { params });\n }\n\n async getInvoice(uuid: string) {\n return this.request<Invoice>('GET', `/invoices/${uuid}`);\n }\n\n async getMrr(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/mrr', { params });\n }\n\n async getArr(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/arr', { params });\n }\n\n async getArpa(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/arpa', { params });\n }\n\n async getAsp(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/asp', { params });\n }\n\n async getCustomerCount(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/customer-count', { params });\n }\n\n async getCustomerChurnRate(params: {\n 'start-date': string;\n 'end-date': string;\n interval?: string;\n }) {\n return this.request<MetricsResponse>('GET', '/metrics/customer-churn-rate', { params });\n }\n\n async getMrrChurnRate(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/mrr-churn-rate', { params });\n }\n\n async getLtv(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/ltv', { params });\n }\n\n async getAllMetrics(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/all', { params });\n }\n\n async listActivities(\n params: {\n 'start-date'?: string;\n 'end-date'?: string;\n type?: string;\n page?: number;\n per_page?: number;\n } = {}\n ) {\n return this.request<PaginatedResponse<Activity>>('GET', '/activities', { params });\n }\n}\n\nexport const client = new ChartMogulClient();\n","import { handleChartMogulError } from './errors.js';\n\nexport function withErrorHandling<T extends unknown[], R>(\n fn: (...args: T) => Promise<R>\n): (...args: T) => Promise<void> {\n return async (...args: T) => {\n try {\n await fn(...args);\n } catch (error) {\n handleChartMogulError(error);\n }\n };\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createAccountCommand(): Command {\n const cmd = new Command('account').description('Account operations');\n\n cmd\n .command('view')\n .description('View account details')\n .action(\n withErrorHandling(async () => {\n const account = await client.getAccount();\n outputJson(account);\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { config } from '../lib/config.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createDataSourcesCommand(): Command {\n const cmd = new Command('data-sources').description('Data source operations');\n\n cmd\n .command('list')\n .description('List all data sources')\n .action(\n withErrorHandling(async () => {\n const result = await client.listDataSources();\n outputJson(result.data_sources);\n })\n );\n\n cmd\n .command('view')\n .description('View a data source')\n .argument('<uuid>', 'Data source UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const dataSource = await client.getDataSource(uuid);\n outputJson(dataSource);\n })\n );\n\n cmd\n .command('set-default')\n .description('Set default data source for filtering')\n .argument('<uuid>', 'Data source UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n config.setDefaultDataSource(uuid);\n outputJson({ message: `Default data source set to ${uuid}` });\n })\n );\n\n cmd\n .command('get-default')\n .description('Get default data source')\n .action(\n withErrorHandling(async () => {\n const defaultDs = config.getDefaultDataSource();\n outputJson({ default_data_source: defaultDs || null });\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { config } from '../lib/config.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createCustomersCommand(): Command {\n const cmd = new Command('customers').description('Customer queries');\n\n cmd\n .command('list')\n .description('List customers')\n .option('--data-source <uuid>', 'Filter by data source UUID')\n .option('--status <status>', 'Filter by status (Lead, Active, Cancelled)')\n .option('--external-id <id>', 'Filter by external ID')\n .option('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page (max 200)')\n .action(\n withErrorHandling(\n async (options: {\n dataSource?: string;\n status?: string;\n externalId?: string;\n page?: string;\n perPage?: string;\n }) => {\n const result = await client.listCustomers({\n data_source_uuid: options.dataSource || config.getDefaultDataSource(),\n status: options.status,\n external_id: options.externalId,\n page: options.page ? parseInt(options.page, 10) : undefined,\n per_page: options.perPage ? parseInt(options.perPage, 10) : undefined,\n });\n outputJson(result);\n }\n )\n );\n\n cmd\n .command('view')\n .description('View a customer')\n .argument('<uuid>', 'Customer UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const customer = await client.getCustomer(uuid);\n outputJson(customer);\n })\n );\n\n cmd\n .command('search')\n .description('Search customers by email')\n .requiredOption('--email <email>', 'Email address to search')\n .action(\n withErrorHandling(async (options: { email: string }) => {\n const result = await client.searchCustomers(options.email);\n outputJson(result.entries);\n })\n );\n\n cmd\n .command('activities')\n .description('List customer activities')\n .argument('<uuid>', 'Customer UUID')\n .option('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page')\n .action(\n withErrorHandling(async (uuid: string, options: { page?: string; perPage?: string }) => {\n const result = await client.getCustomerActivities(uuid, {\n page: options.page ? parseInt(options.page, 10) : undefined,\n per_page: options.perPage ? parseInt(options.perPage, 10) : undefined,\n });\n outputJson(result);\n })\n );\n\n cmd\n .command('subscriptions')\n .description('List customer subscriptions')\n .argument('<uuid>', 'Customer UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const result = await client.getCustomerSubscriptions(uuid);\n outputJson(result.entries);\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { config } from '../lib/config.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createPlansCommand(): Command {\n const cmd = new Command('plans').description('Plan queries');\n\n cmd\n .command('list')\n .description('List plans')\n .option('--data-source <uuid>', 'Filter by data source UUID')\n .option('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page')\n .action(\n withErrorHandling(\n async (options: { dataSource?: string; page?: string; perPage?: string }) => {\n const result = await client.listPlans({\n data_source_uuid: options.dataSource || config.getDefaultDataSource(),\n page: options.page ? parseInt(options.page, 10) : undefined,\n per_page: options.perPage ? parseInt(options.perPage, 10) : undefined,\n });\n outputJson(result);\n }\n )\n );\n\n cmd\n .command('view')\n .description('View a plan')\n .argument('<uuid>', 'Plan UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const plan = await client.getPlan(uuid);\n outputJson(plan);\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { config } from '../lib/config.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createInvoicesCommand(): Command {\n const cmd = new Command('invoices').description('Invoice queries');\n\n cmd\n .command('list')\n .description('List invoices')\n .option('--customer <uuid>', 'Filter by customer UUID')\n .option('--data-source <uuid>', 'Filter by data source UUID')\n .option('--external-id <id>', 'Filter by external ID')\n .option('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page')\n .action(\n withErrorHandling(\n async (options: {\n customer?: string;\n dataSource?: string;\n externalId?: string;\n page?: string;\n perPage?: string;\n }) => {\n const result = await client.listInvoices({\n customer_uuid: options.customer,\n data_source_uuid: options.dataSource || config.getDefaultDataSource(),\n external_id: options.externalId,\n page: options.page ? parseInt(options.page, 10) : undefined,\n per_page: options.perPage ? parseInt(options.perPage, 10) : undefined,\n });\n outputJson(result);\n }\n )\n );\n\n cmd\n .command('view')\n .description('View an invoice')\n .argument('<uuid>', 'Invoice UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const invoice = await client.getInvoice(uuid);\n outputJson(invoice);\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\nimport { getDefaultDateRange, parseDate } from '../lib/dates.js';\n\ninterface MetricOptions {\n startDate?: string;\n endDate?: string;\n interval?: string;\n}\n\nfunction buildMetricParams(options: MetricOptions) {\n const defaults = getDefaultDateRange();\n return {\n 'start-date': options.startDate ? parseDate(options.startDate) : defaults.startDate,\n 'end-date': options.endDate ? parseDate(options.endDate) : defaults.endDate,\n interval: options.interval,\n };\n}\n\nexport function createMetricsCommand(): Command {\n const cmd = new Command('metrics').description('Metrics and analytics');\n\n cmd\n .command('all')\n .description('Get all key metrics')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getAllMetrics(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('mrr')\n .description('Get Monthly Recurring Revenue')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getMrr(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('arr')\n .description('Get Annual Recurring Revenue')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getArr(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('arpa')\n .description('Get Average Revenue Per Account')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getArpa(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('asp')\n .description('Get Average Sale Price')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getAsp(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('customer-count')\n .description('Get customer count over time')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getCustomerCount(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('customer-churn')\n .description('Get customer churn rate')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getCustomerChurnRate(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('mrr-churn')\n .description('Get MRR churn rate')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getMrrChurnRate(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('ltv')\n .description('Get Customer Lifetime Value')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getLtv(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n return cmd;\n}\n","import dayjs from 'dayjs';\nimport { ChartMogulCliError } from './errors.js';\n\nexport function parseDate(input: string): string {\n const d = dayjs(input);\n if (!d.isValid()) {\n throw new ChartMogulCliError(`Invalid date: ${input}`, 400);\n }\n return d.format('YYYY-MM-DD');\n}\n\nexport function getDefaultDateRange(): { startDate: string; endDate: string } {\n return {\n startDate: dayjs().subtract(30, 'day').format('YYYY-MM-DD'),\n endDate: dayjs().format('YYYY-MM-DD'),\n };\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createActivitiesCommand(): Command {\n const cmd = new Command('activities').description('Activity operations');\n\n cmd\n .command('list')\n .description('List activities')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--type <type>', 'Activity type (new_biz, expansion, contraction, churn, reactivation)')\n .option('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page')\n .action(\n withErrorHandling(\n async (options: {\n startDate?: string;\n endDate?: string;\n type?: string;\n page?: string;\n perPage?: string;\n }) => {\n const result = await client.listActivities({\n 'start-date': options.startDate,\n 'end-date': options.endDate,\n type: options.type,\n page: options.page ? parseInt(options.page, 10) : undefined,\n per_page: options.perPage ? parseInt(options.perPage, 10) : undefined,\n });\n outputJson(result);\n }\n )\n );\n\n return cmd;\n}\n"],"mappings":"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","names":["Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stephendolan/chartmogul-cli",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "A command-line interface for ChartMogul analytics",
5
5
  "type": "module",
6
6
  "main": "./dist/cli.js",