@rmdes/indiekit-endpoint-activitypub 2.0.20 → 2.0.21

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/assets/reader.css CHANGED
@@ -1281,6 +1281,45 @@
1281
1281
  .ap-my-profile__bio .invisible { display: none; }
1282
1282
  .ap-my-profile__bio .ellipsis::after { content: "…"; }
1283
1283
 
1284
+ .ap-my-profile__fields {
1285
+ border: var(--border-width-thin) solid var(--color-outline);
1286
+ border-radius: var(--border-radius-small);
1287
+ margin: var(--space-s) 0;
1288
+ overflow: hidden;
1289
+ }
1290
+
1291
+ .ap-my-profile__field {
1292
+ border-bottom: var(--border-width-thin) solid var(--color-outline);
1293
+ display: grid;
1294
+ grid-template-columns: 120px 1fr;
1295
+ }
1296
+
1297
+ .ap-my-profile__field:last-child {
1298
+ border-bottom: 0;
1299
+ }
1300
+
1301
+ .ap-my-profile__field-name {
1302
+ background: var(--color-offset);
1303
+ color: var(--color-on-offset);
1304
+ font-size: var(--font-size-s);
1305
+ font-weight: 600;
1306
+ padding: var(--space-xs) var(--space-s);
1307
+ text-transform: uppercase;
1308
+ letter-spacing: 0.03em;
1309
+ }
1310
+
1311
+ .ap-my-profile__field-value {
1312
+ font-size: var(--font-size-s);
1313
+ overflow: hidden;
1314
+ padding: var(--space-xs) var(--space-s);
1315
+ text-overflow: ellipsis;
1316
+ white-space: nowrap;
1317
+ }
1318
+
1319
+ .ap-my-profile__field-value a {
1320
+ color: var(--color-primary);
1321
+ }
1322
+
1284
1323
  .ap-my-profile__stats {
1285
1324
  display: flex;
1286
1325
  gap: var(--space-m);
@@ -89,6 +89,14 @@ async function sendFedifyResponse(res, response, request) {
89
89
  if (json.endpoints?.type) {
90
90
  delete json.endpoints.type;
91
91
  }
92
+ // WORKAROUND: Fedify's JSON-LD compaction collapses single-element
93
+ // arrays to a plain object. Mastodon's update_account_fields checks
94
+ // `attachment.is_a?(Array)` and skips if it's not an array, so
95
+ // profile links/PropertyValues are silently ignored.
96
+ // Force `attachment` to always be an array for Mastodon compatibility.
97
+ if (json.attachment && !Array.isArray(json.attachment)) {
98
+ json.attachment = [json.attachment];
99
+ }
92
100
  const patched = JSON.stringify(json);
93
101
  res.setHeader("content-length", Buffer.byteLength(patched));
94
102
  res.end(patched);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rmdes/indiekit-endpoint-activitypub",
3
- "version": "2.0.20",
3
+ "version": "2.0.21",
4
4
  "description": "ActivityPub federation endpoint for Indiekit via Fedify. Adds full fediverse support: actor, inbox, outbox, followers, following, syndication, and Mastodon migration.",
5
5
  "keywords": [
6
6
  "indiekit",
@@ -26,6 +26,23 @@
26
26
  {% if profile.summary %}
27
27
  <div class="ap-my-profile__bio">{{ profile.summary | safe }}</div>
28
28
  {% endif %}
29
+
30
+ {% if profile.attachments and profile.attachments.length > 0 %}
31
+ <dl class="ap-my-profile__fields">
32
+ {% for field in profile.attachments %}
33
+ <div class="ap-my-profile__field">
34
+ <dt class="ap-my-profile__field-name">{{ field.name }}</dt>
35
+ <dd class="ap-my-profile__field-value">
36
+ {% if field.value and (field.value.startsWith("http://") or field.value.startsWith("https://")) %}
37
+ <a href="{{ field.value }}" rel="me noopener" target="_blank">{{ field.value | replace("https://", "") | replace("http://", "") }}</a>
38
+ {% else %}
39
+ {{ field.value }}
40
+ {% endif %}
41
+ </dd>
42
+ </div>
43
+ {% endfor %}
44
+ </dl>
45
+ {% endif %}
29
46
  </div>
30
47
 
31
48
  <div class="ap-my-profile__stats">
@@ -480,7 +480,7 @@
480
480
  <dt class="ap-pub__field-name">{{ field.name }}</dt>
481
481
  <dd class="ap-pub__field-value">
482
482
  {% if field.value and (field.value.startsWith("http://") or field.value.startsWith("https://")) %}
483
- <a href="{{ field.value }}" rel="noopener nofollow" target="_blank">{{ field.value | replace("https://", "") | replace("http://", "") }}</a>
483
+ <a href="{{ field.value }}" rel="me noopener" target="_blank">{{ field.value | replace("https://", "") | replace("http://", "") }}</a>
484
484
  {% else %}
485
485
  {{ field.value }}
486
486
  {% endif %}