@fedify/lint 2.4.0-dev.2190 → 2.4.0-dev.2200

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
@@ -132,6 +132,12 @@ federation code:
132
132
  - **`actor-upload-media-property-mismatch`**: Validates endpoints.uploadMedia
133
133
  URI from `getMediaUploaderUri`
134
134
 
135
+ The mismatch rules for actor `id`, `inbox`, `outbox`, `followers`, `following`,
136
+ `liked`, `featured`, and `featuredTags` also accept the corresponding
137
+ `getPortable*Uri()` method. They accept an inline
138
+ `toCompatibleEf61Id(ctx.getPortable*Uri(identifier, did), gateway)` call for
139
+ gateway-compatible IDs.
140
+
135
141
  ### Other rules
136
142
 
137
143
  - **`collection-filtering-not-implemented`**: Warns about missing collection
package/deno.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fedify/lint",
3
- "version": "2.4.0-dev.2190+be3a8be0",
3
+ "version": "2.4.0-dev.2200+e588a43c",
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-DYdl7PTJ.cjs");
27
+ const require_outbox_listener_delivery_required = require("./outbox-listener-delivery-required-C_hP9Cqy.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);
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { A as name, C as eslint$5, D as eslint$11, E as eslint$10, O as eslint$21, S as eslint$4, T as eslint$13, _ as eslint$15, a as eslint$23, b as eslint$2, c as eslint$16, d as eslint$22, f as eslint$6, g as eslint$14, h as eslint$9, i as eslint$27, j as version, k as RULE_IDS, l as eslint$17, m as eslint$8, n as eslint$25, o as eslint$18, p as eslint$7, r as eslint$26, s as eslint$19, t as eslint$24, u as eslint$20, v as eslint$1, w as eslint$12, x as eslint$3, y as eslint } from "./outbox-listener-delivery-required-CUn9pnIN.js";
1
+ import { A as name, C as eslint$5, D as eslint$11, E as eslint$10, O as eslint$21, S as eslint$4, T as eslint$13, _ as eslint$15, a as eslint$23, b as eslint$2, c as eslint$16, d as eslint$22, f as eslint$6, g as eslint$14, h as eslint$9, i as eslint$27, j as version, k as RULE_IDS, l as eslint$17, m as eslint$8, n as eslint$25, o as eslint$18, p as eslint$7, r as eslint$26, s as eslint$19, t as eslint$24, u as eslint$20, v as eslint$1, w as eslint$12, x as eslint$3, y as eslint } from "./outbox-listener-delivery-required-BqLlqa_d.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
@@ -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.2190+be3a8be0";
4
+ var version = "2.4.0-dev.2200+e588a43c";
5
5
  //#endregion
6
6
  //#region src/lib/const.ts
7
7
  /**
@@ -14,6 +14,7 @@ const properties = {
14
14
  name: "id",
15
15
  path: ["id"],
16
16
  getter: "getActorUri",
17
+ portableGetter: "getPortableActorUri",
17
18
  setter: "setActorDispatcher",
18
19
  requiresIdentifier: true
19
20
  },
@@ -21,6 +22,7 @@ const properties = {
21
22
  name: "following",
22
23
  path: ["following"],
23
24
  getter: "getFollowingUri",
25
+ portableGetter: "getPortableFollowingUri",
24
26
  setter: "setFollowingDispatcher",
25
27
  requiresIdentifier: true
26
28
  },
@@ -28,6 +30,7 @@ const properties = {
28
30
  name: "followers",
29
31
  path: ["followers"],
30
32
  getter: "getFollowersUri",
33
+ portableGetter: "getPortableFollowersUri",
31
34
  setter: "setFollowersDispatcher",
32
35
  requiresIdentifier: true
33
36
  },
@@ -35,6 +38,7 @@ const properties = {
35
38
  name: "outbox",
36
39
  path: ["outbox"],
37
40
  getter: "getOutboxUri",
41
+ portableGetter: "getPortableOutboxUri",
38
42
  setter: "setOutboxDispatcher",
39
43
  requiresIdentifier: true
40
44
  },
@@ -42,6 +46,7 @@ const properties = {
42
46
  name: "inbox",
43
47
  path: ["inbox"],
44
48
  getter: "getInboxUri",
49
+ portableGetter: "getPortableInboxUri",
45
50
  setter: "setInboxListeners",
46
51
  requiresIdentifier: true
47
52
  },
@@ -49,6 +54,7 @@ const properties = {
49
54
  name: "liked",
50
55
  path: ["liked"],
51
56
  getter: "getLikedUri",
57
+ portableGetter: "getPortableLikedUri",
52
58
  setter: "setLikedDispatcher",
53
59
  requiresIdentifier: true
54
60
  },
@@ -56,6 +62,7 @@ const properties = {
56
62
  name: "featured",
57
63
  path: ["featured"],
58
64
  getter: "getFeaturedUri",
65
+ portableGetter: "getPortableFeaturedUri",
59
66
  setter: "setFeaturedDispatcher",
60
67
  requiresIdentifier: true
61
68
  },
@@ -63,6 +70,7 @@ const properties = {
63
70
  name: "featuredTags",
64
71
  path: ["featuredTags"],
65
72
  getter: "getFeaturedTagsUri",
73
+ portableGetter: "getPortableFeaturedTagsUri",
66
74
  setter: "setFeaturedTagsDispatcher",
67
75
  requiresIdentifier: true
68
76
  },
@@ -470,11 +478,17 @@ const isIdentifierWithName = (name) => (node) => allOf(isNodeType("Identifier"),
470
478
  /**
471
479
  * Checks if a node is a CallExpression calling the expected context method.
472
480
  */
473
- const isExpectedMethodCall = ({ ctxName, idName, methodName, requiresIdentifier }) => (node) => {
481
+ const isExpectedMethodCall = ({ ctxName, idName, methodName, requiresIdentifier }, identifierFirst = false) => (node) => {
474
482
  if (!isNodeType("CallExpression")(node) || !hasMemberExpressionCallee(node) || !isIdentifierWithName(ctxName)(node.callee.object) || !isIdentifierWithName(methodName)(node.callee.property)) return false;
475
483
  if (!requiresIdentifier) return isEmpty(node.arguments);
484
+ if (identifierFirst) return node.arguments.length > 0 && isIdentifierWithName(idName)(node.arguments[0]);
476
485
  return allOf(negate(isEmpty), some(isIdentifierWithName(idName)))(node.arguments);
477
486
  };
487
+ /** Accepts an inline compatible ID built from the matching portable URI. */
488
+ const isCompatiblePortableMethodCall = (context, portableGetter) => (node) => isNodeType("CallExpression")(node) && isIdentifierWithName("toCompatibleEf61Id")(node.callee) && node.arguments.length > 0 && isExpectedMethodCall({
489
+ ...context,
490
+ methodName: portableGetter
491
+ }, true)(node.arguments[0]);
478
492
  /**
479
493
  * Extracts parameter names from a function.
480
494
  */
@@ -503,7 +517,10 @@ function createMismatchRule(config, describe) {
503
517
  requiresIdentifier: config.requiresIdentifier
504
518
  };
505
519
  if (!createPropertySearcher(createPropertyChecker(Boolean)(config.path))(dispatcherArg.body)) return;
506
- if (!createPropertySearcher(createPropertyChecker(isExpectedMethodCall(methodCallContext))(config.path))(dispatcherArg.body)) context.report({
520
+ if (!createPropertySearcher(createPropertyChecker((value) => isExpectedMethodCall(methodCallContext)(value) || config.portableGetter != null && (isExpectedMethodCall({
521
+ ...methodCallContext,
522
+ methodName: config.portableGetter
523
+ }, true)(value) || isCompatiblePortableMethodCall(methodCallContext, config.portableGetter)(value)))(config.path))(dispatcherArg.body)) context.report({
507
524
  node: dispatcherArg,
508
525
  ...describe(methodCallContext)
509
526
  });
@@ -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.2190+be3a8be0";
4
+ var version = "2.4.0-dev.2200+e588a43c";
5
5
  //#endregion
6
6
  //#region src/lib/const.ts
7
7
  /**
@@ -14,6 +14,7 @@ const properties = {
14
14
  name: "id",
15
15
  path: ["id"],
16
16
  getter: "getActorUri",
17
+ portableGetter: "getPortableActorUri",
17
18
  setter: "setActorDispatcher",
18
19
  requiresIdentifier: true
19
20
  },
@@ -21,6 +22,7 @@ const properties = {
21
22
  name: "following",
22
23
  path: ["following"],
23
24
  getter: "getFollowingUri",
25
+ portableGetter: "getPortableFollowingUri",
24
26
  setter: "setFollowingDispatcher",
25
27
  requiresIdentifier: true
26
28
  },
@@ -28,6 +30,7 @@ const properties = {
28
30
  name: "followers",
29
31
  path: ["followers"],
30
32
  getter: "getFollowersUri",
33
+ portableGetter: "getPortableFollowersUri",
31
34
  setter: "setFollowersDispatcher",
32
35
  requiresIdentifier: true
33
36
  },
@@ -35,6 +38,7 @@ const properties = {
35
38
  name: "outbox",
36
39
  path: ["outbox"],
37
40
  getter: "getOutboxUri",
41
+ portableGetter: "getPortableOutboxUri",
38
42
  setter: "setOutboxDispatcher",
39
43
  requiresIdentifier: true
40
44
  },
@@ -42,6 +46,7 @@ const properties = {
42
46
  name: "inbox",
43
47
  path: ["inbox"],
44
48
  getter: "getInboxUri",
49
+ portableGetter: "getPortableInboxUri",
45
50
  setter: "setInboxListeners",
46
51
  requiresIdentifier: true
47
52
  },
@@ -49,6 +54,7 @@ const properties = {
49
54
  name: "liked",
50
55
  path: ["liked"],
51
56
  getter: "getLikedUri",
57
+ portableGetter: "getPortableLikedUri",
52
58
  setter: "setLikedDispatcher",
53
59
  requiresIdentifier: true
54
60
  },
@@ -56,6 +62,7 @@ const properties = {
56
62
  name: "featured",
57
63
  path: ["featured"],
58
64
  getter: "getFeaturedUri",
65
+ portableGetter: "getPortableFeaturedUri",
59
66
  setter: "setFeaturedDispatcher",
60
67
  requiresIdentifier: true
61
68
  },
@@ -63,6 +70,7 @@ const properties = {
63
70
  name: "featuredTags",
64
71
  path: ["featuredTags"],
65
72
  getter: "getFeaturedTagsUri",
73
+ portableGetter: "getPortableFeaturedTagsUri",
66
74
  setter: "setFeaturedTagsDispatcher",
67
75
  requiresIdentifier: true
68
76
  },
@@ -470,11 +478,17 @@ const isIdentifierWithName = (name) => (node) => allOf(isNodeType("Identifier"),
470
478
  /**
471
479
  * Checks if a node is a CallExpression calling the expected context method.
472
480
  */
473
- const isExpectedMethodCall = ({ ctxName, idName, methodName, requiresIdentifier }) => (node) => {
481
+ const isExpectedMethodCall = ({ ctxName, idName, methodName, requiresIdentifier }, identifierFirst = false) => (node) => {
474
482
  if (!isNodeType("CallExpression")(node) || !hasMemberExpressionCallee(node) || !isIdentifierWithName(ctxName)(node.callee.object) || !isIdentifierWithName(methodName)(node.callee.property)) return false;
475
483
  if (!requiresIdentifier) return (0, _fxts_core.isEmpty)(node.arguments);
484
+ if (identifierFirst) return node.arguments.length > 0 && isIdentifierWithName(idName)(node.arguments[0]);
476
485
  return allOf((0, _fxts_core.negate)(_fxts_core.isEmpty), (0, _fxts_core.some)(isIdentifierWithName(idName)))(node.arguments);
477
486
  };
487
+ /** Accepts an inline compatible ID built from the matching portable URI. */
488
+ const isCompatiblePortableMethodCall = (context, portableGetter) => (node) => isNodeType("CallExpression")(node) && isIdentifierWithName("toCompatibleEf61Id")(node.callee) && node.arguments.length > 0 && isExpectedMethodCall({
489
+ ...context,
490
+ methodName: portableGetter
491
+ }, true)(node.arguments[0]);
478
492
  /**
479
493
  * Extracts parameter names from a function.
480
494
  */
@@ -503,7 +517,10 @@ function createMismatchRule(config, describe) {
503
517
  requiresIdentifier: config.requiresIdentifier
504
518
  };
505
519
  if (!createPropertySearcher(createPropertyChecker(Boolean)(config.path))(dispatcherArg.body)) return;
506
- if (!createPropertySearcher(createPropertyChecker(isExpectedMethodCall(methodCallContext))(config.path))(dispatcherArg.body)) context.report({
520
+ if (!createPropertySearcher(createPropertyChecker((value) => isExpectedMethodCall(methodCallContext)(value) || config.portableGetter != null && (isExpectedMethodCall({
521
+ ...methodCallContext,
522
+ methodName: config.portableGetter
523
+ }, true)(value) || isCompatiblePortableMethodCall(methodCallContext, config.portableGetter)(value)))(config.path))(dispatcherArg.body)) context.report({
507
524
  node: dispatcherArg,
508
525
  ...describe(methodCallContext)
509
526
  });
package/dist/oxlint.cjs CHANGED
@@ -1,4 +1,4 @@
1
- const require_outbox_listener_delivery_required = require("./outbox-listener-delivery-required-DYdl7PTJ.cjs");
1
+ const require_outbox_listener_delivery_required = require("./outbox-listener-delivery-required-C_hP9Cqy.cjs");
2
2
  //#region src/oxlint.ts
3
3
  const rules = {
4
4
  [require_outbox_listener_delivery_required.RULE_IDS.actorIdMismatch]: require_outbox_listener_delivery_required.eslint$18,
package/dist/oxlint.js CHANGED
@@ -1,4 +1,4 @@
1
- import { A as name, C as eslint$5, D as eslint$11, E as eslint$10, O as eslint$21, S as eslint$4, T as eslint$13, _ as eslint$15, a as eslint$23, b as eslint$2, c as eslint$16, d as eslint$22, f as eslint$6, g as eslint$14, h as eslint$9, i as eslint$27, j as version, k as RULE_IDS, l as eslint$17, m as eslint$8, n as eslint$25, o as eslint$18, p as eslint$7, r as eslint$26, s as eslint$19, t as eslint$24, u as eslint$20, v as eslint$1, w as eslint$12, x as eslint$3, y as eslint } from "./outbox-listener-delivery-required-CUn9pnIN.js";
1
+ import { A as name, C as eslint$5, D as eslint$11, E as eslint$10, O as eslint$21, S as eslint$4, T as eslint$13, _ as eslint$15, a as eslint$23, b as eslint$2, c as eslint$16, d as eslint$22, f as eslint$6, g as eslint$14, h as eslint$9, i as eslint$27, j as version, k as RULE_IDS, l as eslint$17, m as eslint$8, n as eslint$25, o as eslint$18, p as eslint$7, r as eslint$26, s as eslint$19, t as eslint$24, u as eslint$20, v as eslint$1, w as eslint$12, x as eslint$3, y as eslint } from "./outbox-listener-delivery-required-BqLlqa_d.js";
2
2
  //#region src/oxlint.ts
3
3
  const rules = {
4
4
  [RULE_IDS.actorIdMismatch]: eslint,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fedify/lint",
3
- "version": "2.4.0-dev.2190+be3a8be0",
3
+ "version": "2.4.0-dev.2200+e588a43c",
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.2190+be3a8be0"
54
+ "@fedify/fedify": "^2.4.0-dev.2200+e588a43c"
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.2190+be3a8be0"
74
+ "@fedify/vocab": "2.4.0-dev.2200+e588a43c"
75
75
  },
76
76
  "scripts": {
77
77
  "build:self": "tsdown",