@fedify/fedify 0.11.0-dev.240 → 0.11.0-dev.241

Sign up to get free protection for your applications and to get access to all the features.
@@ -7011,6 +7011,7 @@ export class Application extends Object {
7011
7011
  #_3yAv8jymNfNuJUDuBzJ1NQhdbAee = [];
7012
7012
  #_BBCTgfphhsFzpVfKTykGSpBNwoA = [];
7013
7013
  #_3bgkPwJanyTCoVFM9ovRcus8tKkU = [];
7014
+ #_4N1vBJzXDf8NbBumeECQMFvKetja = [];
7014
7015
  #_3sG2Hdwn9qzKGu9mpYkqakAMUkH9 = [];
7015
7016
  #_sEoQwUbfk4hEfugzNQ2ZiDcLMkG = [];
7016
7017
  #_gAJzg1QDc4rcefFsUzGSYmyXvNH = [];
@@ -7169,6 +7170,16 @@ export class Application extends Object {
7169
7170
  "Collection | URL" + ".");
7170
7171
  }
7171
7172
  }
7173
+ if ("featured" in values && values.featured != null) {
7174
+ if (values.featured instanceof Collection || values.featured instanceof URL) {
7175
+ // @ts-ignore: type is checked above.
7176
+ this.#_4N1vBJzXDf8NbBumeECQMFvKetja = [values.featured];
7177
+ }
7178
+ else {
7179
+ throw new TypeError("The featured must be of type " +
7180
+ "Collection | URL" + ".");
7181
+ }
7182
+ }
7172
7183
  if ("streams" in values && values.streams != null) {
7173
7184
  if (Array.isArray(values.streams) &&
7174
7185
  values.streams.every((v) => v instanceof Collection || v instanceof URL)) {
@@ -7395,6 +7406,17 @@ export class Application extends Object {
7395
7406
  "Collection | URL" + ".");
7396
7407
  }
7397
7408
  }
7409
+ clone.#_4N1vBJzXDf8NbBumeECQMFvKetja = this.#_4N1vBJzXDf8NbBumeECQMFvKetja;
7410
+ if ("featured" in values && values.featured != null) {
7411
+ if (values.featured instanceof Collection || values.featured instanceof URL) {
7412
+ // @ts-ignore: type is checked above.
7413
+ clone.#_4N1vBJzXDf8NbBumeECQMFvKetja = [values.featured];
7414
+ }
7415
+ else {
7416
+ throw new TypeError("The featured must be of type " +
7417
+ "Collection | URL" + ".");
7418
+ }
7419
+ }
7398
7420
  clone.#_3sG2Hdwn9qzKGu9mpYkqakAMUkH9 = this.#_3sG2Hdwn9qzKGu9mpYkqakAMUkH9;
7399
7421
  if ("streams" in values && values.streams != null) {
7400
7422
  if (Array.isArray(values.streams) &&
@@ -7968,6 +7990,64 @@ export class Application extends Object {
7968
7990
  }
7969
7991
  return v;
7970
7992
  }
7993
+ async #fetchFeatured(url, options = {}) {
7994
+ const documentLoader = options.documentLoader ?? this._documentLoader ??
7995
+ fetchDocumentLoader;
7996
+ const contextLoader = options.contextLoader ?? this._contextLoader ??
7997
+ fetchDocumentLoader;
7998
+ let fetchResult;
7999
+ try {
8000
+ fetchResult = await documentLoader(url.href);
8001
+ }
8002
+ catch (error) {
8003
+ if (options.suppressError) {
8004
+ getLogger(["fedify", "vocab"]).error("Failed to fetch {url}: {error}", { error, url: url.href });
8005
+ return null;
8006
+ }
8007
+ throw error;
8008
+ }
8009
+ const { document } = fetchResult;
8010
+ try {
8011
+ return await Collection.fromJsonLd(document, { documentLoader, contextLoader });
8012
+ }
8013
+ catch (e) {
8014
+ if (!(e instanceof TypeError))
8015
+ throw e;
8016
+ }
8017
+ throw new TypeError("Expected an object of any type of: " +
8018
+ ["https://www.w3.org/ns/activitystreams#Collection"].join(", "));
8019
+ }
8020
+ /**
8021
+ * Similar to
8022
+ * {@link Application.getFeatured},
8023
+ * but returns its `@id` URL instead of the object itself.
8024
+ */
8025
+ get featuredId() {
8026
+ if (this.#_4N1vBJzXDf8NbBumeECQMFvKetja.length < 1)
8027
+ return null;
8028
+ const v = this.#_4N1vBJzXDf8NbBumeECQMFvKetja[0];
8029
+ if (v instanceof URL)
8030
+ return v;
8031
+ return v.id;
8032
+ }
8033
+ /** What is known in Mastodon as "pinned statuses", or statuses that are always
8034
+ * featured at the top of people's profiles, is implemented using an extra
8035
+ * property `featured` on the actor object that points to a {@link Collection}
8036
+ * of objects.
8037
+ */
8038
+ async getFeatured(options = {}) {
8039
+ if (this.#_4N1vBJzXDf8NbBumeECQMFvKetja.length < 1)
8040
+ return null;
8041
+ const v = this.#_4N1vBJzXDf8NbBumeECQMFvKetja[0];
8042
+ if (v instanceof URL) {
8043
+ const fetched = await this.#fetchFeatured(v, options);
8044
+ if (fetched == null)
8045
+ return null;
8046
+ this.#_4N1vBJzXDf8NbBumeECQMFvKetja[0] = fetched;
8047
+ return fetched;
8048
+ }
8049
+ return v;
8050
+ }
7971
8051
  async #fetchStream(url, options = {}) {
7972
8052
  const documentLoader = options.documentLoader ?? this._documentLoader ??
7973
8053
  fetchDocumentLoader;
@@ -8166,6 +8246,15 @@ export class Application extends Object {
8166
8246
  values["https://www.w3.org/ns/activitystreams#liked"] = array;
8167
8247
  }
8168
8248
  array = [];
8249
+ for (const v of this.#_4N1vBJzXDf8NbBumeECQMFvKetja) {
8250
+ const element = v instanceof URL
8251
+ ? { "@id": v.href }
8252
+ : await v.toJsonLd(options);
8253
+ array.push(element);
8254
+ }
8255
+ if (array.length > 0)
8256
+ values["http://joinmastodon.org/ns#featured"] = array;
8257
+ array = [];
8169
8258
  for (const v of this.#_3sG2Hdwn9qzKGu9mpYkqakAMUkH9) {
8170
8259
  const element = v instanceof URL
8171
8260
  ? { "@id": v.href }
@@ -8230,6 +8319,7 @@ export class Application extends Object {
8230
8319
  {
8231
8320
  "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
8232
8321
  "toot": "http://joinmastodon.org/ns#",
8322
+ "featured": { "@id": "toot:featured", "@type": "@id" },
8233
8323
  "discoverable": "toot:discoverable",
8234
8324
  "suspended": "toot:suspended",
8235
8325
  "memorial": "toot:memorial",
@@ -8389,6 +8479,18 @@ export class Application extends Object {
8389
8479
  _3bgkPwJanyTCoVFM9ovRcus8tKkU.push(await Collection.fromJsonLd(v, options));
8390
8480
  }
8391
8481
  instance.#_3bgkPwJanyTCoVFM9ovRcus8tKkU = _3bgkPwJanyTCoVFM9ovRcus8tKkU;
8482
+ const _4N1vBJzXDf8NbBumeECQMFvKetja = [];
8483
+ for (const v of values["http://joinmastodon.org/ns#featured"] ?? []) {
8484
+ if (v == null)
8485
+ continue;
8486
+ if (typeof v === "object" && "@id" in v && !("@type" in v) &&
8487
+ globalThis.Object.keys(v).length === 1) {
8488
+ _4N1vBJzXDf8NbBumeECQMFvKetja.push(new URL(v["@id"]));
8489
+ continue;
8490
+ }
8491
+ _4N1vBJzXDf8NbBumeECQMFvKetja.push(await Collection.fromJsonLd(v, options));
8492
+ }
8493
+ instance.#_4N1vBJzXDf8NbBumeECQMFvKetja = _4N1vBJzXDf8NbBumeECQMFvKetja;
8392
8494
  const _3sG2Hdwn9qzKGu9mpYkqakAMUkH9 = [];
8393
8495
  for (const v of values["https://www.w3.org/ns/activitystreams#streams"] ?? []) {
8394
8496
  if (v == null)
@@ -8554,6 +8656,17 @@ export class Application extends Object {
8554
8656
  if (_3bgkPwJanyTCoVFM9ovRcus8tKkU.length == 1) {
8555
8657
  proxy.liked = _3bgkPwJanyTCoVFM9ovRcus8tKkU[0];
8556
8658
  }
8659
+ const _4N1vBJzXDf8NbBumeECQMFvKetja = this.#_4N1vBJzXDf8NbBumeECQMFvKetja
8660
+ // deno-lint-ignore no-explicit-any
8661
+ .map((v) => v instanceof URL
8662
+ ? {
8663
+ [Symbol.for("Deno.customInspect")]: (inspect, options) => "URL " + inspect(v.href, options),
8664
+ [Symbol.for("nodejs.util.inspect.custom")]: (_depth, options, inspect) => "URL " + inspect(v.href, options),
8665
+ }
8666
+ : v);
8667
+ if (_4N1vBJzXDf8NbBumeECQMFvKetja.length == 1) {
8668
+ proxy.featured = _4N1vBJzXDf8NbBumeECQMFvKetja[0];
8669
+ }
8557
8670
  const _3sG2Hdwn9qzKGu9mpYkqakAMUkH9 = this.#_3sG2Hdwn9qzKGu9mpYkqakAMUkH9
8558
8671
  // deno-lint-ignore no-explicit-any
8559
8672
  .map((v) => v instanceof URL
@@ -12083,6 +12196,7 @@ export class Group extends Object {
12083
12196
  #_3yAv8jymNfNuJUDuBzJ1NQhdbAee = [];
12084
12197
  #_BBCTgfphhsFzpVfKTykGSpBNwoA = [];
12085
12198
  #_3bgkPwJanyTCoVFM9ovRcus8tKkU = [];
12199
+ #_4N1vBJzXDf8NbBumeECQMFvKetja = [];
12086
12200
  #_3sG2Hdwn9qzKGu9mpYkqakAMUkH9 = [];
12087
12201
  #_sEoQwUbfk4hEfugzNQ2ZiDcLMkG = [];
12088
12202
  #_gAJzg1QDc4rcefFsUzGSYmyXvNH = [];
@@ -12241,6 +12355,16 @@ export class Group extends Object {
12241
12355
  "Collection | URL" + ".");
12242
12356
  }
12243
12357
  }
12358
+ if ("featured" in values && values.featured != null) {
12359
+ if (values.featured instanceof Collection || values.featured instanceof URL) {
12360
+ // @ts-ignore: type is checked above.
12361
+ this.#_4N1vBJzXDf8NbBumeECQMFvKetja = [values.featured];
12362
+ }
12363
+ else {
12364
+ throw new TypeError("The featured must be of type " +
12365
+ "Collection | URL" + ".");
12366
+ }
12367
+ }
12244
12368
  if ("streams" in values && values.streams != null) {
12245
12369
  if (Array.isArray(values.streams) &&
12246
12370
  values.streams.every((v) => v instanceof Collection || v instanceof URL)) {
@@ -12467,6 +12591,17 @@ export class Group extends Object {
12467
12591
  "Collection | URL" + ".");
12468
12592
  }
12469
12593
  }
12594
+ clone.#_4N1vBJzXDf8NbBumeECQMFvKetja = this.#_4N1vBJzXDf8NbBumeECQMFvKetja;
12595
+ if ("featured" in values && values.featured != null) {
12596
+ if (values.featured instanceof Collection || values.featured instanceof URL) {
12597
+ // @ts-ignore: type is checked above.
12598
+ clone.#_4N1vBJzXDf8NbBumeECQMFvKetja = [values.featured];
12599
+ }
12600
+ else {
12601
+ throw new TypeError("The featured must be of type " +
12602
+ "Collection | URL" + ".");
12603
+ }
12604
+ }
12470
12605
  clone.#_3sG2Hdwn9qzKGu9mpYkqakAMUkH9 = this.#_3sG2Hdwn9qzKGu9mpYkqakAMUkH9;
12471
12606
  if ("streams" in values && values.streams != null) {
12472
12607
  if (Array.isArray(values.streams) &&
@@ -13040,6 +13175,64 @@ export class Group extends Object {
13040
13175
  }
13041
13176
  return v;
13042
13177
  }
13178
+ async #fetchFeatured(url, options = {}) {
13179
+ const documentLoader = options.documentLoader ?? this._documentLoader ??
13180
+ fetchDocumentLoader;
13181
+ const contextLoader = options.contextLoader ?? this._contextLoader ??
13182
+ fetchDocumentLoader;
13183
+ let fetchResult;
13184
+ try {
13185
+ fetchResult = await documentLoader(url.href);
13186
+ }
13187
+ catch (error) {
13188
+ if (options.suppressError) {
13189
+ getLogger(["fedify", "vocab"]).error("Failed to fetch {url}: {error}", { error, url: url.href });
13190
+ return null;
13191
+ }
13192
+ throw error;
13193
+ }
13194
+ const { document } = fetchResult;
13195
+ try {
13196
+ return await Collection.fromJsonLd(document, { documentLoader, contextLoader });
13197
+ }
13198
+ catch (e) {
13199
+ if (!(e instanceof TypeError))
13200
+ throw e;
13201
+ }
13202
+ throw new TypeError("Expected an object of any type of: " +
13203
+ ["https://www.w3.org/ns/activitystreams#Collection"].join(", "));
13204
+ }
13205
+ /**
13206
+ * Similar to
13207
+ * {@link Group.getFeatured},
13208
+ * but returns its `@id` URL instead of the object itself.
13209
+ */
13210
+ get featuredId() {
13211
+ if (this.#_4N1vBJzXDf8NbBumeECQMFvKetja.length < 1)
13212
+ return null;
13213
+ const v = this.#_4N1vBJzXDf8NbBumeECQMFvKetja[0];
13214
+ if (v instanceof URL)
13215
+ return v;
13216
+ return v.id;
13217
+ }
13218
+ /** What is known in Mastodon as "pinned statuses", or statuses that are always
13219
+ * featured at the top of people's profiles, is implemented using an extra
13220
+ * property `featured` on the actor object that points to a {@link Collection}
13221
+ * of objects.
13222
+ */
13223
+ async getFeatured(options = {}) {
13224
+ if (this.#_4N1vBJzXDf8NbBumeECQMFvKetja.length < 1)
13225
+ return null;
13226
+ const v = this.#_4N1vBJzXDf8NbBumeECQMFvKetja[0];
13227
+ if (v instanceof URL) {
13228
+ const fetched = await this.#fetchFeatured(v, options);
13229
+ if (fetched == null)
13230
+ return null;
13231
+ this.#_4N1vBJzXDf8NbBumeECQMFvKetja[0] = fetched;
13232
+ return fetched;
13233
+ }
13234
+ return v;
13235
+ }
13043
13236
  async #fetchStream(url, options = {}) {
13044
13237
  const documentLoader = options.documentLoader ?? this._documentLoader ??
13045
13238
  fetchDocumentLoader;
@@ -13238,6 +13431,15 @@ export class Group extends Object {
13238
13431
  values["https://www.w3.org/ns/activitystreams#liked"] = array;
13239
13432
  }
13240
13433
  array = [];
13434
+ for (const v of this.#_4N1vBJzXDf8NbBumeECQMFvKetja) {
13435
+ const element = v instanceof URL
13436
+ ? { "@id": v.href }
13437
+ : await v.toJsonLd(options);
13438
+ array.push(element);
13439
+ }
13440
+ if (array.length > 0)
13441
+ values["http://joinmastodon.org/ns#featured"] = array;
13442
+ array = [];
13241
13443
  for (const v of this.#_3sG2Hdwn9qzKGu9mpYkqakAMUkH9) {
13242
13444
  const element = v instanceof URL
13243
13445
  ? { "@id": v.href }
@@ -13302,6 +13504,7 @@ export class Group extends Object {
13302
13504
  {
13303
13505
  "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
13304
13506
  "toot": "http://joinmastodon.org/ns#",
13507
+ "featured": { "@id": "toot:featured", "@type": "@id" },
13305
13508
  "discoverable": "toot:discoverable",
13306
13509
  "suspended": "toot:suspended",
13307
13510
  "memorial": "toot:memorial",
@@ -13461,6 +13664,18 @@ export class Group extends Object {
13461
13664
  _3bgkPwJanyTCoVFM9ovRcus8tKkU.push(await Collection.fromJsonLd(v, options));
13462
13665
  }
13463
13666
  instance.#_3bgkPwJanyTCoVFM9ovRcus8tKkU = _3bgkPwJanyTCoVFM9ovRcus8tKkU;
13667
+ const _4N1vBJzXDf8NbBumeECQMFvKetja = [];
13668
+ for (const v of values["http://joinmastodon.org/ns#featured"] ?? []) {
13669
+ if (v == null)
13670
+ continue;
13671
+ if (typeof v === "object" && "@id" in v && !("@type" in v) &&
13672
+ globalThis.Object.keys(v).length === 1) {
13673
+ _4N1vBJzXDf8NbBumeECQMFvKetja.push(new URL(v["@id"]));
13674
+ continue;
13675
+ }
13676
+ _4N1vBJzXDf8NbBumeECQMFvKetja.push(await Collection.fromJsonLd(v, options));
13677
+ }
13678
+ instance.#_4N1vBJzXDf8NbBumeECQMFvKetja = _4N1vBJzXDf8NbBumeECQMFvKetja;
13464
13679
  const _3sG2Hdwn9qzKGu9mpYkqakAMUkH9 = [];
13465
13680
  for (const v of values["https://www.w3.org/ns/activitystreams#streams"] ?? []) {
13466
13681
  if (v == null)
@@ -13626,6 +13841,17 @@ export class Group extends Object {
13626
13841
  if (_3bgkPwJanyTCoVFM9ovRcus8tKkU.length == 1) {
13627
13842
  proxy.liked = _3bgkPwJanyTCoVFM9ovRcus8tKkU[0];
13628
13843
  }
13844
+ const _4N1vBJzXDf8NbBumeECQMFvKetja = this.#_4N1vBJzXDf8NbBumeECQMFvKetja
13845
+ // deno-lint-ignore no-explicit-any
13846
+ .map((v) => v instanceof URL
13847
+ ? {
13848
+ [Symbol.for("Deno.customInspect")]: (inspect, options) => "URL " + inspect(v.href, options),
13849
+ [Symbol.for("nodejs.util.inspect.custom")]: (_depth, options, inspect) => "URL " + inspect(v.href, options),
13850
+ }
13851
+ : v);
13852
+ if (_4N1vBJzXDf8NbBumeECQMFvKetja.length == 1) {
13853
+ proxy.featured = _4N1vBJzXDf8NbBumeECQMFvKetja[0];
13854
+ }
13629
13855
  const _3sG2Hdwn9qzKGu9mpYkqakAMUkH9 = this.#_3sG2Hdwn9qzKGu9mpYkqakAMUkH9
13630
13856
  // deno-lint-ignore no-explicit-any
13631
13857
  .map((v) => v instanceof URL
@@ -15495,6 +15721,7 @@ export class Organization extends Object {
15495
15721
  #_3yAv8jymNfNuJUDuBzJ1NQhdbAee = [];
15496
15722
  #_BBCTgfphhsFzpVfKTykGSpBNwoA = [];
15497
15723
  #_3bgkPwJanyTCoVFM9ovRcus8tKkU = [];
15724
+ #_4N1vBJzXDf8NbBumeECQMFvKetja = [];
15498
15725
  #_3sG2Hdwn9qzKGu9mpYkqakAMUkH9 = [];
15499
15726
  #_sEoQwUbfk4hEfugzNQ2ZiDcLMkG = [];
15500
15727
  #_gAJzg1QDc4rcefFsUzGSYmyXvNH = [];
@@ -15653,6 +15880,16 @@ export class Organization extends Object {
15653
15880
  "Collection | URL" + ".");
15654
15881
  }
15655
15882
  }
15883
+ if ("featured" in values && values.featured != null) {
15884
+ if (values.featured instanceof Collection || values.featured instanceof URL) {
15885
+ // @ts-ignore: type is checked above.
15886
+ this.#_4N1vBJzXDf8NbBumeECQMFvKetja = [values.featured];
15887
+ }
15888
+ else {
15889
+ throw new TypeError("The featured must be of type " +
15890
+ "Collection | URL" + ".");
15891
+ }
15892
+ }
15656
15893
  if ("streams" in values && values.streams != null) {
15657
15894
  if (Array.isArray(values.streams) &&
15658
15895
  values.streams.every((v) => v instanceof Collection || v instanceof URL)) {
@@ -15879,6 +16116,17 @@ export class Organization extends Object {
15879
16116
  "Collection | URL" + ".");
15880
16117
  }
15881
16118
  }
16119
+ clone.#_4N1vBJzXDf8NbBumeECQMFvKetja = this.#_4N1vBJzXDf8NbBumeECQMFvKetja;
16120
+ if ("featured" in values && values.featured != null) {
16121
+ if (values.featured instanceof Collection || values.featured instanceof URL) {
16122
+ // @ts-ignore: type is checked above.
16123
+ clone.#_4N1vBJzXDf8NbBumeECQMFvKetja = [values.featured];
16124
+ }
16125
+ else {
16126
+ throw new TypeError("The featured must be of type " +
16127
+ "Collection | URL" + ".");
16128
+ }
16129
+ }
15882
16130
  clone.#_3sG2Hdwn9qzKGu9mpYkqakAMUkH9 = this.#_3sG2Hdwn9qzKGu9mpYkqakAMUkH9;
15883
16131
  if ("streams" in values && values.streams != null) {
15884
16132
  if (Array.isArray(values.streams) &&
@@ -16452,6 +16700,64 @@ export class Organization extends Object {
16452
16700
  }
16453
16701
  return v;
16454
16702
  }
16703
+ async #fetchFeatured(url, options = {}) {
16704
+ const documentLoader = options.documentLoader ?? this._documentLoader ??
16705
+ fetchDocumentLoader;
16706
+ const contextLoader = options.contextLoader ?? this._contextLoader ??
16707
+ fetchDocumentLoader;
16708
+ let fetchResult;
16709
+ try {
16710
+ fetchResult = await documentLoader(url.href);
16711
+ }
16712
+ catch (error) {
16713
+ if (options.suppressError) {
16714
+ getLogger(["fedify", "vocab"]).error("Failed to fetch {url}: {error}", { error, url: url.href });
16715
+ return null;
16716
+ }
16717
+ throw error;
16718
+ }
16719
+ const { document } = fetchResult;
16720
+ try {
16721
+ return await Collection.fromJsonLd(document, { documentLoader, contextLoader });
16722
+ }
16723
+ catch (e) {
16724
+ if (!(e instanceof TypeError))
16725
+ throw e;
16726
+ }
16727
+ throw new TypeError("Expected an object of any type of: " +
16728
+ ["https://www.w3.org/ns/activitystreams#Collection"].join(", "));
16729
+ }
16730
+ /**
16731
+ * Similar to
16732
+ * {@link Organization.getFeatured},
16733
+ * but returns its `@id` URL instead of the object itself.
16734
+ */
16735
+ get featuredId() {
16736
+ if (this.#_4N1vBJzXDf8NbBumeECQMFvKetja.length < 1)
16737
+ return null;
16738
+ const v = this.#_4N1vBJzXDf8NbBumeECQMFvKetja[0];
16739
+ if (v instanceof URL)
16740
+ return v;
16741
+ return v.id;
16742
+ }
16743
+ /** What is known in Mastodon as "pinned statuses", or statuses that are always
16744
+ * featured at the top of people's profiles, is implemented using an extra
16745
+ * property `featured` on the actor object that points to a {@link Collection}
16746
+ * of objects.
16747
+ */
16748
+ async getFeatured(options = {}) {
16749
+ if (this.#_4N1vBJzXDf8NbBumeECQMFvKetja.length < 1)
16750
+ return null;
16751
+ const v = this.#_4N1vBJzXDf8NbBumeECQMFvKetja[0];
16752
+ if (v instanceof URL) {
16753
+ const fetched = await this.#fetchFeatured(v, options);
16754
+ if (fetched == null)
16755
+ return null;
16756
+ this.#_4N1vBJzXDf8NbBumeECQMFvKetja[0] = fetched;
16757
+ return fetched;
16758
+ }
16759
+ return v;
16760
+ }
16455
16761
  async #fetchStream(url, options = {}) {
16456
16762
  const documentLoader = options.documentLoader ?? this._documentLoader ??
16457
16763
  fetchDocumentLoader;
@@ -16650,6 +16956,15 @@ export class Organization extends Object {
16650
16956
  values["https://www.w3.org/ns/activitystreams#liked"] = array;
16651
16957
  }
16652
16958
  array = [];
16959
+ for (const v of this.#_4N1vBJzXDf8NbBumeECQMFvKetja) {
16960
+ const element = v instanceof URL
16961
+ ? { "@id": v.href }
16962
+ : await v.toJsonLd(options);
16963
+ array.push(element);
16964
+ }
16965
+ if (array.length > 0)
16966
+ values["http://joinmastodon.org/ns#featured"] = array;
16967
+ array = [];
16653
16968
  for (const v of this.#_3sG2Hdwn9qzKGu9mpYkqakAMUkH9) {
16654
16969
  const element = v instanceof URL
16655
16970
  ? { "@id": v.href }
@@ -16714,6 +17029,7 @@ export class Organization extends Object {
16714
17029
  {
16715
17030
  "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
16716
17031
  "toot": "http://joinmastodon.org/ns#",
17032
+ "featured": { "@id": "toot:featured", "@type": "@id" },
16717
17033
  "discoverable": "toot:discoverable",
16718
17034
  "suspended": "toot:suspended",
16719
17035
  "memorial": "toot:memorial",
@@ -16873,6 +17189,18 @@ export class Organization extends Object {
16873
17189
  _3bgkPwJanyTCoVFM9ovRcus8tKkU.push(await Collection.fromJsonLd(v, options));
16874
17190
  }
16875
17191
  instance.#_3bgkPwJanyTCoVFM9ovRcus8tKkU = _3bgkPwJanyTCoVFM9ovRcus8tKkU;
17192
+ const _4N1vBJzXDf8NbBumeECQMFvKetja = [];
17193
+ for (const v of values["http://joinmastodon.org/ns#featured"] ?? []) {
17194
+ if (v == null)
17195
+ continue;
17196
+ if (typeof v === "object" && "@id" in v && !("@type" in v) &&
17197
+ globalThis.Object.keys(v).length === 1) {
17198
+ _4N1vBJzXDf8NbBumeECQMFvKetja.push(new URL(v["@id"]));
17199
+ continue;
17200
+ }
17201
+ _4N1vBJzXDf8NbBumeECQMFvKetja.push(await Collection.fromJsonLd(v, options));
17202
+ }
17203
+ instance.#_4N1vBJzXDf8NbBumeECQMFvKetja = _4N1vBJzXDf8NbBumeECQMFvKetja;
16876
17204
  const _3sG2Hdwn9qzKGu9mpYkqakAMUkH9 = [];
16877
17205
  for (const v of values["https://www.w3.org/ns/activitystreams#streams"] ?? []) {
16878
17206
  if (v == null)
@@ -17038,6 +17366,17 @@ export class Organization extends Object {
17038
17366
  if (_3bgkPwJanyTCoVFM9ovRcus8tKkU.length == 1) {
17039
17367
  proxy.liked = _3bgkPwJanyTCoVFM9ovRcus8tKkU[0];
17040
17368
  }
17369
+ const _4N1vBJzXDf8NbBumeECQMFvKetja = this.#_4N1vBJzXDf8NbBumeECQMFvKetja
17370
+ // deno-lint-ignore no-explicit-any
17371
+ .map((v) => v instanceof URL
17372
+ ? {
17373
+ [Symbol.for("Deno.customInspect")]: (inspect, options) => "URL " + inspect(v.href, options),
17374
+ [Symbol.for("nodejs.util.inspect.custom")]: (_depth, options, inspect) => "URL " + inspect(v.href, options),
17375
+ }
17376
+ : v);
17377
+ if (_4N1vBJzXDf8NbBumeECQMFvKetja.length == 1) {
17378
+ proxy.featured = _4N1vBJzXDf8NbBumeECQMFvKetja[0];
17379
+ }
17041
17380
  const _3sG2Hdwn9qzKGu9mpYkqakAMUkH9 = this.#_3sG2Hdwn9qzKGu9mpYkqakAMUkH9
17042
17381
  // deno-lint-ignore no-explicit-any
17043
17382
  .map((v) => v instanceof URL
@@ -17245,6 +17584,7 @@ export class Person extends Object {
17245
17584
  #_3yAv8jymNfNuJUDuBzJ1NQhdbAee = [];
17246
17585
  #_BBCTgfphhsFzpVfKTykGSpBNwoA = [];
17247
17586
  #_3bgkPwJanyTCoVFM9ovRcus8tKkU = [];
17587
+ #_4N1vBJzXDf8NbBumeECQMFvKetja = [];
17248
17588
  #_3sG2Hdwn9qzKGu9mpYkqakAMUkH9 = [];
17249
17589
  #_sEoQwUbfk4hEfugzNQ2ZiDcLMkG = [];
17250
17590
  #_gAJzg1QDc4rcefFsUzGSYmyXvNH = [];
@@ -17403,6 +17743,16 @@ export class Person extends Object {
17403
17743
  "Collection | URL" + ".");
17404
17744
  }
17405
17745
  }
17746
+ if ("featured" in values && values.featured != null) {
17747
+ if (values.featured instanceof Collection || values.featured instanceof URL) {
17748
+ // @ts-ignore: type is checked above.
17749
+ this.#_4N1vBJzXDf8NbBumeECQMFvKetja = [values.featured];
17750
+ }
17751
+ else {
17752
+ throw new TypeError("The featured must be of type " +
17753
+ "Collection | URL" + ".");
17754
+ }
17755
+ }
17406
17756
  if ("streams" in values && values.streams != null) {
17407
17757
  if (Array.isArray(values.streams) &&
17408
17758
  values.streams.every((v) => v instanceof Collection || v instanceof URL)) {
@@ -17629,6 +17979,17 @@ export class Person extends Object {
17629
17979
  "Collection | URL" + ".");
17630
17980
  }
17631
17981
  }
17982
+ clone.#_4N1vBJzXDf8NbBumeECQMFvKetja = this.#_4N1vBJzXDf8NbBumeECQMFvKetja;
17983
+ if ("featured" in values && values.featured != null) {
17984
+ if (values.featured instanceof Collection || values.featured instanceof URL) {
17985
+ // @ts-ignore: type is checked above.
17986
+ clone.#_4N1vBJzXDf8NbBumeECQMFvKetja = [values.featured];
17987
+ }
17988
+ else {
17989
+ throw new TypeError("The featured must be of type " +
17990
+ "Collection | URL" + ".");
17991
+ }
17992
+ }
17632
17993
  clone.#_3sG2Hdwn9qzKGu9mpYkqakAMUkH9 = this.#_3sG2Hdwn9qzKGu9mpYkqakAMUkH9;
17633
17994
  if ("streams" in values && values.streams != null) {
17634
17995
  if (Array.isArray(values.streams) &&
@@ -18202,6 +18563,64 @@ export class Person extends Object {
18202
18563
  }
18203
18564
  return v;
18204
18565
  }
18566
+ async #fetchFeatured(url, options = {}) {
18567
+ const documentLoader = options.documentLoader ?? this._documentLoader ??
18568
+ fetchDocumentLoader;
18569
+ const contextLoader = options.contextLoader ?? this._contextLoader ??
18570
+ fetchDocumentLoader;
18571
+ let fetchResult;
18572
+ try {
18573
+ fetchResult = await documentLoader(url.href);
18574
+ }
18575
+ catch (error) {
18576
+ if (options.suppressError) {
18577
+ getLogger(["fedify", "vocab"]).error("Failed to fetch {url}: {error}", { error, url: url.href });
18578
+ return null;
18579
+ }
18580
+ throw error;
18581
+ }
18582
+ const { document } = fetchResult;
18583
+ try {
18584
+ return await Collection.fromJsonLd(document, { documentLoader, contextLoader });
18585
+ }
18586
+ catch (e) {
18587
+ if (!(e instanceof TypeError))
18588
+ throw e;
18589
+ }
18590
+ throw new TypeError("Expected an object of any type of: " +
18591
+ ["https://www.w3.org/ns/activitystreams#Collection"].join(", "));
18592
+ }
18593
+ /**
18594
+ * Similar to
18595
+ * {@link Person.getFeatured},
18596
+ * but returns its `@id` URL instead of the object itself.
18597
+ */
18598
+ get featuredId() {
18599
+ if (this.#_4N1vBJzXDf8NbBumeECQMFvKetja.length < 1)
18600
+ return null;
18601
+ const v = this.#_4N1vBJzXDf8NbBumeECQMFvKetja[0];
18602
+ if (v instanceof URL)
18603
+ return v;
18604
+ return v.id;
18605
+ }
18606
+ /** What is known in Mastodon as "pinned statuses", or statuses that are always
18607
+ * featured at the top of people's profiles, is implemented using an extra
18608
+ * property `featured` on the actor object that points to a {@link Collection}
18609
+ * of objects.
18610
+ */
18611
+ async getFeatured(options = {}) {
18612
+ if (this.#_4N1vBJzXDf8NbBumeECQMFvKetja.length < 1)
18613
+ return null;
18614
+ const v = this.#_4N1vBJzXDf8NbBumeECQMFvKetja[0];
18615
+ if (v instanceof URL) {
18616
+ const fetched = await this.#fetchFeatured(v, options);
18617
+ if (fetched == null)
18618
+ return null;
18619
+ this.#_4N1vBJzXDf8NbBumeECQMFvKetja[0] = fetched;
18620
+ return fetched;
18621
+ }
18622
+ return v;
18623
+ }
18205
18624
  async #fetchStream(url, options = {}) {
18206
18625
  const documentLoader = options.documentLoader ?? this._documentLoader ??
18207
18626
  fetchDocumentLoader;
@@ -18400,6 +18819,15 @@ export class Person extends Object {
18400
18819
  values["https://www.w3.org/ns/activitystreams#liked"] = array;
18401
18820
  }
18402
18821
  array = [];
18822
+ for (const v of this.#_4N1vBJzXDf8NbBumeECQMFvKetja) {
18823
+ const element = v instanceof URL
18824
+ ? { "@id": v.href }
18825
+ : await v.toJsonLd(options);
18826
+ array.push(element);
18827
+ }
18828
+ if (array.length > 0)
18829
+ values["http://joinmastodon.org/ns#featured"] = array;
18830
+ array = [];
18403
18831
  for (const v of this.#_3sG2Hdwn9qzKGu9mpYkqakAMUkH9) {
18404
18832
  const element = v instanceof URL
18405
18833
  ? { "@id": v.href }
@@ -18464,6 +18892,7 @@ export class Person extends Object {
18464
18892
  {
18465
18893
  "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
18466
18894
  "toot": "http://joinmastodon.org/ns#",
18895
+ "featured": { "@id": "toot:featured", "@type": "@id" },
18467
18896
  "discoverable": "toot:discoverable",
18468
18897
  "suspended": "toot:suspended",
18469
18898
  "memorial": "toot:memorial",
@@ -18623,6 +19052,18 @@ export class Person extends Object {
18623
19052
  _3bgkPwJanyTCoVFM9ovRcus8tKkU.push(await Collection.fromJsonLd(v, options));
18624
19053
  }
18625
19054
  instance.#_3bgkPwJanyTCoVFM9ovRcus8tKkU = _3bgkPwJanyTCoVFM9ovRcus8tKkU;
19055
+ const _4N1vBJzXDf8NbBumeECQMFvKetja = [];
19056
+ for (const v of values["http://joinmastodon.org/ns#featured"] ?? []) {
19057
+ if (v == null)
19058
+ continue;
19059
+ if (typeof v === "object" && "@id" in v && !("@type" in v) &&
19060
+ globalThis.Object.keys(v).length === 1) {
19061
+ _4N1vBJzXDf8NbBumeECQMFvKetja.push(new URL(v["@id"]));
19062
+ continue;
19063
+ }
19064
+ _4N1vBJzXDf8NbBumeECQMFvKetja.push(await Collection.fromJsonLd(v, options));
19065
+ }
19066
+ instance.#_4N1vBJzXDf8NbBumeECQMFvKetja = _4N1vBJzXDf8NbBumeECQMFvKetja;
18626
19067
  const _3sG2Hdwn9qzKGu9mpYkqakAMUkH9 = [];
18627
19068
  for (const v of values["https://www.w3.org/ns/activitystreams#streams"] ?? []) {
18628
19069
  if (v == null)
@@ -18788,6 +19229,17 @@ export class Person extends Object {
18788
19229
  if (_3bgkPwJanyTCoVFM9ovRcus8tKkU.length == 1) {
18789
19230
  proxy.liked = _3bgkPwJanyTCoVFM9ovRcus8tKkU[0];
18790
19231
  }
19232
+ const _4N1vBJzXDf8NbBumeECQMFvKetja = this.#_4N1vBJzXDf8NbBumeECQMFvKetja
19233
+ // deno-lint-ignore no-explicit-any
19234
+ .map((v) => v instanceof URL
19235
+ ? {
19236
+ [Symbol.for("Deno.customInspect")]: (inspect, options) => "URL " + inspect(v.href, options),
19237
+ [Symbol.for("nodejs.util.inspect.custom")]: (_depth, options, inspect) => "URL " + inspect(v.href, options),
19238
+ }
19239
+ : v);
19240
+ if (_4N1vBJzXDf8NbBumeECQMFvKetja.length == 1) {
19241
+ proxy.featured = _4N1vBJzXDf8NbBumeECQMFvKetja[0];
19242
+ }
18791
19243
  const _3sG2Hdwn9qzKGu9mpYkqakAMUkH9 = this.#_3sG2Hdwn9qzKGu9mpYkqakAMUkH9
18792
19244
  // deno-lint-ignore no-explicit-any
18793
19245
  .map((v) => v instanceof URL
@@ -20745,6 +21197,7 @@ export class Service extends Object {
20745
21197
  #_3yAv8jymNfNuJUDuBzJ1NQhdbAee = [];
20746
21198
  #_BBCTgfphhsFzpVfKTykGSpBNwoA = [];
20747
21199
  #_3bgkPwJanyTCoVFM9ovRcus8tKkU = [];
21200
+ #_4N1vBJzXDf8NbBumeECQMFvKetja = [];
20748
21201
  #_3sG2Hdwn9qzKGu9mpYkqakAMUkH9 = [];
20749
21202
  #_sEoQwUbfk4hEfugzNQ2ZiDcLMkG = [];
20750
21203
  #_gAJzg1QDc4rcefFsUzGSYmyXvNH = [];
@@ -20903,6 +21356,16 @@ export class Service extends Object {
20903
21356
  "Collection | URL" + ".");
20904
21357
  }
20905
21358
  }
21359
+ if ("featured" in values && values.featured != null) {
21360
+ if (values.featured instanceof Collection || values.featured instanceof URL) {
21361
+ // @ts-ignore: type is checked above.
21362
+ this.#_4N1vBJzXDf8NbBumeECQMFvKetja = [values.featured];
21363
+ }
21364
+ else {
21365
+ throw new TypeError("The featured must be of type " +
21366
+ "Collection | URL" + ".");
21367
+ }
21368
+ }
20906
21369
  if ("streams" in values && values.streams != null) {
20907
21370
  if (Array.isArray(values.streams) &&
20908
21371
  values.streams.every((v) => v instanceof Collection || v instanceof URL)) {
@@ -21129,6 +21592,17 @@ export class Service extends Object {
21129
21592
  "Collection | URL" + ".");
21130
21593
  }
21131
21594
  }
21595
+ clone.#_4N1vBJzXDf8NbBumeECQMFvKetja = this.#_4N1vBJzXDf8NbBumeECQMFvKetja;
21596
+ if ("featured" in values && values.featured != null) {
21597
+ if (values.featured instanceof Collection || values.featured instanceof URL) {
21598
+ // @ts-ignore: type is checked above.
21599
+ clone.#_4N1vBJzXDf8NbBumeECQMFvKetja = [values.featured];
21600
+ }
21601
+ else {
21602
+ throw new TypeError("The featured must be of type " +
21603
+ "Collection | URL" + ".");
21604
+ }
21605
+ }
21132
21606
  clone.#_3sG2Hdwn9qzKGu9mpYkqakAMUkH9 = this.#_3sG2Hdwn9qzKGu9mpYkqakAMUkH9;
21133
21607
  if ("streams" in values && values.streams != null) {
21134
21608
  if (Array.isArray(values.streams) &&
@@ -21702,6 +22176,64 @@ export class Service extends Object {
21702
22176
  }
21703
22177
  return v;
21704
22178
  }
22179
+ async #fetchFeatured(url, options = {}) {
22180
+ const documentLoader = options.documentLoader ?? this._documentLoader ??
22181
+ fetchDocumentLoader;
22182
+ const contextLoader = options.contextLoader ?? this._contextLoader ??
22183
+ fetchDocumentLoader;
22184
+ let fetchResult;
22185
+ try {
22186
+ fetchResult = await documentLoader(url.href);
22187
+ }
22188
+ catch (error) {
22189
+ if (options.suppressError) {
22190
+ getLogger(["fedify", "vocab"]).error("Failed to fetch {url}: {error}", { error, url: url.href });
22191
+ return null;
22192
+ }
22193
+ throw error;
22194
+ }
22195
+ const { document } = fetchResult;
22196
+ try {
22197
+ return await Collection.fromJsonLd(document, { documentLoader, contextLoader });
22198
+ }
22199
+ catch (e) {
22200
+ if (!(e instanceof TypeError))
22201
+ throw e;
22202
+ }
22203
+ throw new TypeError("Expected an object of any type of: " +
22204
+ ["https://www.w3.org/ns/activitystreams#Collection"].join(", "));
22205
+ }
22206
+ /**
22207
+ * Similar to
22208
+ * {@link Service.getFeatured},
22209
+ * but returns its `@id` URL instead of the object itself.
22210
+ */
22211
+ get featuredId() {
22212
+ if (this.#_4N1vBJzXDf8NbBumeECQMFvKetja.length < 1)
22213
+ return null;
22214
+ const v = this.#_4N1vBJzXDf8NbBumeECQMFvKetja[0];
22215
+ if (v instanceof URL)
22216
+ return v;
22217
+ return v.id;
22218
+ }
22219
+ /** What is known in Mastodon as "pinned statuses", or statuses that are always
22220
+ * featured at the top of people's profiles, is implemented using an extra
22221
+ * property `featured` on the actor object that points to a {@link Collection}
22222
+ * of objects.
22223
+ */
22224
+ async getFeatured(options = {}) {
22225
+ if (this.#_4N1vBJzXDf8NbBumeECQMFvKetja.length < 1)
22226
+ return null;
22227
+ const v = this.#_4N1vBJzXDf8NbBumeECQMFvKetja[0];
22228
+ if (v instanceof URL) {
22229
+ const fetched = await this.#fetchFeatured(v, options);
22230
+ if (fetched == null)
22231
+ return null;
22232
+ this.#_4N1vBJzXDf8NbBumeECQMFvKetja[0] = fetched;
22233
+ return fetched;
22234
+ }
22235
+ return v;
22236
+ }
21705
22237
  async #fetchStream(url, options = {}) {
21706
22238
  const documentLoader = options.documentLoader ?? this._documentLoader ??
21707
22239
  fetchDocumentLoader;
@@ -21900,6 +22432,15 @@ export class Service extends Object {
21900
22432
  values["https://www.w3.org/ns/activitystreams#liked"] = array;
21901
22433
  }
21902
22434
  array = [];
22435
+ for (const v of this.#_4N1vBJzXDf8NbBumeECQMFvKetja) {
22436
+ const element = v instanceof URL
22437
+ ? { "@id": v.href }
22438
+ : await v.toJsonLd(options);
22439
+ array.push(element);
22440
+ }
22441
+ if (array.length > 0)
22442
+ values["http://joinmastodon.org/ns#featured"] = array;
22443
+ array = [];
21903
22444
  for (const v of this.#_3sG2Hdwn9qzKGu9mpYkqakAMUkH9) {
21904
22445
  const element = v instanceof URL
21905
22446
  ? { "@id": v.href }
@@ -21964,6 +22505,7 @@ export class Service extends Object {
21964
22505
  {
21965
22506
  "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
21966
22507
  "toot": "http://joinmastodon.org/ns#",
22508
+ "featured": { "@id": "toot:featured", "@type": "@id" },
21967
22509
  "discoverable": "toot:discoverable",
21968
22510
  "suspended": "toot:suspended",
21969
22511
  "memorial": "toot:memorial",
@@ -22123,6 +22665,18 @@ export class Service extends Object {
22123
22665
  _3bgkPwJanyTCoVFM9ovRcus8tKkU.push(await Collection.fromJsonLd(v, options));
22124
22666
  }
22125
22667
  instance.#_3bgkPwJanyTCoVFM9ovRcus8tKkU = _3bgkPwJanyTCoVFM9ovRcus8tKkU;
22668
+ const _4N1vBJzXDf8NbBumeECQMFvKetja = [];
22669
+ for (const v of values["http://joinmastodon.org/ns#featured"] ?? []) {
22670
+ if (v == null)
22671
+ continue;
22672
+ if (typeof v === "object" && "@id" in v && !("@type" in v) &&
22673
+ globalThis.Object.keys(v).length === 1) {
22674
+ _4N1vBJzXDf8NbBumeECQMFvKetja.push(new URL(v["@id"]));
22675
+ continue;
22676
+ }
22677
+ _4N1vBJzXDf8NbBumeECQMFvKetja.push(await Collection.fromJsonLd(v, options));
22678
+ }
22679
+ instance.#_4N1vBJzXDf8NbBumeECQMFvKetja = _4N1vBJzXDf8NbBumeECQMFvKetja;
22126
22680
  const _3sG2Hdwn9qzKGu9mpYkqakAMUkH9 = [];
22127
22681
  for (const v of values["https://www.w3.org/ns/activitystreams#streams"] ?? []) {
22128
22682
  if (v == null)
@@ -22288,6 +22842,17 @@ export class Service extends Object {
22288
22842
  if (_3bgkPwJanyTCoVFM9ovRcus8tKkU.length == 1) {
22289
22843
  proxy.liked = _3bgkPwJanyTCoVFM9ovRcus8tKkU[0];
22290
22844
  }
22845
+ const _4N1vBJzXDf8NbBumeECQMFvKetja = this.#_4N1vBJzXDf8NbBumeECQMFvKetja
22846
+ // deno-lint-ignore no-explicit-any
22847
+ .map((v) => v instanceof URL
22848
+ ? {
22849
+ [Symbol.for("Deno.customInspect")]: (inspect, options) => "URL " + inspect(v.href, options),
22850
+ [Symbol.for("nodejs.util.inspect.custom")]: (_depth, options, inspect) => "URL " + inspect(v.href, options),
22851
+ }
22852
+ : v);
22853
+ if (_4N1vBJzXDf8NbBumeECQMFvKetja.length == 1) {
22854
+ proxy.featured = _4N1vBJzXDf8NbBumeECQMFvKetja[0];
22855
+ }
22291
22856
  const _3sG2Hdwn9qzKGu9mpYkqakAMUkH9 = this.#_3sG2Hdwn9qzKGu9mpYkqakAMUkH9
22292
22857
  // deno-lint-ignore no-explicit-any
22293
22858
  .map((v) => v instanceof URL