@koda-sl/baker-cli 0.373.0 → 0.374.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.
package/README.md CHANGED
@@ -1306,6 +1306,9 @@ baker analytics map --platform google --set kw=keyword # name a parameter, se
1306
1306
  baker analytics map --platform google --remove kw # take that answer back
1307
1307
  baker analytics conversions # what counts, what each produced, and which Forms count nothing
1308
1308
  baker analytics conversions --candidates --output md # everything these pages do, and which of it is counted, as tables
1309
+ baker analytics conversions --candidates # the same as compact JSON: one line per page event, Form keys folded onto `flows`
1310
+ baker analytics conversions --candidates --flow contact # only that Form's event keys, one line each
1311
+ baker analytics conversions --candidates --full --output json # every field of every candidate, Form keys unfolded
1309
1312
  baker analytics conversions --flow contact # one Form's endings as event keys, traffic or not
1310
1313
  baker analytics conversions --event page:request_demo --name "Demo requested"
1311
1314
  baker analytics conversions --event page:a --event submit:b --name "Lead" # both, as one number
@@ -1357,7 +1360,7 @@ Shared flags: `--days <n>` (default 30) or `--start-date` / `--end-date` (`YYYY-
1357
1360
 
1358
1361
  **Paging the list reports.** `people`, `submissions` and `delivery` are lists of individual things rather than breakdowns — `delivery` and `submissions` are the ones the CLI exposes, `people` backs the People section of the dashboard's landing Analytics screen over the same wire — and only they take `--page <n>` (1-based) and `--page-size <n>` (up to 200, default 50). The response carries `pageInfo` with `hasMore` — when it is true there **are** more rows, so a total must never be reported from one page. Pass neither flag and a list comes back at the size it always did. A value that is not a whole positive number (`--page /pricing`) is refused before any request, naming `--landing` as the flag that narrows a report to one page of the site.
1359
1362
 
1360
- **A conversion is a company-level named event, not a property of a Form.** `baker analytics conversions` is the only place "what counts" is decided, and an empty `definitions` list means every conversion number in every other report is zero — not because nobody converted, but because nothing is named as an outcome and Baker never guesses which event is the point of a page. `--candidates` lists every event these pages actually produced — each Form step and trigger, every `data-baker-*` event, every outbound destination — with volume and whether it is already counted; that list is where an event key comes from, so never invent one. `--event <key> --name "Booked a call"` starts counting it **immediately and retroactively**: the whole stored history is rescored, so naming the right event today also fixes last month. Nothing here is staged and publishing is not involved. Two events given the same `--name` become one row and one number, which is how a call booked on three different Forms reads as one outcome. `--count-mode every_time` is for the outcomes people genuinely repeat (a guide downloaded twice is two downloads); the default counts once per visit.
1363
+ **A conversion is a company-level named event, not a property of a Form.** `baker analytics conversions` is the only place "what counts" is decided, and an empty `definitions` list means every conversion number in every other report is zero — not because nobody converted, but because nothing is named as an outcome and Baker never guesses which event is the point of a page. `--candidates` lists every event these pages actually produced — each Form step and trigger, every `data-baker-*` event, every outbound destination — with volume and whether it is already counted; that list is where an event key comes from, so never invent one. The JSON is compact by default: each page or system event is one line (`eventKey`, `events`, `sessions`, `countedAs` when counted), and a Form's keys fold onto its `flows` row as `keys` fired and `events` — dropping that row's empty `counted` and `noConversion` — or onto a `formCandidates` row for a Form not in `flows`. `--candidates --flow <slug>` narrows the list to that Form's keys, and `--full` returns every field (`origin`, `nodeType`, `flowSlug`, `lastSeen`, `sources`, `doors`) of every key, unfolded. `--output md` always folds a Form's keys into one row per Form. `--event <key> --name "Booked a call"` starts counting it **immediately and retroactively**: the whole stored history is rescored, so naming the right event today also fixes last month. Nothing here is staged and publishing is not involved. Two events given the same `--name` become one row and one number, which is how a call booked on three different Forms reads as one outcome. `--count-mode every_time` is for the outcomes people genuinely repeat (a guide downloaded twice is two downloads); the default counts once per visit.
1361
1364
 
1362
1365
  **The name is the grouping, so the CLI defends it.** Repeat `--event` to count several events under one `--name` in a single call; `--rename "<old>" --to "<new>"` renames every event under an outcome, and renaming *onto* a name that already exists **merges** them into one row and one number — the fix for a company whose Forms each invented their own word for the same thing. `--remove-name` drops an outcome entirely, `--remove` a single event key. A name that differs from one already counted only by case, accent, punctuation or a plural is **refused**: Baker groups by exact name, so "Booked a Call" beside "Booked a call" is a number split in half with both halves plausible. Every answer leads with the names already in use, and a company that has named nothing gets a standard set to start from — after which the rule is reuse, in that company's own language.
1363
1366
 
package/dist/cli.js CHANGED
@@ -9080,17 +9080,17 @@ function text(value) {
9080
9080
  return typeof value === "string" ? value : "";
9081
9081
  }
9082
9082
  function draftOpNormalizer(record, full) {
9083
- const compact3 = {
9083
+ const compact4 = {
9084
9084
  kind: text(record.kind),
9085
9085
  name: text(record.targetName),
9086
9086
  ref: text(record.tempId) || text(record.targetActionId),
9087
9087
  tags: Array.isArray(record.tags) ? record.tags.join(",") : ""
9088
9088
  };
9089
9089
  if (!full) {
9090
- return compact3;
9090
+ return compact4;
9091
9091
  }
9092
9092
  return {
9093
- ...compact3,
9093
+ ...compact4,
9094
9094
  description: text(record.description),
9095
9095
  note: text(record.note),
9096
9096
  reason: text(record.reason),
@@ -9365,10 +9365,10 @@ var listCommand2 = defineCommand8({
9365
9365
  process.stdout.write(renderMarkdown(response.data, hints2, { full: args5.full === true }));
9366
9366
  return;
9367
9367
  }
9368
- const compact3 = !args5.full && response.ok;
9369
- const shaped = compact3 ? { ...response, data: compactListData(response.data) } : response;
9368
+ const compact4 = !args5.full && response.ok;
9369
+ const shaped = compact4 ? { ...response, data: compactListData(response.data) } : response;
9370
9370
  const envelope = hints2.length > 0 ? { ...shaped, hints: hints2 } : shaped;
9371
- if (compact3) {
9371
+ if (compact4) {
9372
9372
  process.stdout.write(`${JSON.stringify(envelope)}
9373
9373
  `);
9374
9374
  return;
@@ -14759,8 +14759,8 @@ function normalizePhoneV1(raw) {
14759
14759
  var PHONE_PUNCTUATION = /[\s()./-]/g;
14760
14760
  var E164 = /^\+[1-9]\d{7,14}$/;
14761
14761
  function normalizePhoneV2(raw) {
14762
- const compact3 = raw.replace(PHONE_PUNCTUATION, "");
14763
- const e164 = compact3.startsWith("00") ? `+${compact3.slice(2)}` : compact3;
14762
+ const compact4 = raw.replace(PHONE_PUNCTUATION, "");
14763
+ const e164 = compact4.startsWith("00") ? `+${compact4.slice(2)}` : compact4;
14764
14764
  return E164.test(e164) ? e164 : null;
14765
14765
  }
14766
14766
 
@@ -31887,6 +31887,7 @@ function parseConversionsArgs(raw, argv) {
31887
31887
  removeName: onlyOnce(raw["remove-name"], "--remove-name", argv),
31888
31888
  flowSlug: onlyOnce(raw.flow, "--flow", argv),
31889
31889
  candidates: raw.candidates === true,
31890
+ full: raw.full === true,
31890
31891
  days: readDays(raw.days)
31891
31892
  };
31892
31893
  checkFlagShape(args5);
@@ -31953,6 +31954,72 @@ function conversionsWrite(args5, existing) {
31953
31954
  return { ...set.length > 0 ? { set } : {}, ...remove.length > 0 ? { remove } : {} };
31954
31955
  }
31955
31956
 
31957
+ // src/commands/analytics/conversionCandidates.ts
31958
+ function compact2(row) {
31959
+ return {
31960
+ eventKey: row.eventKey,
31961
+ events: row.events,
31962
+ sessions: row.sessions,
31963
+ ...row.isCounted ? { countedAs: row.countedAs } : {}
31964
+ };
31965
+ }
31966
+ function foldByForm(rows) {
31967
+ const byForm = /* @__PURE__ */ new Map();
31968
+ for (const row of rows) {
31969
+ const form = byForm.get(row.flowSlug) ?? { form: row.flowSlug, keys: 0, countedKeys: 0, events: 0 };
31970
+ form.keys += 1;
31971
+ if (row.isCounted) form.countedKeys += 1;
31972
+ form.events += row.events;
31973
+ byForm.set(row.flowSlug, form);
31974
+ }
31975
+ return [...byForm.values()];
31976
+ }
31977
+ function candidatesForFlow(catalogue, flowSlug) {
31978
+ return flowSlug === void 0 ? [...catalogue] : catalogue.filter((row) => row.flowSlug === flowSlug);
31979
+ }
31980
+ var FOLDED_FORMS_HINT = "A Form's candidates are folded into its `flows` row (`keys` fired, `events`; no `counted` means it counts nothing), or a `formCandidates` row when not listed. `--candidates --flow <slug>` lists that Form's keys; `--full` adds every field of every key.";
31981
+ function candidatesView(rows, options) {
31982
+ if (options.full) return { candidates: rows };
31983
+ if (options.flowSlug !== void 0) return { candidates: rows.map(compact2) };
31984
+ const forms = foldByForm(rows.filter((row) => row.flowSlug !== ""));
31985
+ return {
31986
+ candidates: rows.filter((row) => row.flowSlug === "").map(compact2),
31987
+ ...forms.length > 0 ? { formCandidates: forms } : {}
31988
+ };
31989
+ }
31990
+ function fullFlagHints(args5, format) {
31991
+ if (!args5.full || args5.candidates && format !== "md") return [];
31992
+ return ["`--full` only applies to `--candidates --output json`, so it changed nothing here."];
31993
+ }
31994
+ function compactConversionsEnvelope(envelope, options) {
31995
+ const { candidates, flows, ...data } = envelope.data;
31996
+ if (candidates === void 0) return { ...envelope };
31997
+ const { formCandidates, ...view } = candidatesView(candidates, options);
31998
+ const traffic = new Map(formCandidates?.map((form) => [form.form, form]));
31999
+ const merged = flows?.map(({ slug, counted, noConversion }) => {
32000
+ const form = traffic.get(slug);
32001
+ traffic.delete(slug);
32002
+ return {
32003
+ slug,
32004
+ ...counted.length > 0 ? { counted } : {},
32005
+ ...noConversion !== null ? { noConversion } : {},
32006
+ keys: form?.keys ?? 0,
32007
+ events: form?.events ?? 0
32008
+ };
32009
+ });
32010
+ const hints2 = [...envelope.hints ?? [], ...formCandidates ? [FOLDED_FORMS_HINT] : []];
32011
+ return {
32012
+ ...envelope,
32013
+ data: {
32014
+ ...data,
32015
+ ...merged ? { flows: merged } : {},
32016
+ ...view,
32017
+ ...traffic.size > 0 ? { formCandidates: [...traffic.values()] } : {}
32018
+ },
32019
+ ...hints2.length > 0 ? { hints: hints2 } : {}
32020
+ };
32021
+ }
32022
+
31956
32023
  // src/commands/analytics/conversionHints.ts
31957
32024
  var NAMED_CANDIDATES = 3;
31958
32025
  function conversionHints(definitions, candidates, askedForCandidates) {
@@ -32278,7 +32345,7 @@ function trafficByForm(candidates) {
32278
32345
  return byForm;
32279
32346
  }
32280
32347
  var NO_TRAFFIC = { "endings seen": 0, "endings counted": 0, events: 0, lastSeen: "" };
32281
- var FORM_KEYS_HINT = "A Form's candidates are one row per Form: `baker analytics conversions --flow <slug>` lists that Form's event keys, and `--candidates --output json` lists every key.";
32348
+ var FORM_KEYS_HINT = "A Form's candidates are one row per Form: `baker analytics conversions --flow <slug>` lists that Form's event keys, and `--candidates --full --output json` lists every key with every field.";
32282
32349
  function renderConversionsMarkdown(envelope) {
32283
32350
  const { definitions, flow, flows, candidates } = envelope.data;
32284
32351
  const data = {
@@ -32315,7 +32382,7 @@ function renderConversionsMarkdown(envelope) {
32315
32382
  return renderMarkdown3({ data, ...hints2.length > 0 ? { hints: hints2 } : {} });
32316
32383
  }
32317
32384
  function withFormatHint(envelope, format) {
32318
- const hints2 = [...envelope.hints ?? [], ...formatHint(envelope.data, format)];
32385
+ const hints2 = [...envelope.hints ?? [], ...formatHint({ ...envelope.data }, format)];
32319
32386
  return { ...envelope, ...hints2.length > 0 ? { hints: hints2 } : {} };
32320
32387
  }
32321
32388
 
@@ -34473,13 +34540,13 @@ function readFlowConversions2(slug, definitions) {
34473
34540
  endings: joinFlowConversions(flowEventKeys(tree, slug), definitions)
34474
34541
  };
34475
34542
  }
34476
- function conversionsEnvelope(args5, definitions, candidates, serverHints = []) {
34543
+ function conversionsEnvelope(args5, definitions, candidates, leadingHints = []) {
34477
34544
  const flow = args5.flowSlug === void 0 ? null : readFlowConversions2(args5.flowSlug, definitions);
34478
34545
  const forms = flow === null ? readWorkspaceFlows() : [];
34479
34546
  const coverage = flowCoverage(forms, definitions);
34480
34547
  const page = pageCandidates(definitions, candidates, args5.candidates);
34481
34548
  const hints2 = [
34482
- ...serverHints,
34549
+ ...leadingHints,
34483
34550
  ...flow ? flowConversionHints(flow.slug, flow.endings, flow.noConversionReason) : [],
34484
34551
  ...flowCoverageHints(coverage),
34485
34552
  ...stagedHints(definitions),
@@ -34492,7 +34559,7 @@ function conversionsEnvelope(args5, definitions, candidates, serverHints = []) {
34492
34559
  definitions,
34493
34560
  ...flow ? { flow } : {},
34494
34561
  ...coverage.length > 0 ? { flows: coverage } : {},
34495
- ...args5.candidates ? { candidates: page.candidates } : {}
34562
+ ...args5.candidates ? { candidates: candidatesForFlow(page.candidates, args5.flowSlug) } : {}
34496
34563
  },
34497
34564
  ...hints2.length > 0 ? { hints: hints2 } : {}
34498
34565
  };
@@ -34536,12 +34603,17 @@ var conversionsCommand3 = (() => {
34536
34603
  },
34537
34604
  candidates: {
34538
34605
  type: "boolean",
34539
- description: "Also list every event these pages actually produced, ranked by volume, with whether it is already counted. This is where an event key comes from \u2014 do not invent one. Off by default because a busy company produces hundreds of rows",
34606
+ description: "Also list every event these pages actually produced, ranked by volume, with whether it is already counted. This is where an event key comes from \u2014 do not invent one. Compact by default in JSON: each page or system event is one line (eventKey, events, sessions, countedAs when counted) and a Form's keys fold onto its `flows` row as `keys` and `events` (or a `formCandidates` row for a Form not in `flows`). Add --flow <slug> for that Form's keys only, and --full --output json for every field of every row",
34607
+ required: false
34608
+ },
34609
+ full: {
34610
+ type: "boolean",
34611
+ description: "With --candidates: every field of every candidate (origin, nodeType, flowSlug, lastSeen, sources, doors) and every Form key unfolded. Large on a busy company \u2014 narrow it with --flow first",
34540
34612
  required: false
34541
34613
  },
34542
34614
  flow: {
34543
34615
  type: "string",
34544
- description: "A Form slug. Lists that Form's own endings already spelled as event keys, each with the name Baker counts it under or nothing \u2014 read off the Form's file, so it works on a Form built minutes ago that has never been visited, which is exactly when --candidates is empty. Use it whenever you create or edit a Form: it is the only way to see that the Form counts nothing before it is published counting nothing",
34616
+ description: "A Form slug. Lists that Form's own endings already spelled as event keys, each with the name Baker counts it under or nothing \u2014 read off the Form's file, so it works on a Form built minutes ago that has never been visited, which is exactly when --candidates is empty. With --candidates, narrows the candidates to that Form's keys. Use it whenever you create or edit a Form: it is the only way to see that the Form counts nothing before it is published counting nothing",
34545
34617
  required: false
34546
34618
  },
34547
34619
  days: {
@@ -34559,7 +34631,7 @@ var conversionsCommand3 = (() => {
34559
34631
  return defineCommand99({
34560
34632
  meta: {
34561
34633
  name: "conversions",
34562
- description: "What this company counts as a conversion \u2014 the numerator of every conversion rate on Measure. A page event (a Form ending, a data-baker-* event) and an event one of the client's systems sends (a HubSpot event made with `baker analytics sources --create-hubspot`, an order the server posts) both count; a system's event is credited to the last landing its person viewed. A HubSpot event is `page:<its name>` here \u2014 `--event 'page:Deal won' --name 'Deal won'`. Run with no flags first: an empty `definitions` list means every conversion number in every other report is zero \u2014 not because nobody converted, but because nothing is marked as converting, and Baker never guesses. Add `--candidates` to see everything these pages actually do (every Form step, every data-baker-* event, every outbound destination) with counts and whether it is already counted; that list is where an event key comes from, so never invent one. Then `--event <key> --name 'Booked a call'` to count it. Inside a chat a change is STAGED: the person sees it under Sources in the chat's changes, on the event's own row and it applies when they publish, retroactively \u2014 the whole history is rescored, so a company that has been running for a month gets a month of correct numbers. A read shows a proposal marked `staged`. Call an event by its name when you talk to the person, never by its key. Two events given the SAME --name are one row and one number. `--remove <key>` stops counting one. `--flow <slug>` answers the other direction \u2014 what one Form counts, with every ending it has already spelled as an event key, read from the Form itself so it works before a single visitor has seen it. Run it whenever you create or edit a Form: a Form nobody named an outcome for is published converting nobody, and no report says so."
34634
+ description: "What this company counts as a conversion \u2014 the numerator of every conversion rate on Measure. A page event (a Form ending, a data-baker-* event) and an event one of the client's systems sends (a HubSpot event made with `baker analytics sources --create-hubspot`, an order the server posts) both count; a system's event is credited to the last landing its person viewed. A HubSpot event is `page:<its name>` here \u2014 `--event 'page:Deal won' --name 'Deal won'`. Run with no flags first: an empty `definitions` list means every conversion number in every other report is zero \u2014 not because nobody converted, but because nothing is marked as converting, and Baker never guesses. Add `--candidates` to see everything these pages actually do (every Form step, every data-baker-* event, every outbound destination) with counts and whether it is already counted; that list is where an event key comes from, so never invent one. It is compact: a Form's keys fold onto its `flows` row, `--candidates --flow <slug>` lists one Form's keys, and `--full --output json` returns every field of every row. Then `--event <key> --name 'Booked a call'` to count it. Inside a chat a change is STAGED: the person sees it under Sources in the chat's changes, on the event's own row and it applies when they publish, retroactively \u2014 the whole history is rescored, so a company that has been running for a month gets a month of correct numbers. A read shows a proposal marked `staged`. Call an event by its name when you talk to the person, never by its key. Two events given the SAME --name are one row and one number. `--remove <key>` stops counting one. `--flow <slug>` answers the other direction \u2014 what one Form counts, with every ending it has already spelled as an event key, read from the Form itself so it works before a single visitor has seen it. Run it whenever you create or edit a Form: a Form nobody named an outcome for is published converting nobody, and no report says so."
34563
34635
  },
34564
34636
  args: args5,
34565
34637
  run: async ({ args: raw }) => {
@@ -34579,10 +34651,10 @@ var conversionsCommand3 = (() => {
34579
34651
  args6,
34580
34652
  mergeStoredWithCounts(stored, report.data.conversions ?? []),
34581
34653
  report.data.eventCatalog ?? [],
34582
- answer.hints ?? []
34654
+ [...answer.hints ?? [], ...fullFlagHints(args6, format)]
34583
34655
  );
34584
34656
  if (format === "md") process.stdout.write(renderConversionsMarkdown(envelope));
34585
- else writeJsonEnvelope(withFormatHint(envelope, format));
34657
+ else writeJsonEnvelope(withFormatHint(compactConversionsEnvelope(envelope, args6), format));
34586
34658
  } catch (err) {
34587
34659
  if (err instanceof ConversionArgsError) {
34588
34660
  handleError3(new ApiError("VALIDATION_ERROR", err.message));
@@ -54495,13 +54567,13 @@ function compactHit(hit) {
54495
54567
  };
54496
54568
  }
54497
54569
  function providerHitNormalizer(record, full) {
54498
- const compact3 = compactHit(record);
54570
+ const compact4 = compactHit(record);
54499
54571
  if (!full) {
54500
- return compact3;
54572
+ return compact4;
54501
54573
  }
54502
54574
  const group = asRecord2(record.group);
54503
54575
  return {
54504
- ...compact3,
54576
+ ...compact4,
54505
54577
  externalUrl: str(record.externalUrl),
54506
54578
  externalId: str(record.externalId),
54507
54579
  description: str(record.description),
@@ -55263,7 +55335,7 @@ registerSchema({
55263
55335
  }
55264
55336
  });
55265
55337
  var POLL_INTERVAL_MS3 = 4e3;
55266
- function compact2(doc) {
55338
+ function compact3(doc) {
55267
55339
  return {
55268
55340
  layeredImageId: doc.layeredImageId,
55269
55341
  imageId: doc.imageId,
@@ -55353,7 +55425,7 @@ var layerizeCommand = defineCommand157({
55353
55425
  });
55354
55426
  process.exit(1);
55355
55427
  }
55356
- writeJson({ ok: true, data: full ? settled : compact2(settled), hints: hintsFor3(settled) });
55428
+ writeJson({ ok: true, data: full ? settled : compact3(settled), hints: hintsFor3(settled) });
55357
55429
  } catch (err) {
55358
55430
  if (err instanceof ApiError) {
55359
55431
  writeJson({ ok: false, error: { code: err.code, message: err.message } });
@@ -55392,7 +55464,7 @@ var layersCommand = defineCommand157({
55392
55464
  process.exit(1);
55393
55465
  }
55394
55466
  const doc = await apiGet("/api/images/layers", { imageId });
55395
- writeJson({ ok: true, data: args5.full ? doc : compact2(doc), hints: hintsFor3(doc) });
55467
+ writeJson({ ok: true, data: args5.full ? doc : compact3(doc), hints: hintsFor3(doc) });
55396
55468
  } catch (err) {
55397
55469
  if (err instanceof ApiError) {
55398
55470
  writeJson({
@@ -65021,7 +65093,7 @@ function adByHandHint(input) {
65021
65093
 
65022
65094
  // src/commands/studio/batch.ts
65023
65095
  function projectBatch(generation, full) {
65024
- const compact3 = {
65096
+ const compact4 = {
65025
65097
  generationId: generation.generationId,
65026
65098
  kind: generation.kind,
65027
65099
  status: generation.status,
@@ -65038,9 +65110,9 @@ function projectBatch(generation, full) {
65038
65110
  ...variant.error ? { error: variant.error } : {}
65039
65111
  }))
65040
65112
  };
65041
- if (!full) return compact3;
65113
+ if (!full) return compact4;
65042
65114
  return {
65043
- ...compact3,
65115
+ ...compact4,
65044
65116
  ...generation.skillId ? { skillId: generation.skillId } : {},
65045
65117
  ...generation.imageSettings ? { imageSettings: generation.imageSettings } : {},
65046
65118
  ...generation.clipSettings ? { clipSettings: generation.clipSettings } : {},
@@ -68240,12 +68312,12 @@ function compactAdvertiser(record) {
68240
68312
  };
68241
68313
  }
68242
68314
  function advertiserNormalizer(record, full) {
68243
- const compact3 = compactAdvertiser(record);
68315
+ const compact4 = compactAdvertiser(record);
68244
68316
  if (!full) {
68245
- return compact3;
68317
+ return compact4;
68246
68318
  }
68247
68319
  return {
68248
- ...compact3,
68320
+ ...compact4,
68249
68321
  scraped_name: record.scraped_name ?? null,
68250
68322
  image_url: record.image_url ?? null,
68251
68323
  platforms: Array.isArray(record.platforms) ? record.platforms : [],
@@ -68806,12 +68878,12 @@ function followingHints(records) {
68806
68878
  return hints2;
68807
68879
  }
68808
68880
  function followingNormalizer(record, full) {
68809
- const compact3 = compactFollowed(record);
68881
+ const compact4 = compactFollowed(record);
68810
68882
  if (!full) {
68811
- return compact3;
68883
+ return compact4;
68812
68884
  }
68813
68885
  return {
68814
- ...compact3,
68886
+ ...compact4,
68815
68887
  image_url: record.image_url ?? null,
68816
68888
  platforms: Array.isArray(record.platforms) ? record.platforms : []
68817
68889
  };