@chatlychat/cli 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/ai.d.ts +4 -0
- package/dist/commands/ai.d.ts.map +1 -0
- package/dist/commands/ai.js +149 -0
- package/dist/commands/ai.js.map +1 -0
- package/dist/commands/common.d.ts +79 -0
- package/dist/commands/common.d.ts.map +1 -0
- package/dist/commands/common.js +194 -0
- package/dist/commands/common.js.map +1 -0
- package/dist/commands/config.d.ts +40 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +336 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/insights.d.ts +5 -0
- package/dist/commands/insights.d.ts.map +1 -0
- package/dist/commands/insights.js +277 -0
- package/dist/commands/insights.js.map +1 -0
- package/dist/commands/integrations.d.ts +15 -0
- package/dist/commands/integrations.d.ts.map +1 -0
- package/dist/commands/integrations.js +256 -0
- package/dist/commands/integrations.js.map +1 -0
- package/dist/commands/resources.d.ts +19 -7
- package/dist/commands/resources.d.ts.map +1 -1
- package/dist/commands/resources.js +92 -167
- package/dist/commands/resources.js.map +1 -1
- package/dist/commands/workspace-as-code.d.ts +27 -0
- package/dist/commands/workspace-as-code.d.ts.map +1 -0
- package/dist/commands/workspace-as-code.js +377 -0
- package/dist/commands/workspace-as-code.js.map +1 -0
- package/dist/help.d.ts +25 -1
- package/dist/help.d.ts.map +1 -1
- package/dist/help.js +104 -8
- package/dist/help.js.map +1 -1
- package/dist/run.d.ts +17 -0
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +88 -41
- package/dist/run.js.map +1 -1
- package/dist/wac/__tests__/wac-fixtures.d.ts +20 -0
- package/dist/wac/__tests__/wac-fixtures.d.ts.map +1 -0
- package/dist/wac/__tests__/wac-fixtures.js +38 -0
- package/dist/wac/__tests__/wac-fixtures.js.map +1 -0
- package/dist/wac/apply.d.ts +113 -0
- package/dist/wac/apply.d.ts.map +1 -0
- package/dist/wac/apply.js +265 -0
- package/dist/wac/apply.js.map +1 -0
- package/dist/wac/diff.d.ts +137 -0
- package/dist/wac/diff.d.ts.map +1 -0
- package/dist/wac/diff.js +413 -0
- package/dist/wac/diff.js.map +1 -0
- package/dist/wac/document.d.ts +110 -0
- package/dist/wac/document.d.ts.map +1 -0
- package/dist/wac/document.js +429 -0
- package/dist/wac/document.js.map +1 -0
- package/dist/wac/render.d.ts +52 -0
- package/dist/wac/render.d.ts.map +1 -0
- package/dist/wac/render.js +156 -0
- package/dist/wac/render.js.map +1 -0
- package/dist/wac/resource-def.d.ts +116 -0
- package/dist/wac/resource-def.d.ts.map +1 -0
- package/dist/wac/resource-def.js +44 -0
- package/dist/wac/resource-def.js.map +1 -0
- package/dist/wac/resources.d.ts +104 -0
- package/dist/wac/resources.d.ts.map +1 -0
- package/dist/wac/resources.js +541 -0
- package/dist/wac/resources.js.map +1 -0
- package/dist/wac/values.d.ts +16 -0
- package/dist/wac/values.d.ts.map +1 -0
- package/dist/wac/values.js +53 -0
- package/dist/wac/values.js.map +1 -0
- package/package.json +2 -1
- package/dist/cli.spec.d.ts +0 -2
- package/dist/cli.spec.d.ts.map +0 -1
- package/dist/cli.spec.js +0 -226
- package/dist/cli.spec.js.map +0 -1
package/dist/cli.spec.js
DELETED
|
@@ -1,226 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The CLI, exercised end to end with only the socket faked.
|
|
3
|
-
*
|
|
4
|
-
* `run()` takes argv and a client factory, so these tests drive the real
|
|
5
|
-
* argument parser, the real `ChatlyClient`, the real transport, the real
|
|
6
|
-
* retry policy and the real error mapping. A test that stubbed the SDK would
|
|
7
|
-
* prove the CLI calls a mock, which is not the thing worth knowing.
|
|
8
|
-
*/
|
|
9
|
-
import { mkdtempSync, readFileSync, statSync } from 'node:fs';
|
|
10
|
-
import { tmpdir } from 'node:os';
|
|
11
|
-
import { join } from 'node:path';
|
|
12
|
-
import { ChatlyClient } from '@chatlychat/sdk-node';
|
|
13
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
14
|
-
import { bool, num, parseArgs, str } from './args.js';
|
|
15
|
-
import { resolveCredentials, writeConfig } from './config.js';
|
|
16
|
-
import { itemsOf, nextCursorOf } from './output.js';
|
|
17
|
-
import { explain, run } from './run.js';
|
|
18
|
-
describe('parseArgs', () => {
|
|
19
|
-
it('splits the command path from the flags', () => {
|
|
20
|
-
const a = parseArgs(['conversations', 'send', 'conv_1', '--json']);
|
|
21
|
-
expect(a.path).toEqual(['conversations', 'send', 'conv_1']);
|
|
22
|
-
expect(a.flags).toEqual({ json: true });
|
|
23
|
-
});
|
|
24
|
-
it('accepts --key=value and --key value alike', () => {
|
|
25
|
-
expect(str(parseArgs(['x', '--limit=5']).flags, 'limit')).toBe('5');
|
|
26
|
-
expect(str(parseArgs(['x', '--limit', '5']).flags, 'limit')).toBe('5');
|
|
27
|
-
});
|
|
28
|
-
it('collects a repeated flag into an array', () => {
|
|
29
|
-
const a = parseArgs(['events', 'track', '--prop', 'a=1', '--prop', 'b=2']);
|
|
30
|
-
expect(a.flags['prop']).toEqual(['a=1', 'b=2']);
|
|
31
|
-
});
|
|
32
|
-
it('keeps a positional that follows a flag', () => {
|
|
33
|
-
// `chatly search --limit 5 refunds` must work as well as the other order.
|
|
34
|
-
const a = parseArgs(['search', '--limit', '5', 'refunds']);
|
|
35
|
-
expect(a.path).toEqual(['search', 'refunds']);
|
|
36
|
-
expect(str(a.flags, 'limit')).toBe('5');
|
|
37
|
-
});
|
|
38
|
-
it('rejects a non-numeric --limit instead of silently passing NaN', () => {
|
|
39
|
-
expect(() => num(parseArgs(['x', '--limit', 'lots']).flags, 'limit')).toThrow(/expects a number/);
|
|
40
|
-
});
|
|
41
|
-
it('treats a trailing flag with no value as true', () => {
|
|
42
|
-
expect(bool(parseArgs(['x', '--all']).flags, 'all')).toBe(true);
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
describe('credential resolution', () => {
|
|
46
|
-
let dir;
|
|
47
|
-
let path;
|
|
48
|
-
beforeEach(() => {
|
|
49
|
-
dir = mkdtempSync(join(tmpdir(), 'chatly-cli-'));
|
|
50
|
-
path = join(dir, 'config.json');
|
|
51
|
-
});
|
|
52
|
-
const write = (c) => {
|
|
53
|
-
writeConfig(c, path);
|
|
54
|
-
};
|
|
55
|
-
it('prefers --key over the environment over the file', () => {
|
|
56
|
-
write({ apiKey: 'ck_file' });
|
|
57
|
-
const env = { CHATLY_API_KEY: 'ck_env' };
|
|
58
|
-
expect(resolveCredentials('ck_flag', undefined, env, path).source).toBe('flag');
|
|
59
|
-
expect(resolveCredentials(undefined, undefined, env, path).apiKey).toBe('ck_env');
|
|
60
|
-
expect(resolveCredentials(undefined, undefined, {}, path).apiKey).toBe('ck_file');
|
|
61
|
-
});
|
|
62
|
-
it('writes the config 0600, because the key is a workspace-wide bearer token', () => {
|
|
63
|
-
write({ apiKey: 'ck_secret' });
|
|
64
|
-
expect(statSync(path).mode & 0o777).toBe(0o600);
|
|
65
|
-
expect(JSON.parse(readFileSync(path, 'utf8')).apiKey).toBe('ck_secret');
|
|
66
|
-
});
|
|
67
|
-
it('re-chmods an existing file, since writeFileSync mode only applies on create', () => {
|
|
68
|
-
write({ apiKey: 'ck_one' });
|
|
69
|
-
write({ apiKey: 'ck_two' });
|
|
70
|
-
expect(statSync(path).mode & 0o777).toBe(0o600);
|
|
71
|
-
});
|
|
72
|
-
it('says what to do when there is no key at all', () => {
|
|
73
|
-
expect(() => resolveCredentials(undefined, undefined, {}, path)).toThrow(/chatly login/);
|
|
74
|
-
});
|
|
75
|
-
it('survives a corrupt config file rather than refusing to run', () => {
|
|
76
|
-
writeConfig({}, path);
|
|
77
|
-
const env = { CHATLY_API_KEY: 'ck_env' };
|
|
78
|
-
expect(resolveCredentials(undefined, undefined, env, path).apiKey).toBe('ck_env');
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
describe('output helpers', () => {
|
|
82
|
-
it('finds items under either envelope and nowhere else', () => {
|
|
83
|
-
expect(itemsOf({ items: [1, 2] })).toEqual([1, 2]);
|
|
84
|
-
expect(itemsOf({ data: [3] })).toEqual([3]);
|
|
85
|
-
expect(itemsOf([4])).toEqual([4]);
|
|
86
|
-
expect(itemsOf({ nope: 1 })).toEqual([]);
|
|
87
|
-
expect(itemsOf(null)).toEqual([]);
|
|
88
|
-
});
|
|
89
|
-
it('treats an empty cursor as no cursor', () => {
|
|
90
|
-
expect(nextCursorOf({ nextCursor: 'c' })).toBe('c');
|
|
91
|
-
expect(nextCursorOf({ nextCursor: '' })).toBeNull();
|
|
92
|
-
expect(nextCursorOf({ nextCursor: null })).toBeNull();
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
describe('run() against a faked socket', () => {
|
|
96
|
-
let out;
|
|
97
|
-
let err;
|
|
98
|
-
beforeEach(() => {
|
|
99
|
-
out = [];
|
|
100
|
-
err = [];
|
|
101
|
-
vi.spyOn(process.stdout, 'write').mockImplementation((chunk) => {
|
|
102
|
-
out.push(String(chunk));
|
|
103
|
-
return true;
|
|
104
|
-
});
|
|
105
|
-
vi.spyOn(process.stderr, 'write').mockImplementation((chunk) => {
|
|
106
|
-
err.push(String(chunk));
|
|
107
|
-
return true;
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
afterEach(() => {
|
|
111
|
-
vi.restoreAllMocks();
|
|
112
|
-
});
|
|
113
|
-
/** A factory whose client talks to a scripted fetch, not the network. */
|
|
114
|
-
function factoryFor(responses, seen = []) {
|
|
115
|
-
let i = 0;
|
|
116
|
-
const fetchFn = (async (url, init) => {
|
|
117
|
-
seen.push({ url: String(url), method: init?.method ?? 'GET' });
|
|
118
|
-
const step = responses[Math.min(i, responses.length - 1)] ?? { status: 200, body: '{}' };
|
|
119
|
-
i += 1;
|
|
120
|
-
return new Response(step.body, {
|
|
121
|
-
status: step.status,
|
|
122
|
-
headers: { 'content-type': 'application/json' },
|
|
123
|
-
});
|
|
124
|
-
});
|
|
125
|
-
return (opts) => new ChatlyClient({
|
|
126
|
-
...opts,
|
|
127
|
-
fetchFn,
|
|
128
|
-
sleepFn: async () => undefined,
|
|
129
|
-
retry: { attempts: 1 },
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
it('prints the version, not the help, for --version', async () => {
|
|
133
|
-
const { version } = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'));
|
|
134
|
-
expect(await run(['--version'], factoryFor([]))).toBe(0);
|
|
135
|
-
/*
|
|
136
|
-
* Against package.json, not against a literal.
|
|
137
|
-
*
|
|
138
|
-
* This asserted `'0.1.0\n'` and passed while the published package was
|
|
139
|
-
* 0.1.2, so `chatly --version` lied to every user and to support. A test
|
|
140
|
-
* that hard-codes the value it is checking cannot catch drift in it.
|
|
141
|
-
*/
|
|
142
|
-
expect(out.join('')).toBe(`${version}\n`);
|
|
143
|
-
});
|
|
144
|
-
it('whoami prints the workspace and scopes', async () => {
|
|
145
|
-
const code = await run(['whoami', '--key', 'ck_test'], factoryFor([{ status: 200, body: '{"workspaceId":"ws_1","scopes":["contacts:read"]}' }]));
|
|
146
|
-
expect(code).toBe(0);
|
|
147
|
-
expect(out.join('')).toContain('ws_1');
|
|
148
|
-
expect(out.join('')).toContain('contacts:read');
|
|
149
|
-
});
|
|
150
|
-
it('renders a list as a table, and the raw envelope with --json', async () => {
|
|
151
|
-
const body = '{"items":[{"id":"c_1","name":"Ada","email":"ada@x.test"}],"nextCursor":null}';
|
|
152
|
-
await run(['contacts', 'list', '--key', 'ck_test'], factoryFor([{ status: 200, body }]));
|
|
153
|
-
expect(out.join('')).toContain('ID');
|
|
154
|
-
expect(out.join('')).toContain('Ada');
|
|
155
|
-
out.length = 0;
|
|
156
|
-
await run(['contacts', 'list', '--key', 'ck_test', '--json'], factoryFor([{ status: 200, body }]));
|
|
157
|
-
expect(JSON.parse(out.join(''))).toEqual({
|
|
158
|
-
items: [{ id: 'c_1', name: 'Ada', email: 'ada@x.test' }],
|
|
159
|
-
nextCursor: null,
|
|
160
|
-
});
|
|
161
|
-
});
|
|
162
|
-
it('--all walks every page', async () => {
|
|
163
|
-
const seen = [];
|
|
164
|
-
await run(['contacts', 'list', '--key', 'ck_test', '--all', '--json'], factoryFor([
|
|
165
|
-
{ status: 200, body: '{"items":[{"id":"a"}],"nextCursor":"p2"}' },
|
|
166
|
-
{ status: 200, body: '{"items":[{"id":"b"}],"nextCursor":null}' },
|
|
167
|
-
], seen));
|
|
168
|
-
expect(seen).toHaveLength(2);
|
|
169
|
-
expect(JSON.parse(out.join(''))).toEqual([{ id: 'a' }, { id: 'b' }]);
|
|
170
|
-
});
|
|
171
|
-
it('api passes an arbitrary route through, with the method it was given', async () => {
|
|
172
|
-
const seen = [];
|
|
173
|
-
await run(['api', 'POST', '/v1/feature-flags', '--key', 'ck_test', '--body', '{"key":"x"}'], factoryFor([{ status: 200, body: '{"ok":true}' }], seen));
|
|
174
|
-
expect(seen[0]?.method).toBe('POST');
|
|
175
|
-
expect(seen[0]?.url).toContain('/v1/feature-flags');
|
|
176
|
-
});
|
|
177
|
-
it('api refuses a body that is not JSON instead of sending it', async () => {
|
|
178
|
-
await expect(run(['api', 'POST', '/v1/x', '--key', 'ck_test', '--body', 'not json'], factoryFor([]))).rejects.toThrow(/not valid JSON/);
|
|
179
|
-
});
|
|
180
|
-
it('api refuses a path that is not a path', async () => {
|
|
181
|
-
await expect(run(['api', 'GET', 'v1/contacts', '--key', 'ck_test'], factoryFor([]))).rejects.toThrow(/Give a path/);
|
|
182
|
-
});
|
|
183
|
-
it('exits 2 and names the command for an unknown one', async () => {
|
|
184
|
-
expect(await run(['nonsense', '--key', 'ck_test'], factoryFor([]))).toBe(2);
|
|
185
|
-
expect(err.join('')).toContain('Unknown command "nonsense"');
|
|
186
|
-
});
|
|
187
|
-
it('refuses to send an empty reply', async () => {
|
|
188
|
-
await expect(run(['conversations', 'send', 'conv_1', '--key', 'ck_test'], factoryFor([]))).rejects.toThrow(/Nothing to send/);
|
|
189
|
-
});
|
|
190
|
-
});
|
|
191
|
-
describe('explain()', () => {
|
|
192
|
-
it('turns a 401 into advice about the key, not a stack trace', async () => {
|
|
193
|
-
const { ChatlyAuthenticationError } = await import('@chatlychat/sdk-node');
|
|
194
|
-
const e = new ChatlyAuthenticationError({
|
|
195
|
-
status: 401,
|
|
196
|
-
code: 'unauthorized',
|
|
197
|
-
message: 'bad key',
|
|
198
|
-
requestId: 'req_9',
|
|
199
|
-
body: '{}',
|
|
200
|
-
retryAfter: null,
|
|
201
|
-
});
|
|
202
|
-
const { code, message } = explain(e);
|
|
203
|
-
expect(code).toBe(1);
|
|
204
|
-
expect(message).toContain('req_9');
|
|
205
|
-
expect(message).toContain('chatly login');
|
|
206
|
-
});
|
|
207
|
-
it('distinguishes a missing scope (403) from a bad key (401)', async () => {
|
|
208
|
-
const { ChatlyPermissionError } = await import('@chatlychat/sdk-node');
|
|
209
|
-
const { message } = explain(new ChatlyPermissionError({
|
|
210
|
-
status: 403,
|
|
211
|
-
code: 'forbidden',
|
|
212
|
-
message: 'no',
|
|
213
|
-
requestId: null,
|
|
214
|
-
body: '{}',
|
|
215
|
-
retryAfter: null,
|
|
216
|
-
}));
|
|
217
|
-
expect(message).toContain('lacks a scope');
|
|
218
|
-
expect(message).not.toContain('chatly login');
|
|
219
|
-
});
|
|
220
|
-
it('says a transport failure never reached Chatly', async () => {
|
|
221
|
-
const { ChatlyTransportError } = await import('@chatlychat/sdk-node');
|
|
222
|
-
const { message } = explain(new ChatlyTransportError('request failed: GET /v1/x'));
|
|
223
|
-
expect(message).toContain('never reached Chatly');
|
|
224
|
-
});
|
|
225
|
-
});
|
|
226
|
-
//# sourceMappingURL=cli.spec.js.map
|
package/dist/cli.spec.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.spec.js","sourceRoot":"","sources":["../src/cli.spec.ts"],"names":[],"mappings":"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"}
|