@workjournal/cli 0.1.0 → 0.3.1
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/api-client.d.ts +28 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +114 -0
- package/dist/api-client.js.map +1 -0
- package/dist/auth.d.ts +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +6 -3
- package/dist/auth.js.map +1 -1
- package/dist/commands/entries.d.ts +7 -0
- package/dist/commands/entries.d.ts.map +1 -0
- package/dist/commands/entries.js +102 -0
- package/dist/commands/entries.js.map +1 -0
- package/dist/commands/export.d.ts +2 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +22 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/invites.d.ts +4 -0
- package/dist/commands/invites.d.ts.map +1 -0
- package/dist/commands/invites.js +45 -0
- package/dist/commands/invites.js.map +1 -0
- package/dist/commands/journals.d.ts +6 -0
- package/dist/commands/journals.d.ts.map +1 -0
- package/dist/commands/journals.js +70 -0
- package/dist/commands/journals.js.map +1 -0
- package/dist/commands/shares.d.ts +3 -0
- package/dist/commands/shares.d.ts.map +1 -0
- package/dist/commands/shares.js +34 -0
- package/dist/commands/shares.js.map +1 -0
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +22 -0
- package/dist/config.js.map +1 -0
- package/dist/credentials.d.ts +1 -28
- package/dist/credentials.d.ts.map +1 -1
- package/dist/credentials.js +1 -124
- package/dist/credentials.js.map +1 -1
- package/dist/formatting.d.ts +9 -0
- package/dist/formatting.d.ts.map +1 -0
- package/dist/formatting.js +37 -0
- package/dist/formatting.js.map +1 -0
- package/dist/index.js +395 -51
- package/dist/index.js.map +1 -1
- package/dist/project-config.d.ts +18 -0
- package/dist/project-config.d.ts.map +1 -0
- package/dist/project-config.js +55 -0
- package/dist/project-config.js.map +1 -0
- package/dist/wsl.d.ts +5 -0
- package/dist/wsl.d.ts.map +1 -0
- package/dist/wsl.js +33 -0
- package/dist/wsl.js.map +1 -0
- package/package.json +4 -2
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export declare const API_PATHS: {
|
|
2
|
+
readonly journals: "/v1/journals";
|
|
3
|
+
readonly journal: (id: string) => string;
|
|
4
|
+
readonly entries: (journalId: string) => string;
|
|
5
|
+
readonly entry: (journalId: string, index: number | string) => string;
|
|
6
|
+
readonly searchEntries: (journalId: string) => string;
|
|
7
|
+
readonly exportJournal: (journalId: string) => string;
|
|
8
|
+
readonly members: (journalId: string) => string;
|
|
9
|
+
readonly member: (journalId: string, userId: string) => string;
|
|
10
|
+
readonly invitations: (journalId: string) => string;
|
|
11
|
+
readonly invitation: (journalId: string, invitationId: string) => string;
|
|
12
|
+
};
|
|
13
|
+
export interface ApiError {
|
|
14
|
+
error: {
|
|
15
|
+
code: string;
|
|
16
|
+
message: string;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Ensure the user is authenticated. Exits with code 1 if not.
|
|
21
|
+
*/
|
|
22
|
+
export declare function requireAuth(): Promise<string>;
|
|
23
|
+
export declare function apiGet<T>(path: string, token: string): Promise<T>;
|
|
24
|
+
export declare function apiGetRaw(path: string, token: string): Promise<string>;
|
|
25
|
+
export declare function apiPost<T>(path: string, token: string, body: unknown): Promise<T>;
|
|
26
|
+
export declare function apiPatch<T>(path: string, token: string, body: unknown): Promise<T>;
|
|
27
|
+
export declare function apiDelete(path: string, token: string): Promise<void>;
|
|
28
|
+
//# sourceMappingURL=api-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,SAAS;;2BAEP,MAAM;kCACC,MAAM;gCACR,MAAM,SAAS,MAAM,GAAG,MAAM;wCAEtB,MAAM;wCACN,MAAM;kCACZ,MAAM;iCACP,MAAM,UAAU,MAAM;sCAEjB,MAAM;qCACP,MAAM,gBAAgB,MAAM;CAE3C,CAAC;AAEX,MAAM,WAAW,QAAQ;IACxB,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CACzC;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAOnD;AA8CD,wBAAsB,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAMvE;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO5E;AAED,wBAAsB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAUvF;AAED,wBAAsB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAUxF;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM1E"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { getAccessToken } from './credentials.js';
|
|
2
|
+
const API_BASE_URL = process.env['WORKJOURNAL_API_URL'] ?? 'https://api.workjournal.pro';
|
|
3
|
+
const API_VERSION = 'v1';
|
|
4
|
+
const API_TIMEOUT_MS = 10_000;
|
|
5
|
+
export const API_PATHS = {
|
|
6
|
+
journals: `/${API_VERSION}/journals`,
|
|
7
|
+
journal: (id) => `/${API_VERSION}/journals/${id}`,
|
|
8
|
+
entries: (journalId) => `/${API_VERSION}/journals/${journalId}/entries`,
|
|
9
|
+
entry: (journalId, index) => `/${API_VERSION}/journals/${encodeURIComponent(journalId)}/entries/${encodeURIComponent(String(index))}`,
|
|
10
|
+
searchEntries: (journalId) => `/${API_VERSION}/journals/${journalId}/entries/search`,
|
|
11
|
+
exportJournal: (journalId) => `/${API_VERSION}/journals/${journalId}/export`,
|
|
12
|
+
members: (journalId) => `/${API_VERSION}/journals/${journalId}/members`,
|
|
13
|
+
member: (journalId, userId) => `/${API_VERSION}/journals/${journalId}/members/${userId}`,
|
|
14
|
+
invitations: (journalId) => `/${API_VERSION}/journals/${journalId}/invitations`,
|
|
15
|
+
invitation: (journalId, invitationId) => `/${API_VERSION}/journals/${journalId}/invitations/${invitationId}`,
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Ensure the user is authenticated. Exits with code 1 if not.
|
|
19
|
+
*/
|
|
20
|
+
export async function requireAuth() {
|
|
21
|
+
const token = await getAccessToken();
|
|
22
|
+
if (!token) {
|
|
23
|
+
process.stderr.write('Not logged in. Run `workjournal auth login` to authenticate.\n');
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
return token;
|
|
27
|
+
}
|
|
28
|
+
async function ensureOk(res) {
|
|
29
|
+
if (!res.ok) {
|
|
30
|
+
if (res.status === 401) {
|
|
31
|
+
process.stderr.write('Authentication expired. Run `workjournal auth login` to re-authenticate.\n');
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
let message = `${res.status} ${res.statusText}`;
|
|
35
|
+
try {
|
|
36
|
+
const body = (await res.json());
|
|
37
|
+
if (body?.error?.message) {
|
|
38
|
+
message = body.error.message;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// use default message
|
|
43
|
+
}
|
|
44
|
+
throw new Error(message);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async function handleResponse(res) {
|
|
48
|
+
await ensureOk(res);
|
|
49
|
+
return res.json();
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Shared fetch wrapper with AbortController timeout.
|
|
53
|
+
*/
|
|
54
|
+
async function apiRequest(url, init) {
|
|
55
|
+
const controller = new AbortController();
|
|
56
|
+
const timeout = setTimeout(() => controller.abort(), API_TIMEOUT_MS);
|
|
57
|
+
try {
|
|
58
|
+
return await fetch(url, { ...init, signal: controller.signal });
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
62
|
+
throw new Error(`Request timed out after ${API_TIMEOUT_MS / 1000}s`);
|
|
63
|
+
}
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
clearTimeout(timeout);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export async function apiGet(path, token) {
|
|
71
|
+
const res = await apiRequest(`${API_BASE_URL}${path}`, {
|
|
72
|
+
method: 'GET',
|
|
73
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
74
|
+
});
|
|
75
|
+
return handleResponse(res);
|
|
76
|
+
}
|
|
77
|
+
export async function apiGetRaw(path, token) {
|
|
78
|
+
const res = await apiRequest(`${API_BASE_URL}${path}`, {
|
|
79
|
+
method: 'GET',
|
|
80
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
81
|
+
});
|
|
82
|
+
await ensureOk(res);
|
|
83
|
+
return res.text();
|
|
84
|
+
}
|
|
85
|
+
export async function apiPost(path, token, body) {
|
|
86
|
+
const res = await apiRequest(`${API_BASE_URL}${path}`, {
|
|
87
|
+
method: 'POST',
|
|
88
|
+
headers: {
|
|
89
|
+
Authorization: `Bearer ${token}`,
|
|
90
|
+
'Content-Type': 'application/json',
|
|
91
|
+
},
|
|
92
|
+
body: JSON.stringify(body),
|
|
93
|
+
});
|
|
94
|
+
return handleResponse(res);
|
|
95
|
+
}
|
|
96
|
+
export async function apiPatch(path, token, body) {
|
|
97
|
+
const res = await apiRequest(`${API_BASE_URL}${path}`, {
|
|
98
|
+
method: 'PATCH',
|
|
99
|
+
headers: {
|
|
100
|
+
Authorization: `Bearer ${token}`,
|
|
101
|
+
'Content-Type': 'application/json',
|
|
102
|
+
},
|
|
103
|
+
body: JSON.stringify(body),
|
|
104
|
+
});
|
|
105
|
+
return handleResponse(res);
|
|
106
|
+
}
|
|
107
|
+
export async function apiDelete(path, token) {
|
|
108
|
+
const res = await apiRequest(`${API_BASE_URL}${path}`, {
|
|
109
|
+
method: 'DELETE',
|
|
110
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
111
|
+
});
|
|
112
|
+
await ensureOk(res);
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
|
package/dist/auth.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* assistant (or the user) is expected to open the URL, approve the request, and
|
|
6
6
|
* paste the displayed code back into a `workjournal login finish <CODE>` call.
|
|
7
7
|
*/
|
|
8
|
-
export declare function loginStart(): void
|
|
8
|
+
export declare function loginStart(): Promise<void>;
|
|
9
9
|
/**
|
|
10
10
|
* Phase 2: read the verifier from the state file, exchange the pasted code for
|
|
11
11
|
* Supabase session tokens, persist them.
|
package/dist/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAkDA;;;;;;GAMG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAgBhD;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBhE;AAED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CA2CtD"}
|
package/dist/auth.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createHash, randomBytes } from 'node:crypto';
|
|
2
2
|
import { createInterface } from 'node:readline/promises';
|
|
3
|
-
import { clearLoginState, isLoginStateExpired, readLoginState, writeCredentials, writeLoginState, } from './credentials.js';
|
|
3
|
+
import { CONFIG_DIR, clearLoginState, isLoginStateExpired, readLoginState, writeCredentials, writeLoginState, } from './credentials.js';
|
|
4
|
+
import { warnIfWsl } from './wsl.js';
|
|
4
5
|
const APP_URL = process.env['WORKJOURNAL_APP_URL'] ?? 'https://app.workjournal.pro';
|
|
5
6
|
const API_URL = process.env['WORKJOURNAL_API_URL'] ?? 'https://api.workjournal.pro';
|
|
6
7
|
const OOB_REDIRECT_URI = 'urn:ietf:wg:oauth:2.0:oob';
|
|
@@ -27,7 +28,8 @@ function buildAuthorizeUrl(challenge) {
|
|
|
27
28
|
* assistant (or the user) is expected to open the URL, approve the request, and
|
|
28
29
|
* paste the displayed code back into a `workjournal login finish <CODE>` call.
|
|
29
30
|
*/
|
|
30
|
-
export function loginStart() {
|
|
31
|
+
export async function loginStart() {
|
|
32
|
+
await warnIfWsl({ interactive: false });
|
|
31
33
|
const { verifier, challenge } = generatePkce();
|
|
32
34
|
const state = {
|
|
33
35
|
verifier,
|
|
@@ -85,6 +87,7 @@ export async function loginInteractive() {
|
|
|
85
87
|
' workjournal login finish <CODE>\n');
|
|
86
88
|
process.exit(1);
|
|
87
89
|
}
|
|
90
|
+
await warnIfWsl({ interactive: true });
|
|
88
91
|
const { verifier, challenge } = generatePkce();
|
|
89
92
|
const state = {
|
|
90
93
|
verifier,
|
|
@@ -159,6 +162,6 @@ async function exchangeAndPersist(code, verifier) {
|
|
|
159
162
|
};
|
|
160
163
|
writeCredentials(creds);
|
|
161
164
|
process.stdout.write('\nAuthenticated successfully!\n');
|
|
162
|
-
process.stdout.write(
|
|
165
|
+
process.stdout.write(`Credentials saved to ${CONFIG_DIR}/credentials.json\n`);
|
|
163
166
|
}
|
|
164
167
|
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EACN,eAAe,EACf,mBAAmB,EAEnB,cAAc,EAEd,gBAAgB,EAChB,eAAe,GACf,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function listEntries(journalId: string, jsonOutput: boolean): Promise<void>;
|
|
2
|
+
export declare function createEntry(journalId: string, summary: string, body: string, jsonOutput: boolean): Promise<void>;
|
|
3
|
+
export declare function searchEntries(journalId: string, query: string, jsonOutput: boolean): Promise<void>;
|
|
4
|
+
export declare function lastEntries(journalId: string, count: number, jsonOutput: boolean): Promise<void>;
|
|
5
|
+
export declare function getEntry(journalId: string, indexRaw: string, jsonOutput: boolean): Promise<void>;
|
|
6
|
+
export declare function deleteEntry(journalId: string, indexRaw: string, jsonOutput: boolean): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=entries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entries.d.ts","sourceRoot":"","sources":["../../src/commands/entries.ts"],"names":[],"mappings":"AAoCA,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBvF;AAED,wBAAsB,WAAW,CAChC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,OAAO,GACjB,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,wBAAsB,aAAa,CAClC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,OAAO,GACjB,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED,wBAAsB,WAAW,CAChC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,OAAO,GACjB,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED,wBAAsB,QAAQ,CAC7B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,OAAO,GACjB,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,wBAAsB,WAAW,CAChC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,OAAO,GACjB,OAAO,CAAC,IAAI,CAAC,CAgBf"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { API_PATHS, apiDelete, apiGet, apiPost, requireAuth } from '../api-client.js';
|
|
2
|
+
import { formatTable, truncate } from '../formatting.js';
|
|
3
|
+
function parseIndex(raw) {
|
|
4
|
+
if (!/^\d+$/.test(raw))
|
|
5
|
+
return null;
|
|
6
|
+
const n = Number(raw);
|
|
7
|
+
if (!Number.isInteger(n) || n < 1)
|
|
8
|
+
return null;
|
|
9
|
+
return n;
|
|
10
|
+
}
|
|
11
|
+
export async function listEntries(journalId, jsonOutput) {
|
|
12
|
+
const token = await requireAuth();
|
|
13
|
+
const result = await apiGet(API_PATHS.entries(journalId), token);
|
|
14
|
+
if (jsonOutput) {
|
|
15
|
+
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (result.data.length === 0) {
|
|
19
|
+
process.stdout.write('No entries found.\n');
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const headers = ['#', 'Summary', 'Created'];
|
|
23
|
+
const rows = result.data.map((e) => [String(e.index), truncate(e.summary, 70), e.created_at]);
|
|
24
|
+
process.stdout.write(formatTable(headers, rows));
|
|
25
|
+
}
|
|
26
|
+
export async function createEntry(journalId, summary, body, jsonOutput) {
|
|
27
|
+
const token = await requireAuth();
|
|
28
|
+
const entry = await apiPost(API_PATHS.entries(journalId), token, {
|
|
29
|
+
summary,
|
|
30
|
+
what_changed: body,
|
|
31
|
+
});
|
|
32
|
+
if (jsonOutput) {
|
|
33
|
+
process.stdout.write(`${JSON.stringify(entry, null, 2)}\n`);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
process.stdout.write(`Entry created:\n #${entry.index}: ${entry.summary}\n`);
|
|
37
|
+
}
|
|
38
|
+
export async function searchEntries(journalId, query, jsonOutput) {
|
|
39
|
+
const token = await requireAuth();
|
|
40
|
+
const params = new URLSearchParams({ q: query });
|
|
41
|
+
const result = await apiGet(`${API_PATHS.searchEntries(journalId)}?${params.toString()}`, token);
|
|
42
|
+
if (jsonOutput) {
|
|
43
|
+
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (result.data.length === 0) {
|
|
47
|
+
process.stdout.write('No entries matched your search.\n');
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const headers = ['#', 'Summary', 'Created'];
|
|
51
|
+
const rows = result.data.map((e) => [String(e.index), truncate(e.summary, 70), e.created_at]);
|
|
52
|
+
process.stdout.write(formatTable(headers, rows));
|
|
53
|
+
}
|
|
54
|
+
export async function lastEntries(journalId, count, jsonOutput) {
|
|
55
|
+
const token = await requireAuth();
|
|
56
|
+
const result = await apiGet(`${API_PATHS.entries(journalId)}?limit=${count}&include=body`, token);
|
|
57
|
+
if (jsonOutput) {
|
|
58
|
+
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (result.data.length === 0) {
|
|
62
|
+
process.stdout.write('No entries found.\n');
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
for (const entry of result.data) {
|
|
66
|
+
process.stdout.write(`\n#${entry.index} — ${entry.summary}\n`);
|
|
67
|
+
process.stdout.write(`${entry.created_at}\n\n`);
|
|
68
|
+
process.stdout.write(`${entry.what_changed}\n`);
|
|
69
|
+
process.stdout.write('\n---\n');
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export async function getEntry(journalId, indexRaw, jsonOutput) {
|
|
73
|
+
const index = parseIndex(indexRaw);
|
|
74
|
+
if (index === null) {
|
|
75
|
+
process.stderr.write('Entry index must be a positive integer.\n');
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
const token = await requireAuth();
|
|
79
|
+
const entry = await apiGet(API_PATHS.entry(journalId, index), token);
|
|
80
|
+
if (jsonOutput) {
|
|
81
|
+
process.stdout.write(`${JSON.stringify(entry, null, 2)}\n`);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
process.stdout.write(`#${entry.index} — ${entry.summary}\n`);
|
|
85
|
+
process.stdout.write(`${entry.created_at}\n\n`);
|
|
86
|
+
process.stdout.write(`${entry.what_changed}\n`);
|
|
87
|
+
}
|
|
88
|
+
export async function deleteEntry(journalId, indexRaw, jsonOutput) {
|
|
89
|
+
const index = parseIndex(indexRaw);
|
|
90
|
+
if (index === null) {
|
|
91
|
+
process.stderr.write('Entry index must be a positive integer.\n');
|
|
92
|
+
process.exit(1);
|
|
93
|
+
}
|
|
94
|
+
const token = await requireAuth();
|
|
95
|
+
await apiDelete(API_PATHS.entry(journalId, index), token);
|
|
96
|
+
if (jsonOutput) {
|
|
97
|
+
process.stdout.write(`${JSON.stringify({ deleted: index }, null, 2)}\n`);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
process.stdout.write(`Entry #${index} deleted.\n`);
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=entries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entries.js","sourceRoot":"","sources":["../../src/commands/entries.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,CAClC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAiBf"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { writeFileSync } from 'node:fs';
|
|
2
|
+
import { API_PATHS, apiGetRaw, requireAuth } from '../api-client.js';
|
|
3
|
+
export async function exportJournal(journalId, format, outputPath) {
|
|
4
|
+
const token = await requireAuth();
|
|
5
|
+
const path = `${API_PATHS.exportJournal(journalId)}?format=${format}`;
|
|
6
|
+
const text = await apiGetRaw(path, token);
|
|
7
|
+
if (outputPath) {
|
|
8
|
+
try {
|
|
9
|
+
writeFileSync(outputPath, text, 'utf-8');
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
13
|
+
process.stderr.write(`Failed to write to "${outputPath}": ${message}\n`);
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
process.stdout.write(`Exported to ${outputPath}\n`);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
process.stdout.write(text);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAErE,MAAM,CAAC,KAAK,UAAU,aAAa,CAClC,SAAiB,EACjB,MAAc,EACd,UAAmB;IAEnB,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,GAAG,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC,WAAW,MAAM,EAAE,CAAC;IACtE,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAE1C,IAAI,UAAU,EAAE,CAAC;QAChB,IAAI,CAAC;YACJ,aAAa,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,UAAU,MAAM,OAAO,IAAI,CAAC,CAAC;YACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,UAAU,IAAI,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function listInvites(journalId: string, jsonOutput: boolean): Promise<void>;
|
|
2
|
+
export declare function newInvite(journalId: string, email: string, jsonOutput: boolean): Promise<void>;
|
|
3
|
+
export declare function deleteInvite(journalId: string, invitationId: string, jsonOutput: boolean): Promise<void>;
|
|
4
|
+
//# sourceMappingURL=invites.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invites.d.ts","sourceRoot":"","sources":["../../src/commands/invites.ts"],"names":[],"mappings":"AAmBA,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBvF;AAED,wBAAsB,SAAS,CAC9B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,OAAO,GACjB,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,YAAY,CACjC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,OAAO,GACjB,OAAO,CAAC,IAAI,CAAC,CAUf"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { API_PATHS, apiDelete, apiGet, apiPost, requireAuth } from '../api-client.js';
|
|
2
|
+
import { formatTable } from '../formatting.js';
|
|
3
|
+
function invitationStatus(inv) {
|
|
4
|
+
if (inv.accepted_at)
|
|
5
|
+
return 'accepted';
|
|
6
|
+
if (inv.revoked_at)
|
|
7
|
+
return 'revoked';
|
|
8
|
+
return 'pending';
|
|
9
|
+
}
|
|
10
|
+
export async function listInvites(journalId, jsonOutput) {
|
|
11
|
+
const token = await requireAuth();
|
|
12
|
+
const invitations = await apiGet(API_PATHS.invitations(journalId), token);
|
|
13
|
+
if (jsonOutput) {
|
|
14
|
+
process.stdout.write(`${JSON.stringify(invitations, null, 2)}\n`);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (invitations.length === 0) {
|
|
18
|
+
process.stdout.write('No invitations found.\n');
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const headers = ['ID', 'Email', 'Status', 'Created'];
|
|
22
|
+
const rows = invitations.map((inv) => [inv.id, inv.email, invitationStatus(inv), inv.created_at]);
|
|
23
|
+
process.stdout.write(formatTable(headers, rows));
|
|
24
|
+
}
|
|
25
|
+
export async function newInvite(journalId, email, jsonOutput) {
|
|
26
|
+
const token = await requireAuth();
|
|
27
|
+
const invitation = await apiPost(API_PATHS.invitations(journalId), token, {
|
|
28
|
+
email,
|
|
29
|
+
});
|
|
30
|
+
if (jsonOutput) {
|
|
31
|
+
process.stdout.write(`${JSON.stringify(invitation, null, 2)}\n`);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
process.stdout.write(`Invitation sent to ${email}.\n`);
|
|
35
|
+
}
|
|
36
|
+
export async function deleteInvite(journalId, invitationId, jsonOutput) {
|
|
37
|
+
const token = await requireAuth();
|
|
38
|
+
await apiDelete(API_PATHS.invitation(journalId, invitationId), token);
|
|
39
|
+
if (jsonOutput) {
|
|
40
|
+
process.stdout.write(`${JSON.stringify({ deleted: invitationId }, null, 2)}\n`);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
process.stdout.write(`Invitation ${invitationId} revoked.\n`);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=invites.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invites.js","sourceRoot":"","sources":["../../src/commands/invites.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAY/C,SAAS,gBAAgB,CAAC,GAAe;IACxC,IAAI,GAAG,CAAC,WAAW;QAAE,OAAO,UAAU,CAAC;IACvC,IAAI,GAAG,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IACrC,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAiB,EAAE,UAAmB;IACvE,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;IAClC,MAAM,WAAW,GAAG,MAAM,MAAM,CAAe,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;IAExF,IAAI,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAClE,OAAO;IACR,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAChD,OAAO;IACR,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;IAClG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC9B,SAAiB,EACjB,KAAa,EACb,UAAmB;IAEnB,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;IAClC,MAAM,UAAU,GAAG,MAAM,OAAO,CAAa,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE;QACrF,KAAK;KACL,CAAC,CAAC;IAEH,IAAI,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACjE,OAAO;IACR,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,KAAK,KAAK,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CACjC,SAAiB,EACjB,YAAoB,EACpB,UAAmB;IAEnB,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;IAClC,MAAM,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,KAAK,CAAC,CAAC;IAEtE,IAAI,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAChF,OAAO;IACR,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,YAAY,aAAa,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function listJournals(jsonOutput: boolean): Promise<void>;
|
|
2
|
+
export declare function createJournal(name: string, jsonOutput: boolean): Promise<void>;
|
|
3
|
+
export declare function getJournal(journalId: string, jsonOutput: boolean): Promise<void>;
|
|
4
|
+
export declare function deleteJournal(journalId: string, jsonOutput: boolean): Promise<void>;
|
|
5
|
+
export declare function selectJournal(journalId: string): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=journals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journals.d.ts","sourceRoot":"","sources":["../../src/commands/journals.ts"],"names":[],"mappings":"AAuBA,wBAAsB,YAAY,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBrE;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAUpF;AAED,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBtF;AAED,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAUzF;AAED,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAcpE"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { API_PATHS, apiDelete, apiGet, apiPost, requireAuth } from '../api-client.js';
|
|
4
|
+
import { readConfig, writeConfig } from '../config.js';
|
|
5
|
+
import { formatTable } from '../formatting.js';
|
|
6
|
+
import { writeProjectConfig } from '../project-config.js';
|
|
7
|
+
export async function listJournals(jsonOutput) {
|
|
8
|
+
const token = await requireAuth();
|
|
9
|
+
const result = await apiGet(API_PATHS.journals, token);
|
|
10
|
+
if (jsonOutput) {
|
|
11
|
+
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
if (result.data.length === 0) {
|
|
15
|
+
process.stdout.write('No journals found.\n');
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const headers = ['ID', 'Name', 'Created'];
|
|
19
|
+
const rows = result.data.map((j) => [j.id, j.name, j.created_at]);
|
|
20
|
+
process.stdout.write(formatTable(headers, rows));
|
|
21
|
+
}
|
|
22
|
+
export async function createJournal(name, jsonOutput) {
|
|
23
|
+
const token = await requireAuth();
|
|
24
|
+
const journal = await apiPost(API_PATHS.journals, token, { name });
|
|
25
|
+
if (jsonOutput) {
|
|
26
|
+
process.stdout.write(`${JSON.stringify(journal, null, 2)}\n`);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
process.stdout.write(`Journal created:\n ID: ${journal.id}\n Name: ${journal.name}\n`);
|
|
30
|
+
}
|
|
31
|
+
export async function getJournal(journalId, jsonOutput) {
|
|
32
|
+
const token = await requireAuth();
|
|
33
|
+
const journal = await apiGet(API_PATHS.journal(journalId), token);
|
|
34
|
+
if (jsonOutput) {
|
|
35
|
+
process.stdout.write(`${JSON.stringify(journal, null, 2)}\n`);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
process.stdout.write(`ID: ${journal.id}\n`);
|
|
39
|
+
process.stdout.write(`Name: ${journal.name}\n`);
|
|
40
|
+
if (journal.description) {
|
|
41
|
+
process.stdout.write(`Description: ${journal.description}\n`);
|
|
42
|
+
}
|
|
43
|
+
process.stdout.write(`Created: ${journal.created_at}\n`);
|
|
44
|
+
if (journal.membership) {
|
|
45
|
+
process.stdout.write(`Role: ${journal.membership.role}\n`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export async function deleteJournal(journalId, jsonOutput) {
|
|
49
|
+
const token = await requireAuth();
|
|
50
|
+
await apiDelete(API_PATHS.journal(journalId), token);
|
|
51
|
+
if (jsonOutput) {
|
|
52
|
+
process.stdout.write(`${JSON.stringify({ deleted: journalId }, null, 2)}\n`);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
process.stdout.write(`Journal ${journalId} deleted.\n`);
|
|
56
|
+
}
|
|
57
|
+
export async function selectJournal(journalId) {
|
|
58
|
+
const token = await requireAuth();
|
|
59
|
+
await apiGet(API_PATHS.journal(journalId), token);
|
|
60
|
+
const config = readConfig();
|
|
61
|
+
config.journal = journalId;
|
|
62
|
+
writeConfig(config);
|
|
63
|
+
process.stdout.write(`Global config: default journal set to ${journalId}\n`);
|
|
64
|
+
const cwd = process.cwd();
|
|
65
|
+
if (existsSync(join(cwd, '.git'))) {
|
|
66
|
+
writeProjectConfig(cwd, journalId);
|
|
67
|
+
process.stdout.write(`Project config: wrote .workjournal in ${cwd}\n`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=journals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journals.js","sourceRoot":"","sources":["../../src/commands/journals.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shares.d.ts","sourceRoot":"","sources":["../../src/commands/shares.ts"],"names":[],"mappings":"AAUA,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBtF;AAED,wBAAsB,WAAW,CAChC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,OAAO,GACjB,OAAO,CAAC,IAAI,CAAC,CAmBf"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { API_PATHS, apiDelete, apiGet, requireAuth } from '../api-client.js';
|
|
2
|
+
import { formatTable } from '../formatting.js';
|
|
3
|
+
export async function listShares(journalId, jsonOutput) {
|
|
4
|
+
const token = await requireAuth();
|
|
5
|
+
const members = await apiGet(API_PATHS.members(journalId), token);
|
|
6
|
+
if (jsonOutput) {
|
|
7
|
+
process.stdout.write(`${JSON.stringify(members, null, 2)}\n`);
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
if (members.length === 0) {
|
|
11
|
+
process.stdout.write('No members found.\n');
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const headers = ['Email', 'Role', 'Joined'];
|
|
15
|
+
const rows = members.map((m) => [m.email, m.role, m.created_at]);
|
|
16
|
+
process.stdout.write(formatTable(headers, rows));
|
|
17
|
+
}
|
|
18
|
+
export async function deleteShare(journalId, email, jsonOutput) {
|
|
19
|
+
const token = await requireAuth();
|
|
20
|
+
const members = await apiGet(API_PATHS.members(journalId), token);
|
|
21
|
+
const normalizedEmail = email.trim().toLowerCase();
|
|
22
|
+
const member = members.find((m) => m.email.trim().toLowerCase() === normalizedEmail);
|
|
23
|
+
if (!member) {
|
|
24
|
+
process.stderr.write(`No member found with email: ${email}\n`);
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
await apiDelete(API_PATHS.member(journalId, member.user_id), token);
|
|
28
|
+
if (jsonOutput) {
|
|
29
|
+
process.stdout.write(`${JSON.stringify({ deleted: email }, null, 2)}\n`);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
process.stdout.write(`Removed ${email} from journal.\n`);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=shares.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shares.js","sourceRoot":"","sources":["../../src/commands/shares.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAS/C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,SAAiB,EAAE,UAAmB;IACtE,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAW,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;IAE5E,IAAI,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9D,OAAO;IACR,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAC5C,OAAO;IACR,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,SAAiB,EACjB,KAAa,EACb,UAAmB;IAEnB,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAW,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;IAC5E,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACnD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,eAAe,CAAC,CAAC;IAErF,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,KAAK,IAAI,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;IAEpE,IAAI,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACzE,OAAO;IACR,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,KAAK,kBAAkB,CAAC,CAAC;AAC1D,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,SAAS;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,UAAU,IAAI,SAAS,CAUtC;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAGnD"}
|