@martini-film/cli 0.2.0 → 0.4.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.
Files changed (46) hide show
  1. package/README.md +173 -56
  2. package/dist/api.js +69 -2
  3. package/dist/api.js.map +1 -1
  4. package/dist/approve.js +2 -1
  5. package/dist/approve.js.map +1 -1
  6. package/dist/args.js +31 -6
  7. package/dist/args.js.map +1 -1
  8. package/dist/cli.js +457 -110
  9. package/dist/cli.js.map +1 -1
  10. package/dist/commands/assets.js +297 -45
  11. package/dist/commands/assets.js.map +1 -1
  12. package/dist/commands/call.js +99 -0
  13. package/dist/commands/call.js.map +1 -0
  14. package/dist/commands/context.js +16 -3
  15. package/dist/commands/context.js.map +1 -1
  16. package/dist/commands/files.js +208 -83
  17. package/dist/commands/files.js.map +1 -1
  18. package/dist/commands/guide.js +67 -0
  19. package/dist/commands/guide.js.map +1 -0
  20. package/dist/commands/init.js +196 -0
  21. package/dist/commands/init.js.map +1 -0
  22. package/dist/commands/login.js +69 -15
  23. package/dist/commands/login.js.map +1 -1
  24. package/dist/commands/tools.js +63 -78
  25. package/dist/commands/tools.js.map +1 -1
  26. package/dist/commands/use.js +143 -0
  27. package/dist/commands/use.js.map +1 -0
  28. package/dist/config.js +87 -6
  29. package/dist/config.js.map +1 -1
  30. package/dist/generated/guide.json +104 -0
  31. package/dist/generated/manifest.json +3885 -241
  32. package/dist/guideCache.js +204 -0
  33. package/dist/guideCache.js.map +1 -0
  34. package/dist/help.js +391 -34
  35. package/dist/help.js.map +1 -1
  36. package/dist/manifest.js +34 -3
  37. package/dist/manifest.js.map +1 -1
  38. package/dist/manifestCache.js +196 -0
  39. package/dist/manifestCache.js.map +1 -0
  40. package/dist/output.js +251 -28
  41. package/dist/output.js.map +1 -1
  42. package/dist/schema.js +132 -15
  43. package/dist/schema.js.map +1 -1
  44. package/dist/wait.js +181 -8
  45. package/dist/wait.js.map +1 -1
  46. package/package.json +2 -2
@@ -0,0 +1,204 @@
1
+ import { readFileSync, rmSync } from 'node:fs';
2
+ import { CLI_VERSION, MANIFEST_FETCH_TIMEOUT_MS, userAgent } from './api.js';
3
+ import { isRunKey } from './config.js';
4
+ import guideJson from './generated/guide.json' with { type: 'json' };
5
+ import { credentialCachePath, MANIFEST_REFRESH_ENV, refreshDisabled, writePrivateFileAtomic, } from './manifestCache.js';
6
+ export const GUIDE_TRANSPORT = 'cli';
7
+ export const GUIDE_HASH_HEADER = 'x-martini-guide-hash';
8
+ export function loadBakedGuide() {
9
+ return guideJson;
10
+ }
11
+ export function guideCachePath(env, apiUrl, apiKey) {
12
+ return credentialCachePath('guide', env, apiUrl, apiKey);
13
+ }
14
+ export function openGuide(options) {
15
+ const { baked, apiUrl, apiKey, env, warn } = options;
16
+ const now = options.now ?? Date.now;
17
+ const runKey = isRunKey(apiKey);
18
+ const cachePath = apiKey && !runKey ? guideCachePath(env, apiUrl, apiKey) : null;
19
+ let cached = cachePath ? readCache(cachePath, warn) : null;
20
+ return {
21
+ get state() {
22
+ if (cached)
23
+ return { source: 'cache', guide: cached.guide, fetchedAt: cached.fetchedAt, cachePath };
24
+ return { source: 'baked', guide: baked, cachePath };
25
+ },
26
+ async refresh({ force = false } = {}) {
27
+ if (!apiKey || runKey)
28
+ return 'skipped';
29
+ if (refreshDisabled(env)) {
30
+ if (force) {
31
+ warn('GUIDE_REFRESH_DISABLED', `${MANIFEST_REFRESH_ENV}=${env[MANIFEST_REFRESH_ENV]} turns refreshes off, so the guide was not fetched. Unset it to refresh.`);
32
+ }
33
+ return 'skipped';
34
+ }
35
+ const inUse = cached ? `the cached guide from ${cached.fetchedAt}` : "this build's guide";
36
+ let answer;
37
+ try {
38
+ answer = await options.fetchGuide(force || !cached ? undefined : cached.guide.hash);
39
+ }
40
+ catch (error) {
41
+ warn('GUIDE_REFRESH_FAILED', `Could not refresh the guide from ${apiUrl} (${messageOf(error)}); printing ${inUse}.`);
42
+ return 'failed';
43
+ }
44
+ if (answer.notModified)
45
+ return 'unchanged';
46
+ const guide = usableGuide(answer.body, answer.etag);
47
+ if (!guide) {
48
+ warn('GUIDE_REFRESH_FAILED', `The server answered GET /v1/guide without a usable guide; printing ${inUse}.`);
49
+ return 'failed';
50
+ }
51
+ cached = { guide, fetchedAt: new Date(now()).toISOString() };
52
+ if (cachePath) {
53
+ try {
54
+ writePrivateFileAtomic(cachePath, JSON.stringify({ ...cached.guide, fetchedAt: cached.fetchedAt }));
55
+ }
56
+ catch (error) {
57
+ warn('GUIDE_CACHE_WRITE_FAILED', `Could not save the guide to ${cachePath} (${messageOf(error)}); only this command uses it.`);
58
+ }
59
+ }
60
+ return 'updated';
61
+ },
62
+ };
63
+ }
64
+ export function guideFetcher(options) {
65
+ return async (ifNoneMatch) => {
66
+ const headers = {
67
+ 'User-Agent': userAgent(options.env),
68
+ 'X-Martini-Client': `martini-cli/${CLI_VERSION}`,
69
+ ...(options.apiKey ? { Authorization: `Bearer ${options.apiKey}` } : {}),
70
+ ...(ifNoneMatch ? { 'If-None-Match': `"${ifNoneMatch}"` } : {}),
71
+ };
72
+ const response = await options.fetch(`${options.apiUrl}/v1/guide?transport=${GUIDE_TRANSPORT}`, {
73
+ method: 'GET',
74
+ headers,
75
+ signal: AbortSignal.timeout(MANIFEST_FETCH_TIMEOUT_MS),
76
+ });
77
+ if (response.status === 304)
78
+ return { notModified: true };
79
+ if (!response.ok) {
80
+ let detail = '';
81
+ try {
82
+ const body = (await response.json());
83
+ if (typeof body.error === 'string')
84
+ detail = `: ${body.error}`;
85
+ }
86
+ catch {
87
+ }
88
+ throw new Error(`GET /v1/guide answered ${response.status}${detail}`);
89
+ }
90
+ const etag = response.headers
91
+ .get('etag')
92
+ ?.replace(/^W\//, '')
93
+ .replace(/^"(.*)"$/, '$1');
94
+ return { notModified: false, body: await response.json(), etag: etag ?? null };
95
+ };
96
+ }
97
+ function isRecord(value) {
98
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
99
+ }
100
+ function isTopic(value) {
101
+ return (isRecord(value) &&
102
+ typeof value.id === 'string' &&
103
+ value.id.length > 0 &&
104
+ typeof value.title === 'string' &&
105
+ Array.isArray(value.lines) &&
106
+ value.lines.every(line => typeof line === 'string'));
107
+ }
108
+ export function usableGuide(body, etag) {
109
+ if (!isRecord(body) || body.version !== 1 || body.transport !== GUIDE_TRANSPORT)
110
+ return null;
111
+ const hash = typeof body.hash === 'string' && body.hash ? body.hash : etag;
112
+ if (!hash || !Array.isArray(body.topics) || body.topics.length === 0 || !body.topics.every(isTopic))
113
+ return null;
114
+ return {
115
+ version: 1,
116
+ transport: GUIDE_TRANSPORT,
117
+ hash,
118
+ generatedAt: typeof body.generatedAt === 'string' ? body.generatedAt : '',
119
+ topics: body.topics.map(({ id, title, lines }) => ({ id, title, lines: [...lines] })),
120
+ };
121
+ }
122
+ export function guideHashNotice(options) {
123
+ const { apiKey } = options;
124
+ if (options.quiet)
125
+ return () => undefined;
126
+ const keyed = apiKey && !isRunKey(apiKey) ? apiKey : null;
127
+ const cachePath = keyed ? guideCachePath(options.env, options.apiUrl, keyed) : null;
128
+ const noticePath = keyed ? credentialCachePath('guide-notice', options.env, options.apiUrl, keyed) : null;
129
+ let localHash;
130
+ let said = false;
131
+ return serverHash => {
132
+ if (!cachePath || !noticePath || said || !serverHash)
133
+ return;
134
+ localHash ??= peekGuideHash(cachePath) ?? options.baked.hash;
135
+ if (serverHash === localHash)
136
+ return;
137
+ const notice = readNotice(noticePath);
138
+ if (notice?.serverHash === serverHash && notice.localHash === localHash)
139
+ return;
140
+ said = true;
141
+ options.warn('GUIDE_CHANGED', `The operator guide changed since the copy this CLI has (${localHash.slice(0, 12)} → ${serverHash.slice(0, 12)}). Run martini guide (or martini guide <topic>) before relying on it.`);
142
+ try {
143
+ writePrivateFileAtomic(noticePath, JSON.stringify({ localHash, serverHash }));
144
+ }
145
+ catch {
146
+ }
147
+ };
148
+ }
149
+ function peekGuideHash(path) {
150
+ try {
151
+ const entry = JSON.parse(readFileSync(path, 'utf8'));
152
+ return usableGuide(entry, null)?.hash ?? null;
153
+ }
154
+ catch {
155
+ return null;
156
+ }
157
+ }
158
+ function readNotice(path) {
159
+ try {
160
+ const entry = JSON.parse(readFileSync(path, 'utf8'));
161
+ if (!entry || typeof entry !== 'object')
162
+ return null;
163
+ const { localHash, serverHash } = entry;
164
+ return typeof localHash === 'string' && typeof serverHash === 'string' ? { localHash, serverHash } : null;
165
+ }
166
+ catch {
167
+ return null;
168
+ }
169
+ }
170
+ function messageOf(error) {
171
+ return error instanceof Error ? error.message : String(error);
172
+ }
173
+ function readCache(path, warn) {
174
+ let text;
175
+ try {
176
+ text = readFileSync(path, 'utf8');
177
+ }
178
+ catch (error) {
179
+ const code = error.code;
180
+ if (code === 'ENOENT' || code === 'ENOTDIR')
181
+ return null;
182
+ warn('GUIDE_CACHE_IGNORED', `Could not read the cached guide ${path} (${messageOf(error)}); printing this build's.`);
183
+ return null;
184
+ }
185
+ let entry;
186
+ try {
187
+ entry = JSON.parse(text);
188
+ }
189
+ catch {
190
+ entry = null;
191
+ }
192
+ const guide = usableGuide(entry, null);
193
+ if (!guide || !isRecord(entry) || typeof entry.fetchedAt !== 'string') {
194
+ try {
195
+ rmSync(path, { force: true });
196
+ }
197
+ catch {
198
+ }
199
+ warn('GUIDE_CACHE_IGNORED', `The cached guide ${path} was not valid and has been removed.`);
200
+ return null;
201
+ }
202
+ return { guide, fetchedAt: entry.fetchedAt };
203
+ }
204
+ //# sourceMappingURL=guideCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guideCache.js","sourceRoot":"","sources":["../src/guideCache.ts"],"names":[],"mappings":"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"}