@whatcha/cli 0.3.0 → 0.6.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.
@@ -1,14 +1,23 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MAX_TAGS = exports.MAX_TAG_LENGTH = exports.MAX_TITLE_LENGTH = void 0;
3
+ exports.MAX_LOCATION_LENGTH = exports.MAX_MOOD_LENGTH = exports.MAX_TAGS = exports.MAX_TAG_LENGTH = exports.MAX_TITLE_LENGTH = void 0;
4
+ exports.headerOf = headerOf;
4
5
  exports.normalizeTags = normalizeTags;
5
6
  exports.mergeHeader = mergeHeader;
6
7
  exports.writeEntry = writeEntry;
8
+ exports.readRange = readRange;
9
+ exports.saveRange = saveRange;
7
10
  const errors_1 = require("../errors");
11
+ const entry_get_1 = require("./entry-get");
8
12
  /** The API's own limits (entries-content.ts `contentSchema`). */
9
13
  exports.MAX_TITLE_LENGTH = 200;
10
14
  exports.MAX_TAG_LENGTH = 64;
11
15
  exports.MAX_TAGS = 32;
16
+ exports.MAX_MOOD_LENGTH = 64;
17
+ exports.MAX_LOCATION_LENGTH = 200;
18
+ /** What the v1 entry surface answers for a range never set (diary-entries-service.ts `toEntries`). */
19
+ const UNSET_START = "00:00";
20
+ const UNSET_END = "23:59";
12
21
  function existingEntryIdFrom(err) {
13
22
  if (err.status !== 409 || err.code !== "VERSION_CONFLICT")
14
23
  return null;
@@ -43,6 +52,36 @@ function normalizeTags(tags) {
43
52
  * the append rule. Exported for the tests.
44
53
  */
45
54
  function mergeHeader(header, meta) {
55
+ const base = mergeTitleAndTags(header, meta);
56
+ let merged = base.header;
57
+ const kept = {};
58
+ // #57: mood, place and coordinates follow the title's rule -- they fill
59
+ // an entry that has none and never replace what somebody else set.
60
+ // "Kept" means a different value was already there, as for the title.
61
+ const mood = meta.mood?.trim();
62
+ if (mood) {
63
+ const had = header.mood?.trim();
64
+ kept.moodKept = Boolean(had) && had !== mood;
65
+ if (!had)
66
+ merged = { ...merged, mood };
67
+ }
68
+ const location = meta.location?.trim();
69
+ if (location) {
70
+ const had = header.location?.trim();
71
+ kept.locationKept = Boolean(had) && had !== location;
72
+ if (!had)
73
+ merged = { ...merged, location };
74
+ }
75
+ if (meta.coordinates) {
76
+ const { lat, lng } = meta.coordinates;
77
+ const had = typeof header.locationLat === "number" && typeof header.locationLng === "number";
78
+ kept.coordinatesKept = had && (header.locationLat !== lat || header.locationLng !== lng);
79
+ if (!had)
80
+ merged = { ...merged, locationLat: lat, locationLng: lng };
81
+ }
82
+ return { header: merged, titleKept: base.titleKept, ...kept };
83
+ }
84
+ function mergeTitleAndTags(header, meta) {
46
85
  const wanted = meta.title?.trim();
47
86
  const hasTitle = Boolean(header.title && header.title.trim());
48
87
  const title = hasTitle ? header.title : wanted ? wanted : header.title;
@@ -63,12 +102,17 @@ function mergeHeader(header, meta) {
63
102
  * API's own `appendedBody` (apps/api/src/modules/diaries/entries/
64
103
  * entries-content.ts, merged to master in #1424): existing text, trimmed,
65
104
  * then a blank line, then the new text -- or just the new text if there was
66
- * none yet.
105
+ * none yet. No text (only images or a cover, #51) leaves it as it was.
67
106
  */
68
107
  function expectedAppendedBody(existingBody, text) {
69
108
  const trimmed = existingBody.trimEnd();
109
+ if (!text.trim())
110
+ return trimmed;
70
111
  return trimmed ? `${trimmed}\n\n${text}` : text;
71
112
  }
113
+ function mediaOf(ids) {
114
+ return (ids ?? []).map((mediaAssetId) => ({ mediaAssetId }));
115
+ }
72
116
  /**
73
117
  * The one thing this whole command exists to get right: add `text` to
74
118
  * `diaryId`'s entry for `occurredAt`'s day without ever touching what
@@ -104,21 +148,27 @@ function expectedAppendedBody(existingBody, text) {
104
148
  async function writeEntry(client, diaryId, occurredAt, text, meta = {}) {
105
149
  const title = meta.title?.trim() || undefined;
106
150
  const tags = normalizeTags(meta.tags ?? []);
151
+ const cover = meta.coverMediaAssetId;
152
+ const images = meta.images ?? [];
153
+ const mood = meta.mood?.trim() || undefined;
154
+ const location = meta.location?.trim() || undefined;
155
+ const { coordinates, range } = meta;
156
+ let created;
107
157
  try {
108
- const created = await client.post("/entries", {
158
+ created = await client.post("/entries", {
109
159
  diaryId,
110
160
  occurredAt: occurredAt.toISOString(),
111
- content: { body: text, ...(title ? { title } : {}), ...(tags.length > 0 ? { tags } : {}) },
161
+ content: {
162
+ body: text,
163
+ ...(title ? { title } : {}),
164
+ ...(mood ? { mood } : {}),
165
+ ...(location ? { location } : {}),
166
+ ...(coordinates ? { locationLat: coordinates.lat, locationLng: coordinates.lng } : {}),
167
+ ...(tags.length > 0 ? { tags } : {}),
168
+ ...(cover ? { coverMediaAssetId: cover } : {}),
169
+ },
170
+ ...(images.length > 0 ? { media: mediaOf(images) } : {}),
112
171
  });
113
- return {
114
- entryId: created.id,
115
- headCommitId: created.headCommitId,
116
- mode: "created",
117
- verified: null,
118
- title: title ?? null,
119
- tags,
120
- titleKept: false,
121
- };
122
172
  }
123
173
  catch (err) {
124
174
  if (!(err instanceof errors_1.ApiError))
@@ -126,47 +176,133 @@ async function writeEntry(client, diaryId, occurredAt, text, meta = {}) {
126
176
  const existingEntryId = existingEntryIdFrom(err);
127
177
  if (!existingEntryId)
128
178
  throw err;
129
- return appendToExisting(client, existingEntryId, text, { title, tags });
130
- }
131
- }
132
- async function appendToExisting(client, entryId, text, meta) {
133
- const existing = await client.get(`/entries/${entryId}`);
134
- const { header, titleKept } = mergeHeader(headerOf(existing), meta);
135
- const after = { title: header.title, tags: header.tags, titleKept };
136
- try {
137
- const saved = await client.patch(`/entries/${entryId}`, {
138
- content: { body: text, ...header },
139
- appendBody: true,
140
- expectedHeadCommitId: existing.headCommitId,
179
+ return appendToExisting(client, diaryId, existingEntryId, text, {
180
+ title,
181
+ tags,
182
+ images,
183
+ coverMediaAssetId: cover,
184
+ mood,
185
+ location,
186
+ coordinates,
187
+ range,
141
188
  });
142
- const verified = await verifyAppend(client, entryId, existing.body, text);
143
- return { entryId, headCommitId: saved.headCommitId, mode: "appended", verified, ...after };
144
189
  }
145
- catch (err) {
146
- if (!(err instanceof errors_1.ApiError))
147
- throw err;
148
- if (err.status === 409)
149
- throw concurrentWriteError(err);
150
- if (!err.isUnrecognizedAppendBodyFlag())
151
- throw err;
152
- // Fallback: this server does not know appendBody. Merge client-side
153
- // from the body we already read, and send the merged body as a plain
154
- // replacement -- which is safe precisely because we just read what it
155
- // is replacing.
156
- const mergedBody = expectedAppendedBody(existing.body, text);
157
- const saved = await client
158
- .patch(`/entries/${entryId}`, {
159
- content: { body: mergedBody, ...header },
160
- expectedHeadCommitId: existing.headCommitId,
161
- })
162
- .catch((fallbackErr) => {
163
- if (fallbackErr instanceof errors_1.ApiError && fallbackErr.status === 409)
164
- throw concurrentWriteError(fallbackErr);
165
- throw fallbackErr;
166
- });
167
- const verified = await verifyAppend(client, entryId, existing.body, text);
168
- return { entryId, headCommitId: saved.headCommitId, mode: "appended-fallback", verified, ...after };
190
+ const headCommitId = range ? await saveRange(client, diaryId, created.id, range, created.headCommitId) : created.headCommitId;
191
+ return {
192
+ entryId: created.id,
193
+ headCommitId,
194
+ mode: "created",
195
+ verified: null,
196
+ title: title ?? null,
197
+ tags,
198
+ titleKept: false,
199
+ ...(cover ? { coverKept: false } : {}),
200
+ ...(mood ? { moodKept: false } : {}),
201
+ ...(location ? { locationKept: false } : {}),
202
+ ...(coordinates ? { coordinatesKept: false } : {}),
203
+ ...(range ? { rangeKept: false, range } : {}),
204
+ };
205
+ }
206
+ /**
207
+ * The entry's time range (#57), as the v1 entry surface reports it -- the
208
+ * only one that does: `GET /entries/{id}` has no `start` / `end`. null
209
+ * when none was ever set (that surface answers 00:00-23:59 then).
210
+ */
211
+ async function readRange(client, diaryId, entryId) {
212
+ const e = await client.get(`/diaries/${diaryId}/entries/${entryId}`);
213
+ const start = e.start_time || UNSET_START;
214
+ const end = e.end_time || UNSET_END;
215
+ return start === UNSET_START && end === UNSET_END ? null : { start, end };
216
+ }
217
+ /**
218
+ * Saves `range` into the entry's header (#57). `content` on `POST` / `PATCH
219
+ * /entries` has no field for it, so this is the call the app's calendar
220
+ * makes: `PATCH /diaries/{diaryId}/entries/{entryId}`, a details-only
221
+ * commit that carries the text, the rest of the header and every image
222
+ * over untouched. The new head commit's id, when the answer has one.
223
+ */
224
+ async function saveRange(client, diaryId, entryId, range, headCommitId) {
225
+ const saved = await client.patch(`/diaries/${diaryId}/entries/${entryId}`, {
226
+ startTime: range.start,
227
+ endTime: range.end,
228
+ });
229
+ return saved?.head?.id ?? headCommitId;
230
+ }
231
+ async function appendToExisting(client, diaryId, entryId, text, meta) {
232
+ const existing = await (0, entry_get_1.getEntry)(client, entryId);
233
+ const merged = mergeHeader(headerOf(existing), meta);
234
+ const { titleKept, moodKept, locationKept, coordinatesKept } = merged;
235
+ let header = merged.header;
236
+ let coverKept;
237
+ if (meta.coverMediaAssetId) {
238
+ coverKept = Boolean(header.coverMediaAssetId);
239
+ if (!coverKept)
240
+ header = { ...header, coverMediaAssetId: meta.coverMediaAssetId };
169
241
  }
242
+ // #57: read before the append, because the append itself clears it --
243
+ // a `PATCH /entries` save writes the header from `content`, which cannot
244
+ // carry a range -- so an existing range is put back afterwards, and only
245
+ // an entry without one takes the new one.
246
+ const existingRange = meta.range ? await readRange(client, diaryId, entryId) : null;
247
+ const range = meta.range ? (existingRange ?? meta.range) : undefined;
248
+ const after = {
249
+ title: header.title,
250
+ tags: header.tags,
251
+ titleKept,
252
+ ...(coverKept !== undefined ? { coverKept } : {}),
253
+ ...(moodKept !== undefined ? { moodKept } : {}),
254
+ ...(locationKept !== undefined ? { locationKept } : {}),
255
+ ...(coordinatesKept !== undefined ? { coordinatesKept } : {}),
256
+ ...(range
257
+ ? {
258
+ rangeKept: existingRange !== null &&
259
+ (existingRange.start !== meta.range.start || existingRange.end !== meta.range.end),
260
+ range,
261
+ }
262
+ : {}),
263
+ };
264
+ const withRange = async (r) => range ? { ...r, headCommitId: await saveRange(client, diaryId, entryId, range, r.headCommitId) } : r;
265
+ // Sent only when there are images to add: leaving `media` out keeps the entry's own.
266
+ const media = meta.images && meta.images.length > 0 ? { media: [...(0, entry_get_1.entryMedia)(existing), ...mediaOf(meta.images)] } : {};
267
+ const saveText = async () => {
268
+ try {
269
+ const saved = await client.patch(`/entries/${entryId}`, {
270
+ content: { body: text, ...header },
271
+ ...media,
272
+ appendBody: true,
273
+ expectedHeadCommitId: existing.headCommitId,
274
+ });
275
+ const verified = await verifyAppend(client, entryId, existing.body, text);
276
+ return { entryId, headCommitId: saved.headCommitId, mode: "appended", verified, ...after };
277
+ }
278
+ catch (err) {
279
+ if (!(err instanceof errors_1.ApiError))
280
+ throw err;
281
+ if (err.status === 409)
282
+ throw concurrentWriteError(err);
283
+ if (!err.isUnrecognizedAppendBodyFlag())
284
+ throw err;
285
+ // Fallback: this server does not know appendBody. Merge client-side
286
+ // from the body we already read, and send the merged body as a plain
287
+ // replacement -- which is safe precisely because we just read what it
288
+ // is replacing.
289
+ const mergedBody = expectedAppendedBody(existing.body, text);
290
+ const saved = await client
291
+ .patch(`/entries/${entryId}`, {
292
+ content: { body: mergedBody, ...header },
293
+ ...media,
294
+ expectedHeadCommitId: existing.headCommitId,
295
+ })
296
+ .catch((fallbackErr) => {
297
+ if (fallbackErr instanceof errors_1.ApiError && fallbackErr.status === 409)
298
+ throw concurrentWriteError(fallbackErr);
299
+ throw fallbackErr;
300
+ });
301
+ const verified = await verifyAppend(client, entryId, existing.body, text);
302
+ return { entryId, headCommitId: saved.headCommitId, mode: "appended-fallback", verified, ...after };
303
+ }
304
+ };
305
+ return withRange(await saveText());
170
306
  }
171
307
  function concurrentWriteError(err) {
172
308
  return new errors_1.CliUsageError("Someone else saved to this entry while whatcha was writing to it. Nothing was overwritten -- " +
@@ -187,7 +323,7 @@ function concurrentWriteError(err) {
187
323
  * this does not mistake a corrupted write for a clean one.
188
324
  */
189
325
  async function verifyAppend(client, entryId, bodyBeforeWrite, text) {
190
- const after = await client.get(`/entries/${entryId}`);
326
+ const after = await (0, entry_get_1.getEntry)(client, entryId);
191
327
  return after.body === expectedAppendedBody(bodyBeforeWrite, text);
192
328
  }
193
329
  //# sourceMappingURL=append-entry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"append-entry.js","sourceRoot":"","sources":["../../src/lib/append-entry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"append-entry.js","sourceRoot":"","sources":["../../src/lib/append-entry.ts"],"names":[],"mappings":"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"}
@@ -20,9 +20,9 @@ function assertValidDate(date) {
20
20
  throw new errors_1.CliUsageError(`--date "${date}" is not a real calendar date.`);
21
21
  }
22
22
  }
23
- function assertValidTime(time) {
23
+ function assertValidTime(time, flag = "--time") {
24
24
  if (!TIME_RE.test(time))
25
- throw new errors_1.CliUsageError(`--time must be HH:MM (24h), got "${time}".`);
25
+ throw new errors_1.CliUsageError(`${flag} must be HH:MM (24h), got "${time}".`);
26
26
  }
27
27
  /** "YYYY-MM-DD" for `date`, as read in `timeZone` -- what day the diary's own §11.4 uniqueness check would see. */
28
28
  function dateKeyInTimeZone(date, timeZone) {
@@ -1 +1 @@
1
- {"version":3,"file":"entry-date.js","sourceRoot":"","sources":["../../src/lib/entry-date.ts"],"names":[],"mappings":";;AAKA,0CASC;AAED,0CAEC;AAGD,8CAMC;AAGD,8CAOC;AAcD,wCAIC;AA+BD,8CAUC;AAhGD,sCAA0C;AAE1C,MAAM,OAAO,GAAG,qBAAqB,CAAC;AACtC,MAAM,OAAO,GAAG,6BAA6B,CAAC;AAE9C,SAAgB,eAAe,CAAC,IAAY;IAC1C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,sBAAa,CAAC,mCAAmC,IAAI,IAAI,CAAC,CAAC;IAC9F,0EAA0E;IAC1E,2EAA2E;IAC3E,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClD,IAAI,SAAS,CAAC,cAAc,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC;QAC1G,MAAM,IAAI,sBAAa,CAAC,WAAW,IAAI,gCAAgC,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAAC,IAAY;IAC1C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,sBAAa,CAAC,oCAAoC,IAAI,IAAI,CAAC,CAAC;AACjG,CAAC;AAED,mHAAmH;AACnH,SAAgB,iBAAiB,CAAC,IAAU,EAAE,QAAgB;IAC5D,gEAAgE;IAChE,yEAAyE;IACzE,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAC7G,IAAI,CACL,CAAC;AACJ,CAAC;AAED,6HAA6H;AAC7H,SAAgB,iBAAiB,CAAC,IAAU,EAAE,QAAgB;IAC5D,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;QACtC,QAAQ;QACR,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,KAAK;KACjB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAgB,cAAc,CAAC,OAAe,EAAE,OAAe,EAAE,QAAgB;IAC/E,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,OAAO,IAAI,OAAO,UAAU,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACrE,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;GAMG;AACH,SAAS,gBAAgB,CAAC,OAAa,EAAE,QAAgB;IACvD,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;QAC7C,QAAQ;QACR,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,KAAK;KACjB,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1B,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;IAChF,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;AACxG,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,iBAAiB,CAC/B,IAAsC,EACtC,QAAgB,EAChB,MAAY,IAAI,IAAI,EAAE;IAEtB,IAAI,IAAI,CAAC,IAAI;QAAE,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,IAAI,CAAC,IAAI;QAAE,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,iBAAiB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,iBAAiB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC3D,OAAO,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"entry-date.js","sourceRoot":"","sources":["../../src/lib/entry-date.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getBlame = getBlame;
4
+ exports.otherWriters = otherWriters;
5
+ exports.blameMatches = blameMatches;
6
+ exports.replaceMyPart = replaceMyPart;
7
+ const errors_1 = require("../errors");
8
+ /** The blame of `versionId` (the head the caller is about to save on top of), so it describes exactly that text. */
9
+ async function getBlame(client, entryId, versionId) {
10
+ try {
11
+ return await client.get(`/entries/${entryId}/blame`, versionId ? { versionId } : undefined);
12
+ }
13
+ catch (err) {
14
+ // An entry without a single commit has no lines to attribute.
15
+ if (err instanceof errors_1.ApiError && err.status === 404 && !versionId)
16
+ return [];
17
+ throw err;
18
+ }
19
+ }
20
+ const isBlank = (line) => line.content.trim().length === 0;
21
+ /** The other people with words in the entry: display names (or handles), once each, in order of first appearance. */
22
+ function otherWriters(blame, myId) {
23
+ const names = [];
24
+ for (const line of blame) {
25
+ if (isBlank(line) || line.author?.id === myId)
26
+ continue;
27
+ const a = line.author;
28
+ const name = a?.displayName || (a?.username ? `@${a.username}` : null) || "someone";
29
+ if (!names.includes(name))
30
+ names.push(name);
31
+ }
32
+ return names;
33
+ }
34
+ /** True when `blame` is a line-by-line description of `body` -- checked before a splice trusts its line numbers. */
35
+ function blameMatches(blame, body) {
36
+ return blame.map((l) => l.content).join("\n").trimEnd() === body.trimEnd();
37
+ }
38
+ /**
39
+ * `body` with the lines `myId` wrote replaced by `text` -- the rest exactly
40
+ * as it was. Your part is the run from your first written line to your last;
41
+ * blank lines inside it count as yours (they are the separators `whatcha
42
+ * write` puts between appends). Empty `text` removes your part, and the
43
+ * blank lines around it collapse to one paragraph break.
44
+ *
45
+ * Refuses rather than guesses when there is nothing of yours, or when
46
+ * somebody else's words sit between your first line and your last: either
47
+ * way there is no one "your part" to replace.
48
+ */
49
+ function replaceMyPart(blame, myId, text) {
50
+ const mine = blame.map((l, i) => (!isBlank(l) && l.author?.id === myId ? i : -1)).filter((i) => i >= 0);
51
+ if (mine.length === 0) {
52
+ throw new errors_1.CliUsageError("You have not written anything in this entry, so --mine has nothing to replace. " +
53
+ "Use `whatcha write` to add to it.");
54
+ }
55
+ const first = mine[0];
56
+ const last = mine[mine.length - 1];
57
+ const between = blame.slice(first, last + 1).filter((l) => !isBlank(l) && l.author?.id !== myId);
58
+ if (between.length > 0) {
59
+ throw new errors_1.CliUsageError(`Your text in this entry is interleaved with ${otherWriters(between, myId).join(", ")}'s ` +
60
+ `(line ${between[0].lineNumber}), so there is no one part of yours to replace. ` +
61
+ "Edit it in the app, or replace the whole text with --all.");
62
+ }
63
+ const before = blame.slice(0, first).map((l) => l.content);
64
+ const after = blame.slice(last + 1).map((l) => l.content);
65
+ const middle = text.replace(/\s+$/, "");
66
+ if (!middle) {
67
+ const head = before.join("\n").trimEnd();
68
+ const rest = after.join("\n").replace(/^(\s*\n)+/, "").trimEnd();
69
+ return [head, rest].filter((s) => s.length > 0).join("\n\n");
70
+ }
71
+ // The new text goes exactly where yours was, between the same lines --
72
+ // the line breaks around your part are the ones the entry already had.
73
+ return [...before, middle, ...after].join("\n").trimEnd();
74
+ }
75
+ //# sourceMappingURL=entry-edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-edit.js","sourceRoot":"","sources":["../../src/lib/entry-edit.ts"],"names":[],"mappings":";;AAwBA,4BAQC;AAKD,oCASC;AAGD,oCAEC;AAaD,sCA6BC;AA7FD,sCAAoD;AAuBpD,oHAAoH;AAC7G,KAAK,UAAU,QAAQ,CAAC,MAAqB,EAAE,OAAe,EAAE,SAAwB;IAC7F,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,GAAG,CAAc,YAAY,OAAO,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC3G,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,8DAA8D;QAC9D,IAAI,GAAG,YAAY,iBAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,CAAC;QAC3E,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,OAAO,GAAG,CAAC,IAAe,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC;AAEtE,qHAAqH;AACrH,SAAgB,YAAY,CAAC,KAAkB,EAAE,IAAY;IAC3D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,IAAI;YAAE,SAAS;QACxD,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QACtB,MAAM,IAAI,GAAG,CAAC,EAAE,WAAW,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;QACpF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,oHAAoH;AACpH,SAAgB,YAAY,CAAC,KAAkB,EAAE,IAAY;IAC3D,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;AAC7E,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,aAAa,CAAC,KAAkB,EAAE,IAAY,EAAE,IAAY;IAC1E,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACxG,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,sBAAa,CACrB,iFAAiF;YAC/E,mCAAmC,CACtC,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,IAAI,CAAC,CAAC;IACjG,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,sBAAa,CACrB,+CAA+C,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;YACxF,SAAS,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,kDAAkD;YAChF,2DAA2D,CAC9D,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;QACjE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/D,CAAC;IACD,uEAAuE;IACvE,uEAAuE;IACvE,OAAO,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getEntry = getEntry;
4
+ exports.entryBody = entryBody;
5
+ exports.entryMedia = entryMedia;
6
+ /**
7
+ * `GET /entries/:id`, with `body` always a string (#53).
8
+ *
9
+ * The API answers with the commit's `items`; a top-level `body` came back
10
+ * only with the fix for #53. Every server without it made `whatcha read`
11
+ * print "undefined" and made `whatcha write` unable to confirm that an
12
+ * append kept the text before it. So the text item is the fallback, and
13
+ * nothing here trusts `body` to be present.
14
+ */
15
+ async function getEntry(client, entryId) {
16
+ const entry = await client.get(`/entries/${entryId}`);
17
+ return { ...entry, body: entryBody(entry) };
18
+ }
19
+ function entryBody(entry) {
20
+ if (typeof entry.body === "string")
21
+ return entry.body;
22
+ const text = (entry.items ?? []).find((i) => i.type === "text" && i.text);
23
+ return text?.text?.content ?? "";
24
+ }
25
+ /** The entry's images in order, as a save must resend them to keep them. */
26
+ function entryMedia(entry) {
27
+ return (entry.items ?? [])
28
+ .filter((i) => i.type === "media" && i.media?.mediaAssetId)
29
+ .map((i) => ({ mediaAssetId: i.media.mediaAssetId, caption: i.media.caption ?? null }));
30
+ }
31
+ //# sourceMappingURL=entry-get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-get.js","sourceRoot":"","sources":["../../src/lib/entry-get.ts"],"names":[],"mappings":";;AAYA,4BAGC;AAED,8BAIC;AAGD,gCAIC;AAzBD;;;;;;;;GAQG;AACI,KAAK,UAAU,QAAQ,CAAC,MAAqB,EAAE,OAAe;IACnE,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,GAAG,CAAc,YAAY,OAAO,EAAE,CAAC,CAAC;IACnE,OAAO,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;AAC9C,CAAC;AAED,SAAgB,SAAS,CAAC,KAA0C;IAClE,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IACtD,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IAC1E,OAAO,IAAI,EAAE,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC;AACnC,CAAC;AAED,4EAA4E;AAC5E,SAAgB,UAAU,CAAC,KAAiC;IAC1D,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;SACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,KAAK,EAAE,YAAY,CAAC;SAC1D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,KAAM,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,KAAM,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;AAC9F,CAAC"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.findProfile = findProfile;
4
4
  exports.bearerClients = bearerClients;
5
5
  exports.clientAsProfile = clientAsProfile;
6
+ exports.currentProfile = currentProfile;
6
7
  const http_client_1 = require("../http-client");
7
8
  /** A profile of this login by @handle (the `@` optional, case-insensitive) or id. */
8
9
  function findProfile(profiles, target) {
@@ -26,4 +27,17 @@ async function clientAsProfile(client, profileId, forToken) {
26
27
  const issued = await client.post(`/me/profiles/${profileId}/session`, {});
27
28
  return forToken(issued.accessToken);
28
29
  }
30
+ /**
31
+ * The profile `client` acts as, asked of the server (#58).
32
+ *
33
+ * The saved session's `userId` is a note the CLI keeps, not the credential:
34
+ * 0.4.0's `switch --account` swapped the token back to the account's but
35
+ * left the sub-profile's id in that note, so `switch @that-profile` then
36
+ * answered "Already writing as" without switching, and `profile-avatar`
37
+ * set the account's picture while meaning the profile's. Anything that
38
+ * decides "is this the profile in use?" asks here instead.
39
+ */
40
+ async function currentProfile(client) {
41
+ return client.get("/me");
42
+ }
29
43
  //# sourceMappingURL=profile-family.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"profile-family.js","sourceRoot":"","sources":["../../src/lib/profile-family.ts"],"names":[],"mappings":";;AA+BA,kCAGC;AAKD,sCAEC;AAYD,0CAOC;AA5DD,gDAAwE;AA8BxE,qFAAqF;AACrF,SAAgB,WAAW,CAAC,QAA6B,EAAE,MAAc;IACvE,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACtD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,CAAC;AAC9F,CAAC;AAKD,SAAgB,aAAa,CAAC,OAAe;IAC3C,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,gCAAkB,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,UAAU,WAAW,EAAE,CAAC,CAAC;AAC/F,CAAC;AAED;;;;;;;;;GASG;AACI,KAAK,UAAU,eAAe,CACnC,MAAqB,EACrB,SAAiB,EACjB,QAAwB;IAExB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAiB,gBAAgB,SAAS,UAAU,EAAE,EAAE,CAAC,CAAC;IAC1F,OAAO,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AACtC,CAAC"}
1
+ {"version":3,"file":"profile-family.js","sourceRoot":"","sources":["../../src/lib/profile-family.ts"],"names":[],"mappings":";;AA+BA,kCAGC;AAKD,sCAEC;AAYD,0CAOC;AAoBD,wCAEC;AAlFD,gDAAwE;AA8BxE,qFAAqF;AACrF,SAAgB,WAAW,CAAC,QAA6B,EAAE,MAAc;IACvE,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACtD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,CAAC;AAC9F,CAAC;AAKD,SAAgB,aAAa,CAAC,OAAe;IAC3C,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,gCAAkB,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,UAAU,WAAW,EAAE,CAAC,CAAC;AAC/F,CAAC;AAED;;;;;;;;;GASG;AACI,KAAK,UAAU,eAAe,CACnC,MAAqB,EACrB,SAAiB,EACjB,QAAwB;IAExB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAiB,gBAAgB,SAAS,UAAU,EAAE,EAAE,CAAC,CAAC;IAC1F,OAAO,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AACtC,CAAC;AAUD;;;;;;;;;GASG;AACI,KAAK,UAAU,cAAc,CAAC,MAAqB;IACxD,OAAO,MAAM,CAAC,GAAG,CAAK,KAAK,CAAC,CAAC;AAC/B,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@whatcha/cli",
3
- "version": "0.3.0",
4
- "description": "Official command-line client for what-are-you-do-ing (whatareyoudo.ing) -- login (password or personal access key), list diaries, write and read entries, switch profiles, read and write the Experience Wiki, with images.",
3
+ "version": "0.6.0",
4
+ "description": "Official command-line client for what-are-you-do-ing (whatareyoudo.ing) -- login (password or personal access key), list diaries, write, read, edit and delete entries, switch profiles, read and write the Experience Wiki, with images.",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://whatareyoudo.ing/cli",
7
7
  "repository": {