@fedify/lint 2.4.0-dev.1909 → 2.4.0-dev.1919

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/deno.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fedify/lint",
3
- "version": "2.4.0-dev.1909+065da803",
3
+ "version": "2.4.0-dev.1919+b6fdaec9",
4
4
  "license": "MIT",
5
5
  "exports": {
6
6
  ".": "./src/mod.ts",
package/dist/index.cjs CHANGED
@@ -24,7 +24,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
24
24
  enumerable: true
25
25
  }) : target, mod));
26
26
  //#endregion
27
- const require_outbox_listener_delivery_required = require("./outbox-listener-delivery-required-C_EYsEoB.cjs");
27
+ const require_outbox_listener_delivery_required = require("./outbox-listener-delivery-required-ZowGJGw7.cjs");
28
28
  let _fxts_core = require("@fxts/core");
29
29
  let _typescript_eslint_parser = require("@typescript-eslint/parser");
30
30
  _typescript_eslint_parser = __toESM(_typescript_eslint_parser, 1);
@@ -34,28 +34,29 @@ _typescript_eslint_parser = __toESM(_typescript_eslint_parser, 1);
34
34
  * Provides lint rules for validating Fedify federation code.
35
35
  */
36
36
  const rules = {
37
- [require_outbox_listener_delivery_required.RULE_IDS.actorIdMismatch]: require_outbox_listener_delivery_required.eslint$16,
38
- [require_outbox_listener_delivery_required.RULE_IDS.actorIdRequired]: require_outbox_listener_delivery_required.eslint$15,
39
- [require_outbox_listener_delivery_required.RULE_IDS.actorFollowingPropertyRequired]: require_outbox_listener_delivery_required.eslint$17,
40
- [require_outbox_listener_delivery_required.RULE_IDS.actorFollowingPropertyMismatch]: require_outbox_listener_delivery_required.eslint$18,
41
- [require_outbox_listener_delivery_required.RULE_IDS.actorFollowersPropertyRequired]: require_outbox_listener_delivery_required.eslint$19,
42
- [require_outbox_listener_delivery_required.RULE_IDS.actorFollowersPropertyMismatch]: require_outbox_listener_delivery_required.eslint$20,
43
- [require_outbox_listener_delivery_required.RULE_IDS.actorOutboxPropertyRequired]: require_outbox_listener_delivery_required.eslint$9,
44
- [require_outbox_listener_delivery_required.RULE_IDS.actorOutboxPropertyMismatch]: require_outbox_listener_delivery_required.eslint$10,
45
- [require_outbox_listener_delivery_required.RULE_IDS.actorLikedPropertyRequired]: require_outbox_listener_delivery_required.eslint$11,
46
- [require_outbox_listener_delivery_required.RULE_IDS.actorLikedPropertyMismatch]: require_outbox_listener_delivery_required.eslint$12,
47
- [require_outbox_listener_delivery_required.RULE_IDS.actorFeaturedPropertyRequired]: require_outbox_listener_delivery_required.eslint$23,
48
- [require_outbox_listener_delivery_required.RULE_IDS.actorFeaturedPropertyMismatch]: require_outbox_listener_delivery_required.eslint$24,
49
- [require_outbox_listener_delivery_required.RULE_IDS.actorFeaturedTagsPropertyRequired]: require_outbox_listener_delivery_required.eslint$21,
50
- [require_outbox_listener_delivery_required.RULE_IDS.actorFeaturedTagsPropertyMismatch]: require_outbox_listener_delivery_required.eslint$22,
51
- [require_outbox_listener_delivery_required.RULE_IDS.actorInboxPropertyRequired]: require_outbox_listener_delivery_required.eslint$13,
52
- [require_outbox_listener_delivery_required.RULE_IDS.actorInboxPropertyMismatch]: require_outbox_listener_delivery_required.eslint$14,
37
+ [require_outbox_listener_delivery_required.RULE_IDS.actorIdMismatch]: require_outbox_listener_delivery_required.eslint$17,
38
+ [require_outbox_listener_delivery_required.RULE_IDS.actorIdRequired]: require_outbox_listener_delivery_required.eslint$16,
39
+ [require_outbox_listener_delivery_required.RULE_IDS.actorFollowingPropertyRequired]: require_outbox_listener_delivery_required.eslint$18,
40
+ [require_outbox_listener_delivery_required.RULE_IDS.actorFollowingPropertyMismatch]: require_outbox_listener_delivery_required.eslint$19,
41
+ [require_outbox_listener_delivery_required.RULE_IDS.actorFollowersPropertyRequired]: require_outbox_listener_delivery_required.eslint$20,
42
+ [require_outbox_listener_delivery_required.RULE_IDS.actorFollowersPropertyMismatch]: require_outbox_listener_delivery_required.eslint$21,
43
+ [require_outbox_listener_delivery_required.RULE_IDS.actorOutboxPropertyRequired]: require_outbox_listener_delivery_required.eslint$10,
44
+ [require_outbox_listener_delivery_required.RULE_IDS.actorOutboxPropertyMismatch]: require_outbox_listener_delivery_required.eslint$11,
45
+ [require_outbox_listener_delivery_required.RULE_IDS.actorLikedPropertyRequired]: require_outbox_listener_delivery_required.eslint$12,
46
+ [require_outbox_listener_delivery_required.RULE_IDS.actorLikedPropertyMismatch]: require_outbox_listener_delivery_required.eslint$13,
47
+ [require_outbox_listener_delivery_required.RULE_IDS.actorFeaturedPropertyRequired]: require_outbox_listener_delivery_required.eslint$24,
48
+ [require_outbox_listener_delivery_required.RULE_IDS.actorFeaturedPropertyMismatch]: require_outbox_listener_delivery_required.eslint$25,
49
+ [require_outbox_listener_delivery_required.RULE_IDS.actorFeaturedTagsPropertyRequired]: require_outbox_listener_delivery_required.eslint$22,
50
+ [require_outbox_listener_delivery_required.RULE_IDS.actorFeaturedTagsPropertyMismatch]: require_outbox_listener_delivery_required.eslint$23,
51
+ [require_outbox_listener_delivery_required.RULE_IDS.actorInboxPropertyRequired]: require_outbox_listener_delivery_required.eslint$14,
52
+ [require_outbox_listener_delivery_required.RULE_IDS.actorInboxPropertyMismatch]: require_outbox_listener_delivery_required.eslint$15,
53
53
  [require_outbox_listener_delivery_required.RULE_IDS.actorSharedInboxPropertyRequired]: require_outbox_listener_delivery_required.eslint$6,
54
54
  [require_outbox_listener_delivery_required.RULE_IDS.actorSharedInboxPropertyMismatch]: require_outbox_listener_delivery_required.eslint$7,
55
55
  [require_outbox_listener_delivery_required.RULE_IDS.actorUploadMediaPropertyRequired]: require_outbox_listener_delivery_required.eslint$4,
56
56
  [require_outbox_listener_delivery_required.RULE_IDS.actorUploadMediaPropertyMismatch]: require_outbox_listener_delivery_required.eslint$5,
57
57
  [require_outbox_listener_delivery_required.RULE_IDS.actorPublicKeyRequired]: require_outbox_listener_delivery_required.eslint$8,
58
- [require_outbox_listener_delivery_required.RULE_IDS.actorAssertionMethodRequired]: require_outbox_listener_delivery_required.eslint$25,
58
+ [require_outbox_listener_delivery_required.RULE_IDS.actorAssertionMethodRequired]: require_outbox_listener_delivery_required.eslint$26,
59
+ [require_outbox_listener_delivery_required.RULE_IDS.actorPreferredUsernameRequired]: require_outbox_listener_delivery_required.eslint$9,
59
60
  [require_outbox_listener_delivery_required.RULE_IDS.collectionFilteringNotImplemented]: require_outbox_listener_delivery_required.eslint$3,
60
61
  [require_outbox_listener_delivery_required.RULE_IDS.outboxListenerDeliveryRequired]: require_outbox_listener_delivery_required.eslint,
61
62
  [require_outbox_listener_delivery_required.RULE_IDS.mediaUploaderObjectUriRequired]: require_outbox_listener_delivery_required.eslint$1,
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { C as eslint$13, D as RULE_IDS, E as eslint$21, O as name, S as eslint$12, T as eslint$11, _ as eslint, a as eslint$18, b as eslint$4, c as eslint$17, d as eslint$7, f as eslint$8, g as eslint$1, h as eslint$15, i as eslint$22, k as version, l as eslint$20, m as eslint$14, n as eslint$24, o as eslint$19, p as eslint$9, r as eslint$25, s as eslint$16, t as eslint$23, u as eslint$6, v as eslint$2, w as eslint$10, x as eslint$5, y as eslint$3 } from "./outbox-listener-delivery-required-C2jDNYO_.js";
1
+ import { A as version, C as eslint$12, D as eslint$21, E as eslint$11, O as RULE_IDS, S as eslint$5, T as eslint$10, _ as eslint$1, a as eslint$18, b as eslint$3, c as eslint$17, d as eslint$6, f as eslint$7, g as eslint$15, h as eslint$14, i as eslint$23, k as name, l as eslint$20, m as eslint$9, n as eslint$25, o as eslint$19, p as eslint$8, r as eslint$26, s as eslint$16, t as eslint$24, u as eslint$22, v as eslint, w as eslint$13, x as eslint$4, y as eslint$2 } from "./outbox-listener-delivery-required-D5dXPcMC.js";
2
2
  import { fromEntries, keys, map, pipe } from "@fxts/core";
3
3
  import parser from "@typescript-eslint/parser";
4
4
  //#region src/index.ts
@@ -29,10 +29,11 @@ const rules = {
29
29
  [RULE_IDS.actorUploadMediaPropertyMismatch]: eslint$19,
30
30
  [RULE_IDS.actorPublicKeyRequired]: eslint$20,
31
31
  [RULE_IDS.actorAssertionMethodRequired]: eslint$21,
32
- [RULE_IDS.collectionFilteringNotImplemented]: eslint$22,
33
- [RULE_IDS.outboxListenerDeliveryRequired]: eslint$23,
34
- [RULE_IDS.mediaUploaderObjectUriRequired]: eslint$24,
35
- [RULE_IDS.mediaUploaderAuthorizationRequired]: eslint$25
32
+ [RULE_IDS.actorPreferredUsernameRequired]: eslint$22,
33
+ [RULE_IDS.collectionFilteringNotImplemented]: eslint$23,
34
+ [RULE_IDS.outboxListenerDeliveryRequired]: eslint$24,
35
+ [RULE_IDS.mediaUploaderObjectUriRequired]: eslint$25,
36
+ [RULE_IDS.mediaUploaderAuthorizationRequired]: eslint$26
36
37
  };
37
38
  const recommendedRuleIds = [RULE_IDS.actorIdMismatch, RULE_IDS.actorIdRequired];
38
39
  /**
@@ -1,7 +1,7 @@
1
1
  import { always, every, head, isEmpty, isObject, negate, pipe, pipeLazy, prop, some, toArray, unless, when } from "@fxts/core";
2
2
  //#region deno.json
3
3
  var name = "@fedify/lint";
4
- var version = "2.4.0-dev.1909+065da803";
4
+ var version = "2.4.0-dev.1919+b6fdaec9";
5
5
  //#endregion
6
6
  //#region src/lib/const.ts
7
7
  /**
@@ -103,6 +103,13 @@ const properties = {
103
103
  setter: "setKeyPairsDispatcher",
104
104
  requiresIdentifier: true,
105
105
  isKeyProperty: true
106
+ },
107
+ preferredUsername: {
108
+ name: "preferredUsername",
109
+ path: ["preferredUsername"],
110
+ setter: "setActorDispatcher",
111
+ requiresIdentifier: false,
112
+ pluralName: "preferredUsernames"
106
113
  }
107
114
  };
108
115
  /**
@@ -121,6 +128,7 @@ const RULE_IDS = {
121
128
  actorUploadMediaPropertyRequired: "actor-upload-media-property-required",
122
129
  actorPublicKeyRequired: "actor-public-key-required",
123
130
  actorAssertionMethodRequired: "actor-assertion-method-required",
131
+ actorPreferredUsernameRequired: "actor-preferred-username-required",
124
132
  actorIdMismatch: "actor-id-mismatch",
125
133
  actorFollowingPropertyMismatch: "actor-following-property-mismatch",
126
134
  actorFollowersPropertyMismatch: "actor-followers-property-mismatch",
@@ -144,13 +152,16 @@ const RULE_IDS = {
144
152
  *
145
153
  * @param name - The property name (e.g., "id", "inbox", "following")
146
154
  */
147
- const actorPropertyRequired = ({ setter, path, getter, requiresIdentifier = true }) => `When \`${setter}\` is configured, the \`${path.join(".")}\` property is recommended. Use \`${getExpectedCall({
148
- ctxName: "Context",
149
- methodName: getter,
150
- idName: "identifier",
151
- path: path.join("."),
152
- requiresIdentifier
153
- })}\` for the \`${path.join(".")}\` property URI.`;
155
+ const actorPropertyRequired = ({ setter, path, getter, requiresIdentifier = true }) => {
156
+ const propertyPath = path.join(".");
157
+ return `When \`${setter}\` is configured, the \`${propertyPath}\` property is recommended. ${getter == null ? `Set the \`${propertyPath}\` property directly on the actor object.` : `Use \`${getExpectedCall({
158
+ ctxName: "Context",
159
+ methodName: getter,
160
+ idName: "identifier",
161
+ path: path.join("."),
162
+ requiresIdentifier
163
+ })}\` for the \`${propertyPath}\` property URI.`}`;
164
+ };
154
165
  /**
155
166
  * Generates error message for *-mismatch rules.
156
167
  * Used when a property exists but uses the wrong context method.
@@ -270,9 +281,10 @@ const unwrapTypeScriptExpression = (node) => {
270
281
  }
271
282
  };
272
283
  const isNullLiteral = (node) => node.type === "Literal" && node.value === null;
284
+ const isTombstoneExpression = (node) => node.type === "NewExpression" && node.callee.type === "Identifier" && node.callee.name === "Tombstone";
273
285
  const checkBranchWith = (propertyChecker) => (branch) => {
274
286
  const expression = unwrapTypeScriptExpression(branch);
275
- if (isNullLiteral(expression)) return true;
287
+ if (isNullLiteral(expression) || isTombstoneExpression(expression)) return true;
276
288
  return pipe(expression, cases(isNodeType("ConditionalExpression"), checkConditionalExpression(propertyChecker), pipeLazy(extractObjectExpression, cases(isObject, checkObjectExpression(propertyChecker), always(false)))));
277
289
  };
278
290
  /**
@@ -299,7 +311,9 @@ const createPropertySearcher = (propertyChecker) => {
299
311
  switch (node.type) {
300
312
  case "ReturnStatement": return checkReturnStatement(propertyChecker)(node);
301
313
  case "BlockStatement": return checkAllReturnPaths(propertyChecker)(node);
302
- case "NewExpression": return pipe(node, extractFirstObjectExpression, when(isObject, checkObjectExpression(propertyChecker)), Boolean);
314
+ case "NewExpression":
315
+ if (isTombstoneExpression(node)) return true;
316
+ return pipe(node, extractFirstObjectExpression, when(isObject, checkObjectExpression(propertyChecker)), Boolean);
303
317
  default: return checkBranchWith(propertyChecker)(node);
304
318
  }
305
319
  };
@@ -402,7 +416,9 @@ function createRequiredRule(config, description) {
402
416
  const federationTracker = trackFederationVariables();
403
417
  const dispatcherTracker = createDispatcherTracker(config.setter, federationTracker);
404
418
  const actorDispatchers = [];
405
- const propertySearcher = createPropertySearcher(createPropertyChecker(Boolean)(config.path));
419
+ const propertyChecker = createPropertyChecker(Boolean)(config.path);
420
+ const pluralPropertyChecker = config.pluralName == null ? null : createPropertyChecker(Boolean)([...config.path.slice(0, -1), config.pluralName]);
421
+ const propertySearcher = createPropertySearcher(pluralPropertyChecker == null ? propertyChecker : (node) => propertyChecker(node) || pluralPropertyChecker(node));
406
422
  return {
407
423
  VariableDeclarator: federationTracker.VariableDeclarator,
408
424
  CallExpression(node) {
@@ -446,7 +462,7 @@ function createRequiredRuleEslint(config) {
446
462
  };
447
463
  }
448
464
  createRequiredRuleDeno(properties.assertionMethod);
449
- const eslint$25 = createRequiredRuleEslint(properties.assertionMethod);
465
+ const eslint$26 = createRequiredRuleEslint(properties.assertionMethod);
450
466
  //#endregion
451
467
  //#region src/lib/mismatch.ts
452
468
  const isIdentifierWithName = (name) => (node) => allOf(isNodeType("Identifier"), isNodeName(name))(node);
@@ -516,37 +532,39 @@ const createMismatchRuleEslint = (config) => ({
516
532
  }))
517
533
  });
518
534
  createMismatchRuleDeno(properties.featured);
519
- const eslint$24 = createMismatchRuleEslint(properties.featured);
535
+ const eslint$25 = createMismatchRuleEslint(properties.featured);
520
536
  createRequiredRuleDeno(properties.featured);
521
- const eslint$23 = createRequiredRuleEslint(properties.featured);
537
+ const eslint$24 = createRequiredRuleEslint(properties.featured);
522
538
  createMismatchRuleDeno(properties.featuredTags);
523
- const eslint$22 = createMismatchRuleEslint(properties.featuredTags);
539
+ const eslint$23 = createMismatchRuleEslint(properties.featuredTags);
524
540
  createRequiredRuleDeno(properties.featuredTags);
525
- const eslint$21 = createRequiredRuleEslint(properties.featuredTags);
541
+ const eslint$22 = createRequiredRuleEslint(properties.featuredTags);
526
542
  createMismatchRuleDeno(properties.followers);
527
- const eslint$20 = createMismatchRuleEslint(properties.followers);
543
+ const eslint$21 = createMismatchRuleEslint(properties.followers);
528
544
  createRequiredRuleDeno(properties.followers);
529
- const eslint$19 = createRequiredRuleEslint(properties.followers);
545
+ const eslint$20 = createRequiredRuleEslint(properties.followers);
530
546
  createMismatchRuleDeno(properties.following);
531
- const eslint$18 = createMismatchRuleEslint(properties.following);
547
+ const eslint$19 = createMismatchRuleEslint(properties.following);
532
548
  createRequiredRuleDeno(properties.following);
533
- const eslint$17 = createRequiredRuleEslint(properties.following);
549
+ const eslint$18 = createRequiredRuleEslint(properties.following);
534
550
  createMismatchRuleDeno(properties.id);
535
- const eslint$16 = createMismatchRuleEslint(properties.id);
551
+ const eslint$17 = createMismatchRuleEslint(properties.id);
536
552
  createRequiredRuleDeno(properties.id);
537
- const eslint$15 = createRequiredRuleEslint(properties.id);
553
+ const eslint$16 = createRequiredRuleEslint(properties.id);
538
554
  createMismatchRuleDeno(properties.inbox);
539
- const eslint$14 = createMismatchRuleEslint(properties.inbox);
555
+ const eslint$15 = createMismatchRuleEslint(properties.inbox);
540
556
  createRequiredRuleDeno(properties.inbox);
541
- const eslint$13 = createRequiredRuleEslint(properties.inbox);
557
+ const eslint$14 = createRequiredRuleEslint(properties.inbox);
542
558
  createMismatchRuleDeno(properties.liked);
543
- const eslint$12 = createMismatchRuleEslint(properties.liked);
559
+ const eslint$13 = createMismatchRuleEslint(properties.liked);
544
560
  createRequiredRuleDeno(properties.liked);
545
- const eslint$11 = createRequiredRuleEslint(properties.liked);
561
+ const eslint$12 = createRequiredRuleEslint(properties.liked);
546
562
  createMismatchRuleDeno(properties.outbox);
547
- const eslint$10 = createMismatchRuleEslint(properties.outbox);
563
+ const eslint$11 = createMismatchRuleEslint(properties.outbox);
548
564
  createRequiredRuleDeno(properties.outbox);
549
- const eslint$9 = createRequiredRuleEslint(properties.outbox);
565
+ const eslint$10 = createRequiredRuleEslint(properties.outbox);
566
+ createRequiredRuleDeno(properties.preferredUsername);
567
+ const eslint$9 = createRequiredRuleEslint(properties.preferredUsername);
550
568
  createRequiredRuleDeno(properties.publicKey);
551
569
  const eslint$8 = createRequiredRuleEslint(properties.publicKey);
552
570
  createMismatchRuleDeno(properties.sharedInbox);
@@ -1244,4 +1262,4 @@ const eslint = {
1244
1262
  })
1245
1263
  };
1246
1264
  //#endregion
1247
- export { eslint$22 as C, RULE_IDS as D, eslint$25 as E, name as O, eslint$21 as S, eslint$24 as T, eslint$16 as _, eslint$4 as a, eslint$19 as b, eslint$7 as c, eslint$10 as d, eslint$11 as f, eslint$15 as g, eslint$14 as h, eslint$3 as i, version as k, eslint$8 as l, eslint$13 as m, eslint$1 as n, eslint$5 as o, eslint$12 as p, eslint$2 as r, eslint$6 as s, eslint as t, eslint$9 as u, eslint$17 as v, eslint$23 as w, eslint$20 as x, eslint$18 as y };
1265
+ export { version as A, eslint$22 as C, eslint$26 as D, eslint$25 as E, RULE_IDS as O, eslint$21 as S, eslint$24 as T, eslint$16 as _, eslint$4 as a, eslint$19 as b, eslint$7 as c, eslint$10 as d, eslint$11 as f, eslint$15 as g, eslint$14 as h, eslint$3 as i, name as k, eslint$8 as l, eslint$13 as m, eslint$1 as n, eslint$5 as o, eslint$12 as p, eslint$2 as r, eslint$6 as s, eslint as t, eslint$9 as u, eslint$17 as v, eslint$23 as w, eslint$20 as x, eslint$18 as y };
@@ -1,7 +1,7 @@
1
1
  let _fxts_core = require("@fxts/core");
2
2
  //#region deno.json
3
3
  var name = "@fedify/lint";
4
- var version = "2.4.0-dev.1909+065da803";
4
+ var version = "2.4.0-dev.1919+b6fdaec9";
5
5
  //#endregion
6
6
  //#region src/lib/const.ts
7
7
  /**
@@ -103,6 +103,13 @@ const properties = {
103
103
  setter: "setKeyPairsDispatcher",
104
104
  requiresIdentifier: true,
105
105
  isKeyProperty: true
106
+ },
107
+ preferredUsername: {
108
+ name: "preferredUsername",
109
+ path: ["preferredUsername"],
110
+ setter: "setActorDispatcher",
111
+ requiresIdentifier: false,
112
+ pluralName: "preferredUsernames"
106
113
  }
107
114
  };
108
115
  /**
@@ -121,6 +128,7 @@ const RULE_IDS = {
121
128
  actorUploadMediaPropertyRequired: "actor-upload-media-property-required",
122
129
  actorPublicKeyRequired: "actor-public-key-required",
123
130
  actorAssertionMethodRequired: "actor-assertion-method-required",
131
+ actorPreferredUsernameRequired: "actor-preferred-username-required",
124
132
  actorIdMismatch: "actor-id-mismatch",
125
133
  actorFollowingPropertyMismatch: "actor-following-property-mismatch",
126
134
  actorFollowersPropertyMismatch: "actor-followers-property-mismatch",
@@ -144,13 +152,16 @@ const RULE_IDS = {
144
152
  *
145
153
  * @param name - The property name (e.g., "id", "inbox", "following")
146
154
  */
147
- const actorPropertyRequired = ({ setter, path, getter, requiresIdentifier = true }) => `When \`${setter}\` is configured, the \`${path.join(".")}\` property is recommended. Use \`${getExpectedCall({
148
- ctxName: "Context",
149
- methodName: getter,
150
- idName: "identifier",
151
- path: path.join("."),
152
- requiresIdentifier
153
- })}\` for the \`${path.join(".")}\` property URI.`;
155
+ const actorPropertyRequired = ({ setter, path, getter, requiresIdentifier = true }) => {
156
+ const propertyPath = path.join(".");
157
+ return `When \`${setter}\` is configured, the \`${propertyPath}\` property is recommended. ${getter == null ? `Set the \`${propertyPath}\` property directly on the actor object.` : `Use \`${getExpectedCall({
158
+ ctxName: "Context",
159
+ methodName: getter,
160
+ idName: "identifier",
161
+ path: path.join("."),
162
+ requiresIdentifier
163
+ })}\` for the \`${propertyPath}\` property URI.`}`;
164
+ };
154
165
  /**
155
166
  * Generates error message for *-mismatch rules.
156
167
  * Used when a property exists but uses the wrong context method.
@@ -270,9 +281,10 @@ const unwrapTypeScriptExpression = (node) => {
270
281
  }
271
282
  };
272
283
  const isNullLiteral = (node) => node.type === "Literal" && node.value === null;
284
+ const isTombstoneExpression = (node) => node.type === "NewExpression" && node.callee.type === "Identifier" && node.callee.name === "Tombstone";
273
285
  const checkBranchWith = (propertyChecker) => (branch) => {
274
286
  const expression = unwrapTypeScriptExpression(branch);
275
- if (isNullLiteral(expression)) return true;
287
+ if (isNullLiteral(expression) || isTombstoneExpression(expression)) return true;
276
288
  return (0, _fxts_core.pipe)(expression, cases(isNodeType("ConditionalExpression"), checkConditionalExpression(propertyChecker), (0, _fxts_core.pipeLazy)(extractObjectExpression, cases(_fxts_core.isObject, checkObjectExpression(propertyChecker), (0, _fxts_core.always)(false)))));
277
289
  };
278
290
  /**
@@ -299,7 +311,9 @@ const createPropertySearcher = (propertyChecker) => {
299
311
  switch (node.type) {
300
312
  case "ReturnStatement": return checkReturnStatement(propertyChecker)(node);
301
313
  case "BlockStatement": return checkAllReturnPaths(propertyChecker)(node);
302
- case "NewExpression": return (0, _fxts_core.pipe)(node, extractFirstObjectExpression, (0, _fxts_core.when)(_fxts_core.isObject, checkObjectExpression(propertyChecker)), Boolean);
314
+ case "NewExpression":
315
+ if (isTombstoneExpression(node)) return true;
316
+ return (0, _fxts_core.pipe)(node, extractFirstObjectExpression, (0, _fxts_core.when)(_fxts_core.isObject, checkObjectExpression(propertyChecker)), Boolean);
303
317
  default: return checkBranchWith(propertyChecker)(node);
304
318
  }
305
319
  };
@@ -402,7 +416,9 @@ function createRequiredRule(config, description) {
402
416
  const federationTracker = trackFederationVariables();
403
417
  const dispatcherTracker = createDispatcherTracker(config.setter, federationTracker);
404
418
  const actorDispatchers = [];
405
- const propertySearcher = createPropertySearcher(createPropertyChecker(Boolean)(config.path));
419
+ const propertyChecker = createPropertyChecker(Boolean)(config.path);
420
+ const pluralPropertyChecker = config.pluralName == null ? null : createPropertyChecker(Boolean)([...config.path.slice(0, -1), config.pluralName]);
421
+ const propertySearcher = createPropertySearcher(pluralPropertyChecker == null ? propertyChecker : (node) => propertyChecker(node) || pluralPropertyChecker(node));
406
422
  return {
407
423
  VariableDeclarator: federationTracker.VariableDeclarator,
408
424
  CallExpression(node) {
@@ -446,7 +462,7 @@ function createRequiredRuleEslint(config) {
446
462
  };
447
463
  }
448
464
  createRequiredRuleDeno(properties.assertionMethod);
449
- const eslint$25 = createRequiredRuleEslint(properties.assertionMethod);
465
+ const eslint$26 = createRequiredRuleEslint(properties.assertionMethod);
450
466
  //#endregion
451
467
  //#region src/lib/mismatch.ts
452
468
  const isIdentifierWithName = (name) => (node) => allOf(isNodeType("Identifier"), isNodeName(name))(node);
@@ -516,37 +532,39 @@ const createMismatchRuleEslint = (config) => ({
516
532
  }))
517
533
  });
518
534
  createMismatchRuleDeno(properties.featured);
519
- const eslint$24 = createMismatchRuleEslint(properties.featured);
535
+ const eslint$25 = createMismatchRuleEslint(properties.featured);
520
536
  createRequiredRuleDeno(properties.featured);
521
- const eslint$23 = createRequiredRuleEslint(properties.featured);
537
+ const eslint$24 = createRequiredRuleEslint(properties.featured);
522
538
  createMismatchRuleDeno(properties.featuredTags);
523
- const eslint$22 = createMismatchRuleEslint(properties.featuredTags);
539
+ const eslint$23 = createMismatchRuleEslint(properties.featuredTags);
524
540
  createRequiredRuleDeno(properties.featuredTags);
525
- const eslint$21 = createRequiredRuleEslint(properties.featuredTags);
541
+ const eslint$22 = createRequiredRuleEslint(properties.featuredTags);
526
542
  createMismatchRuleDeno(properties.followers);
527
- const eslint$20 = createMismatchRuleEslint(properties.followers);
543
+ const eslint$21 = createMismatchRuleEslint(properties.followers);
528
544
  createRequiredRuleDeno(properties.followers);
529
- const eslint$19 = createRequiredRuleEslint(properties.followers);
545
+ const eslint$20 = createRequiredRuleEslint(properties.followers);
530
546
  createMismatchRuleDeno(properties.following);
531
- const eslint$18 = createMismatchRuleEslint(properties.following);
547
+ const eslint$19 = createMismatchRuleEslint(properties.following);
532
548
  createRequiredRuleDeno(properties.following);
533
- const eslint$17 = createRequiredRuleEslint(properties.following);
549
+ const eslint$18 = createRequiredRuleEslint(properties.following);
534
550
  createMismatchRuleDeno(properties.id);
535
- const eslint$16 = createMismatchRuleEslint(properties.id);
551
+ const eslint$17 = createMismatchRuleEslint(properties.id);
536
552
  createRequiredRuleDeno(properties.id);
537
- const eslint$15 = createRequiredRuleEslint(properties.id);
553
+ const eslint$16 = createRequiredRuleEslint(properties.id);
538
554
  createMismatchRuleDeno(properties.inbox);
539
- const eslint$14 = createMismatchRuleEslint(properties.inbox);
555
+ const eslint$15 = createMismatchRuleEslint(properties.inbox);
540
556
  createRequiredRuleDeno(properties.inbox);
541
- const eslint$13 = createRequiredRuleEslint(properties.inbox);
557
+ const eslint$14 = createRequiredRuleEslint(properties.inbox);
542
558
  createMismatchRuleDeno(properties.liked);
543
- const eslint$12 = createMismatchRuleEslint(properties.liked);
559
+ const eslint$13 = createMismatchRuleEslint(properties.liked);
544
560
  createRequiredRuleDeno(properties.liked);
545
- const eslint$11 = createRequiredRuleEslint(properties.liked);
561
+ const eslint$12 = createRequiredRuleEslint(properties.liked);
546
562
  createMismatchRuleDeno(properties.outbox);
547
- const eslint$10 = createMismatchRuleEslint(properties.outbox);
563
+ const eslint$11 = createMismatchRuleEslint(properties.outbox);
548
564
  createRequiredRuleDeno(properties.outbox);
549
- const eslint$9 = createRequiredRuleEslint(properties.outbox);
565
+ const eslint$10 = createRequiredRuleEslint(properties.outbox);
566
+ createRequiredRuleDeno(properties.preferredUsername);
567
+ const eslint$9 = createRequiredRuleEslint(properties.preferredUsername);
550
568
  createRequiredRuleDeno(properties.publicKey);
551
569
  const eslint$8 = createRequiredRuleEslint(properties.publicKey);
552
570
  createMismatchRuleDeno(properties.sharedInbox);
@@ -1364,6 +1382,12 @@ Object.defineProperty(exports, "eslint$25", {
1364
1382
  return eslint$25;
1365
1383
  }
1366
1384
  });
1385
+ Object.defineProperty(exports, "eslint$26", {
1386
+ enumerable: true,
1387
+ get: function() {
1388
+ return eslint$26;
1389
+ }
1390
+ });
1367
1391
  Object.defineProperty(exports, "eslint$3", {
1368
1392
  enumerable: true,
1369
1393
  get: function() {
package/dist/oxlint.cjs CHANGED
@@ -1,28 +1,29 @@
1
- const require_outbox_listener_delivery_required = require("./outbox-listener-delivery-required-C_EYsEoB.cjs");
1
+ const require_outbox_listener_delivery_required = require("./outbox-listener-delivery-required-ZowGJGw7.cjs");
2
2
  //#region src/oxlint.ts
3
3
  const rules = {
4
- [require_outbox_listener_delivery_required.RULE_IDS.actorIdMismatch]: require_outbox_listener_delivery_required.eslint$16,
5
- [require_outbox_listener_delivery_required.RULE_IDS.actorIdRequired]: require_outbox_listener_delivery_required.eslint$15,
6
- [require_outbox_listener_delivery_required.RULE_IDS.actorFollowingPropertyRequired]: require_outbox_listener_delivery_required.eslint$17,
7
- [require_outbox_listener_delivery_required.RULE_IDS.actorFollowingPropertyMismatch]: require_outbox_listener_delivery_required.eslint$18,
8
- [require_outbox_listener_delivery_required.RULE_IDS.actorFollowersPropertyRequired]: require_outbox_listener_delivery_required.eslint$19,
9
- [require_outbox_listener_delivery_required.RULE_IDS.actorFollowersPropertyMismatch]: require_outbox_listener_delivery_required.eslint$20,
10
- [require_outbox_listener_delivery_required.RULE_IDS.actorOutboxPropertyRequired]: require_outbox_listener_delivery_required.eslint$9,
11
- [require_outbox_listener_delivery_required.RULE_IDS.actorOutboxPropertyMismatch]: require_outbox_listener_delivery_required.eslint$10,
12
- [require_outbox_listener_delivery_required.RULE_IDS.actorLikedPropertyRequired]: require_outbox_listener_delivery_required.eslint$11,
13
- [require_outbox_listener_delivery_required.RULE_IDS.actorLikedPropertyMismatch]: require_outbox_listener_delivery_required.eslint$12,
14
- [require_outbox_listener_delivery_required.RULE_IDS.actorFeaturedPropertyRequired]: require_outbox_listener_delivery_required.eslint$23,
15
- [require_outbox_listener_delivery_required.RULE_IDS.actorFeaturedPropertyMismatch]: require_outbox_listener_delivery_required.eslint$24,
16
- [require_outbox_listener_delivery_required.RULE_IDS.actorFeaturedTagsPropertyRequired]: require_outbox_listener_delivery_required.eslint$21,
17
- [require_outbox_listener_delivery_required.RULE_IDS.actorFeaturedTagsPropertyMismatch]: require_outbox_listener_delivery_required.eslint$22,
18
- [require_outbox_listener_delivery_required.RULE_IDS.actorInboxPropertyRequired]: require_outbox_listener_delivery_required.eslint$13,
19
- [require_outbox_listener_delivery_required.RULE_IDS.actorInboxPropertyMismatch]: require_outbox_listener_delivery_required.eslint$14,
4
+ [require_outbox_listener_delivery_required.RULE_IDS.actorIdMismatch]: require_outbox_listener_delivery_required.eslint$17,
5
+ [require_outbox_listener_delivery_required.RULE_IDS.actorIdRequired]: require_outbox_listener_delivery_required.eslint$16,
6
+ [require_outbox_listener_delivery_required.RULE_IDS.actorFollowingPropertyRequired]: require_outbox_listener_delivery_required.eslint$18,
7
+ [require_outbox_listener_delivery_required.RULE_IDS.actorFollowingPropertyMismatch]: require_outbox_listener_delivery_required.eslint$19,
8
+ [require_outbox_listener_delivery_required.RULE_IDS.actorFollowersPropertyRequired]: require_outbox_listener_delivery_required.eslint$20,
9
+ [require_outbox_listener_delivery_required.RULE_IDS.actorFollowersPropertyMismatch]: require_outbox_listener_delivery_required.eslint$21,
10
+ [require_outbox_listener_delivery_required.RULE_IDS.actorOutboxPropertyRequired]: require_outbox_listener_delivery_required.eslint$10,
11
+ [require_outbox_listener_delivery_required.RULE_IDS.actorOutboxPropertyMismatch]: require_outbox_listener_delivery_required.eslint$11,
12
+ [require_outbox_listener_delivery_required.RULE_IDS.actorLikedPropertyRequired]: require_outbox_listener_delivery_required.eslint$12,
13
+ [require_outbox_listener_delivery_required.RULE_IDS.actorLikedPropertyMismatch]: require_outbox_listener_delivery_required.eslint$13,
14
+ [require_outbox_listener_delivery_required.RULE_IDS.actorFeaturedPropertyRequired]: require_outbox_listener_delivery_required.eslint$24,
15
+ [require_outbox_listener_delivery_required.RULE_IDS.actorFeaturedPropertyMismatch]: require_outbox_listener_delivery_required.eslint$25,
16
+ [require_outbox_listener_delivery_required.RULE_IDS.actorFeaturedTagsPropertyRequired]: require_outbox_listener_delivery_required.eslint$22,
17
+ [require_outbox_listener_delivery_required.RULE_IDS.actorFeaturedTagsPropertyMismatch]: require_outbox_listener_delivery_required.eslint$23,
18
+ [require_outbox_listener_delivery_required.RULE_IDS.actorInboxPropertyRequired]: require_outbox_listener_delivery_required.eslint$14,
19
+ [require_outbox_listener_delivery_required.RULE_IDS.actorInboxPropertyMismatch]: require_outbox_listener_delivery_required.eslint$15,
20
20
  [require_outbox_listener_delivery_required.RULE_IDS.actorSharedInboxPropertyRequired]: require_outbox_listener_delivery_required.eslint$6,
21
21
  [require_outbox_listener_delivery_required.RULE_IDS.actorSharedInboxPropertyMismatch]: require_outbox_listener_delivery_required.eslint$7,
22
22
  [require_outbox_listener_delivery_required.RULE_IDS.actorUploadMediaPropertyRequired]: require_outbox_listener_delivery_required.eslint$4,
23
23
  [require_outbox_listener_delivery_required.RULE_IDS.actorUploadMediaPropertyMismatch]: require_outbox_listener_delivery_required.eslint$5,
24
24
  [require_outbox_listener_delivery_required.RULE_IDS.actorPublicKeyRequired]: require_outbox_listener_delivery_required.eslint$8,
25
- [require_outbox_listener_delivery_required.RULE_IDS.actorAssertionMethodRequired]: require_outbox_listener_delivery_required.eslint$25,
25
+ [require_outbox_listener_delivery_required.RULE_IDS.actorAssertionMethodRequired]: require_outbox_listener_delivery_required.eslint$26,
26
+ [require_outbox_listener_delivery_required.RULE_IDS.actorPreferredUsernameRequired]: require_outbox_listener_delivery_required.eslint$9,
26
27
  [require_outbox_listener_delivery_required.RULE_IDS.collectionFilteringNotImplemented]: require_outbox_listener_delivery_required.eslint$3,
27
28
  [require_outbox_listener_delivery_required.RULE_IDS.outboxListenerDeliveryRequired]: require_outbox_listener_delivery_required.eslint,
28
29
  [require_outbox_listener_delivery_required.RULE_IDS.mediaUploaderObjectUriRequired]: require_outbox_listener_delivery_required.eslint$1,
package/dist/oxlint.js CHANGED
@@ -1,4 +1,4 @@
1
- import { C as eslint$13, D as RULE_IDS, E as eslint$21, O as name, S as eslint$12, T as eslint$11, _ as eslint, a as eslint$18, b as eslint$4, c as eslint$17, d as eslint$7, f as eslint$8, g as eslint$1, h as eslint$15, i as eslint$22, k as version, l as eslint$20, m as eslint$14, n as eslint$24, o as eslint$19, p as eslint$9, r as eslint$25, s as eslint$16, t as eslint$23, u as eslint$6, v as eslint$2, w as eslint$10, x as eslint$5, y as eslint$3 } from "./outbox-listener-delivery-required-C2jDNYO_.js";
1
+ import { A as version, C as eslint$12, D as eslint$21, E as eslint$11, O as RULE_IDS, S as eslint$5, T as eslint$10, _ as eslint$1, a as eslint$18, b as eslint$3, c as eslint$17, d as eslint$6, f as eslint$7, g as eslint$15, h as eslint$14, i as eslint$23, k as name, l as eslint$20, m as eslint$9, n as eslint$25, o as eslint$19, p as eslint$8, r as eslint$26, s as eslint$16, t as eslint$24, u as eslint$22, v as eslint, w as eslint$13, x as eslint$4, y as eslint$2 } from "./outbox-listener-delivery-required-D5dXPcMC.js";
2
2
  //#region src/oxlint.ts
3
3
  const rules = {
4
4
  [RULE_IDS.actorIdMismatch]: eslint,
@@ -23,10 +23,11 @@ const rules = {
23
23
  [RULE_IDS.actorUploadMediaPropertyMismatch]: eslint$19,
24
24
  [RULE_IDS.actorPublicKeyRequired]: eslint$20,
25
25
  [RULE_IDS.actorAssertionMethodRequired]: eslint$21,
26
- [RULE_IDS.collectionFilteringNotImplemented]: eslint$22,
27
- [RULE_IDS.outboxListenerDeliveryRequired]: eslint$23,
28
- [RULE_IDS.mediaUploaderObjectUriRequired]: eslint$24,
29
- [RULE_IDS.mediaUploaderAuthorizationRequired]: eslint$25
26
+ [RULE_IDS.actorPreferredUsernameRequired]: eslint$22,
27
+ [RULE_IDS.collectionFilteringNotImplemented]: eslint$23,
28
+ [RULE_IDS.outboxListenerDeliveryRequired]: eslint$24,
29
+ [RULE_IDS.mediaUploaderObjectUriRequired]: eslint$25,
30
+ [RULE_IDS.mediaUploaderAuthorizationRequired]: eslint$26
30
31
  };
31
32
  const plugin = {
32
33
  meta: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fedify/lint",
3
- "version": "2.4.0-dev.1909+065da803",
3
+ "version": "2.4.0-dev.1919+b6fdaec9",
4
4
  "description": "Fedify linting rules and plugins",
5
5
  "keywords": [
6
6
  "Fedify",
@@ -51,7 +51,7 @@
51
51
  ],
52
52
  "peerDependencies": {
53
53
  "eslint": ">=9.0.0",
54
- "@fedify/fedify": "^2.4.0-dev.1909+065da803"
54
+ "@fedify/fedify": "^2.4.0-dev.1919+b6fdaec9"
55
55
  },
56
56
  "peerDependenciesMeta": {
57
57
  "eslint": {
@@ -71,7 +71,7 @@
71
71
  "tsdown": "^0.22.0",
72
72
  "typescript": "^6.0.0",
73
73
  "@fedify/fixture": "2.0.0",
74
- "@fedify/vocab": "2.4.0-dev.1909+065da803"
74
+ "@fedify/vocab": "2.4.0-dev.1919+b6fdaec9"
75
75
  },
76
76
  "scripts": {
77
77
  "build:self": "tsdown",