@medusajs/eslint-plugin 2.21.0 → 2.21.1-preview-20260917150924

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.
@@ -1 +1 @@
1
- {"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../../../src/rules/link-create-keys-modules-enum/rule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAsClE,eAAO,MAAM,IAAI;;CAkKf,CAAA;AAEF,eAAe,IAAI,CAAA"}
1
+ {"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../../../src/rules/link-create-keys-modules-enum/rule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAuClE,eAAO,MAAM,IAAI;;CA+Kf,CAAA;AAEF,eAAe,IAAI,CAAA"}
@@ -4,6 +4,7 @@ exports.rule = void 0;
4
4
  const utils_1 = require("@typescript-eslint/utils");
5
5
  const create_rule_1 = require("../../create-rule");
6
6
  const constants_1 = require("../../constants");
7
+ const link_1 = require("../../util/link");
7
8
  const LINK_METHODS = new Set(["create", "dismiss", "delete", "restore"]);
8
9
  const REMOTE_LINK_STEPS = new Set([
9
10
  "createRemoteLinkStep",
@@ -41,12 +42,16 @@ exports.rule = (0, create_rule_1.createRule)({
41
42
  create(context) {
42
43
  const modulesLocalNames = new Set();
43
44
  const stepLocalNames = new Set();
45
+ const linkLocalNames = new Set();
44
46
  let frameworkUtilsImportNode = null;
45
47
  function isLinkMethodCall(callee) {
46
- return (callee.type === utils_1.AST_NODE_TYPES.MemberExpression &&
47
- !callee.computed &&
48
- callee.property.type === utils_1.AST_NODE_TYPES.Identifier &&
49
- LINK_METHODS.has(callee.property.name));
48
+ if (callee.type !== utils_1.AST_NODE_TYPES.MemberExpression ||
49
+ callee.computed ||
50
+ callee.property.type !== utils_1.AST_NODE_TYPES.Identifier ||
51
+ !LINK_METHODS.has(callee.property.name)) {
52
+ return false;
53
+ }
54
+ return (0, link_1.isLinkReceiver)(callee.object, linkLocalNames);
50
55
  }
51
56
  function isStepCall(callee) {
52
57
  return (callee.type === utils_1.AST_NODE_TYPES.Identifier &&
@@ -148,6 +153,12 @@ exports.rule = (0, create_rule_1.createRule)({
148
153
  }
149
154
  }
150
155
  },
156
+ VariableDeclarator(node) {
157
+ (0, link_1.trackLinkBinding)(node, linkLocalNames);
158
+ },
159
+ PropertyDefinition(node) {
160
+ (0, link_1.trackLinkBinding)(node, linkLocalNames);
161
+ },
151
162
  CallExpression(node) {
152
163
  if (isLinkMethodCall(node.callee) || isStepCall(node.callee)) {
153
164
  const arg = node.arguments[0];
@@ -1 +1 @@
1
- {"version":3,"file":"rule.js","sourceRoot":"","sources":["../../../src/rules/link-create-keys-modules-enum/rule.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rule.js","sourceRoot":"","sources":["../../../src/rules/link-create-keys-modules-enum/rule.ts"],"names":[],"mappings":";;;AACA,oDAAyD;AACzD,mDAA8C;AAC9C,+CAIwB;AACxB,0CAAkE;AAIlE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAA;AAExE,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,sBAAsB;IACtB,uBAAuB;IACvB,sBAAsB;IACtB,uBAAuB;CACxB,CAAC,CAAA;AAEF,SAAS,YAAY,CACnB,IAAuB;IAEvB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,sBAAc,CAAC,UAAU,EAAE,CAAC;QAChD,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;IACnE,CAAC;IACD,IACE,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,sBAAc,CAAC,OAAO;QACxC,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,QAAQ,EAClC,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;IACnE,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAEY,QAAA,IAAI,GAAG,IAAA,wBAAU,EAAiB;IAC7C,IAAI,EAAE,+BAA+B;IACrC,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EACT,qGAAqG;SACxG;QACD,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE;YACR,aAAa,EACX,iEAAiE;SACpE;QACD,MAAM,EAAE,EAAE;KACX;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAA;QAC3C,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAA;QACxC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAA;QACxC,IAAI,wBAAwB,GAAsC,IAAI,CAAA;QAEtE,SAAS,gBAAgB,CAAC,MAA2B;YACnD,IACE,MAAM,CAAC,IAAI,KAAK,sBAAc,CAAC,gBAAgB;gBAC/C,MAAM,CAAC,QAAQ;gBACf,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,sBAAc,CAAC,UAAU;gBAClD,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EACvC,CAAC;gBACD,OAAO,KAAK,CAAA;YACd,CAAC;YAED,OAAO,IAAA,qBAAc,EAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;QACtD,CAAC;QAED,SAAS,UAAU,CAAC,MAA2B;YAC7C,OAAO,CACL,MAAM,CAAC,IAAI,KAAK,sBAAc,CAAC,UAAU;gBACzC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAChC,CAAA;QACH,CAAC;QAED,SAAS,WAAW,CAAC,GAA8B;YACjD,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;gBAClC,IAAI,IAAI,CAAC,IAAI,KAAK,sBAAc,CAAC,QAAQ,EAAE,CAAC;oBAC1C,SAAQ;gBACV,CAAC;gBACD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;gBAC9B,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,SAAQ;gBACV,CAAC;gBACD,MAAM,UAAU,GAAG,4BAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;gBAC9C,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,SAAQ;gBACV,CAAC;gBAED,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,SAAS,EAAE,eAAe;oBAC1B,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE;oBACpC,GAAG,CAAC,KAAyB;wBAC3B,MAAM,KAAK,GAAuB,EAAE,CAAA;wBACpC,MAAM,WAAW,GACf,iBAAiB,CAAC,IAAI,GAAG,CAAC;4BACxB,CAAC,CAAE,iBAAiB,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAgB;4BACrD,CAAC,CAAC,wBAAO,CAAA;wBACb,MAAM,WAAW,GAAG,IAAI,WAAW,IAAI,UAAU,GAAG,CAAA;wBAEpD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;4BACnB,mDAAmD;4BACnD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;4BACxD,KAAK,CAAC,IAAI,CACR,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,WAAW,KAAK,SAAS,EAAE,CAAC,CACxD,CAAA;wBACH,CAAC;6BAAM,CAAC;4BACN,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAA;wBACtD,CAAC;wBAED,IAAI,iBAAiB,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;4BACjC,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAA;4BACzC,IAAI,CAAC,SAAS,EAAE,CAAC;gCACf,OAAO,IAAI,CAAA;4BACb,CAAC;4BACD,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;4BACrB,iBAAiB,CAAC,GAAG,CAAC,wBAAO,CAAC,CAAA;wBAChC,CAAC;wBAED,OAAO,KAAK,CAAA;oBACd,CAAC;iBACF,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAED,SAAS,gBAAgB,CACvB,KAAyB;YAEzB,IAAI,wBAAwB,EAAE,CAAC;gBAC7B,MAAM,UAAU,GAAG,wBAAwB,CAAC,UAAU,CAAC,MAAM,CAC3D,CAAC,CAAC,EAAiC,EAAE,CACnC,CAAC,CAAC,IAAI,KAAK,sBAAc,CAAC,eAAe,CAC5C,CAAA;gBACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC5B,OAAO,IAAI,CAAA;gBACb,CAAC;gBACD,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;gBAC9C,OAAO,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,wBAAO,EAAE,CAAC,CAAA;YACpD,CAAC;YACD,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAA;YACtC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAC7B,MAAM,UAAU,GAAG,YAAY,wBAAO,YAAY,kCAAsB,KAAK,CAAA;YAC7E,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,CAAA;YACvD,CAAC;YACD,OAAO,KAAK,CAAC,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;QAClD,CAAC;QAED,SAAS,aAAa,CAAC,GAAoC;YACzD,IAAI,GAAG,CAAC,IAAI,KAAK,sBAAc,CAAC,gBAAgB,EAAE,CAAC;gBACjD,WAAW,CAAC,GAAG,CAAC,CAAA;gBAChB,OAAM;YACR,CAAC;YACD,IAAI,GAAG,CAAC,IAAI,KAAK,sBAAc,CAAC,eAAe,EAAE,CAAC;gBAChD,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;oBAC9B,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,KAAK,sBAAc,CAAC,gBAAgB,EAAE,CAAC;wBACtD,WAAW,CAAC,EAAE,CAAC,CAAA;oBACjB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO;YACL,iBAAiB,CAAC,IAAI;gBACpB,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,kCAAsB,EAAE,CAAC;oBACjD,wBAAwB,GAAG,IAAI,CAAA;oBAC/B,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;wBACxC,IACE,SAAS,CAAC,IAAI,KAAK,sBAAc,CAAC,eAAe;4BACjD,SAAS,CAAC,QAAQ,CAAC,IAAI,KAAK,sBAAc,CAAC,UAAU;4BACrD,SAAS,CAAC,QAAQ,CAAC,IAAI,KAAK,wBAAO,EACnC,CAAC;4BACD,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;wBAC7C,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,6BAA6B,EAAE,CAAC;oBACxD,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;wBACxC,IACE,SAAS,CAAC,IAAI,KAAK,sBAAc,CAAC,eAAe;4BACjD,SAAS,CAAC,QAAQ,CAAC,IAAI,KAAK,sBAAc,CAAC,UAAU;4BACrD,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAC9C,CAAC;4BACD,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;wBAC1C,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,kBAAkB,CAAC,IAAI;gBACrB,IAAA,uBAAgB,EAAC,IAAI,EAAE,cAAc,CAAC,CAAA;YACxC,CAAC;YAED,kBAAkB,CAAC,IAAI;gBACrB,IAAA,uBAAgB,EAAC,IAAI,EAAE,cAAc,CAAC,CAAA;YACxC,CAAC;YAED,cAAc,CAAC,IAAI;gBACjB,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;oBAC7B,IAAI,GAAG,EAAE,CAAC;wBACR,aAAa,CAAC,GAAG,CAAC,CAAA;oBACpB,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAA;IACH,CAAC;CACF,CAAC,CAAA;AAEF,kBAAe,YAAI,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../../../src/rules/link-uses-linkable-properties/rule.ts"],"names":[],"mappings":"AAgIA,eAAO,MAAM,IAAI;;CA6Df,CAAA;AAEF,eAAe,IAAI,CAAA"}
1
+ {"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../../../src/rules/link-uses-linkable-properties/rule.ts"],"names":[],"mappings":"AA4FA,eAAO,MAAM,IAAI;;CA4Cf,CAAA;AAEF,eAAe,IAAI,CAAA"}
@@ -2,37 +2,19 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.rule = void 0;
4
4
  const create_rule_1 = require("../../create-rule");
5
- const constants_1 = require("../../constants");
6
- const DEFINE_LINK = "defineLink";
7
- function isLinkableMemberChain(node) {
8
- // Match `<X>.linkable.<y>` (any depth on `<X>`, e.g. `ProductModule.linkable.product`
9
- // or `foo.bar.linkable.product`). The outer node is a MemberExpression whose
10
- // `object` is itself a non-computed MemberExpression with `property.name === "linkable"`.
11
- if (node.type !== "MemberExpression" || node.computed) {
12
- return false;
13
- }
14
- const object = node.object;
15
- if (object.type !== "MemberExpression" || object.computed) {
16
- return false;
17
- }
18
- if (object.property.type !== "Identifier" ||
19
- object.property.name !== "linkable") {
20
- return false;
21
- }
22
- return true;
23
- }
5
+ const link_1 = require("../../util/link");
24
6
  function isLinkableMemberChainOrId(node) {
25
7
  // Match `<X>.linkable.<y>` or `<X>.linkable.<y>.id`. The `.id` form is used
26
8
  // when linking to a data model by its id (e.g. linking to draft orders via
27
9
  // `OrderModule.linkable.order.id`).
28
- if (isLinkableMemberChain(node)) {
10
+ if ((0, link_1.isLinkableMemberChain)(node)) {
29
11
  return true;
30
12
  }
31
13
  if (node.type === "MemberExpression" &&
32
14
  !node.computed &&
33
15
  node.property.type === "Identifier" &&
34
16
  node.property.name === "id" &&
35
- isLinkableMemberChain(node.object)) {
17
+ (0, link_1.isLinkableMemberChain)(node.object)) {
36
18
  return true;
37
19
  }
38
20
  return false;
@@ -53,31 +35,15 @@ function hasOwnPropertyNamed(node, name) {
53
35
  }
54
36
  return false;
55
37
  }
56
- function hasLinkableInChain(node) {
57
- // Walks any MemberExpression chain (e.g. `BlogModule.linkable.post.id`) and
58
- // returns true if any segment is a non-computed `.linkable` access. Used to
59
- // recognize spread arguments of the inverse read-only link form
60
- // (`...BlogModule.linkable.post.id`).
61
- let current = node;
62
- while (current && current.type === "MemberExpression") {
63
- if (!current.computed &&
64
- current.property.type === "Identifier" &&
65
- current.property.name === "linkable") {
66
- return true;
67
- }
68
- current = current.object;
69
- }
70
- return false;
71
- }
72
38
  function isValidLinkParticipant(node) {
73
- if (isLinkableMemberChain(node)) {
39
+ if ((0, link_1.isLinkableMemberChain)(node)) {
74
40
  return true;
75
41
  }
76
42
  if (node.type === "ObjectExpression") {
77
43
  for (const prop of node.properties) {
78
44
  if (prop.type === "SpreadElement") {
79
45
  // Inverse read-only links spread `<X>.linkable.<y>.id` (or similar).
80
- if (hasLinkableInChain(prop.argument)) {
46
+ if ((0, link_1.hasLinkableInChain)(prop.argument)) {
81
47
  return true;
82
48
  }
83
49
  continue;
@@ -123,23 +89,10 @@ exports.rule = (0, create_rule_1.createRule)({
123
89
  const defineLinkLocalNames = new Set();
124
90
  return {
125
91
  ImportDeclaration(node) {
126
- if (node.source.value !== constants_1.FRAMEWORK_UTILS_SOURCE) {
127
- return;
128
- }
129
- for (const specifier of node.specifiers) {
130
- if (specifier.type === "ImportSpecifier" &&
131
- specifier.imported.type === "Identifier" &&
132
- specifier.imported.name === DEFINE_LINK) {
133
- defineLinkLocalNames.add(specifier.local.name);
134
- }
135
- }
92
+ (0, link_1.trackDefineLinkImports)(node, defineLinkLocalNames);
136
93
  },
137
94
  CallExpression(node) {
138
- if (defineLinkLocalNames.size === 0) {
139
- return;
140
- }
141
- if (node.callee.type !== "Identifier" ||
142
- !defineLinkLocalNames.has(node.callee.name)) {
95
+ if (!(0, link_1.isDefineLinkCall)(node, defineLinkLocalNames)) {
143
96
  return;
144
97
  }
145
98
  // `defineLink(arg1, arg2, options?)` — only the first two args are
@@ -1 +1 @@
1
- {"version":3,"file":"rule.js","sourceRoot":"","sources":["../../../src/rules/link-uses-linkable-properties/rule.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rule.js","sourceRoot":"","sources":["../../../src/rules/link-uses-linkable-properties/rule.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../../../src/rules/read-only-link-requires-field/rule.ts"],"names":[],"mappings":"AAKA,KAAK,UAAU,GAAG,cAAc,GAAG,mBAAmB,CAAA;AA+CtD,eAAO,MAAM,IAAI;;CA4Ef,CAAA;AAEF,eAAe,IAAI,CAAA"}
1
+ {"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../../../src/rules/read-only-link-requires-field/rule.ts"],"names":[],"mappings":"AASA,KAAK,UAAU,GAAG,cAAc,GAAG,mBAAmB,CAAA;AAkCtD,eAAO,MAAM,IAAI;;CA2Df,CAAA;AAEF,eAAe,IAAI,CAAA"}
@@ -2,9 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.rule = void 0;
4
4
  const create_rule_1 = require("../../create-rule");
5
- const constants_1 = require("../../constants");
6
5
  const ast_1 = require("../../util/ast");
7
- const DEFINE_LINK = "defineLink";
6
+ const link_1 = require("../../util/link");
8
7
  function isReadOnlyTrue(options) {
9
8
  if (options.type !== "ObjectExpression") {
10
9
  return false;
@@ -24,16 +23,7 @@ function isLinkableIdSpread(node) {
24
23
  if (node.property.type !== "Identifier" || node.property.name !== "id") {
25
24
  return false;
26
25
  }
27
- let current = node.object;
28
- while (current.type === "MemberExpression") {
29
- if (!current.computed &&
30
- current.property.type === "Identifier" &&
31
- current.property.name === "linkable") {
32
- return true;
33
- }
34
- current = current.object;
35
- }
36
- return false;
26
+ return (0, link_1.hasLinkableInChain)(node.object);
37
27
  }
38
28
  function hasInverseLinkableSpread(obj) {
39
29
  for (const prop of obj.properties) {
@@ -61,23 +51,10 @@ exports.rule = (0, create_rule_1.createRule)({
61
51
  const defineLinkLocalNames = new Set();
62
52
  return {
63
53
  ImportDeclaration(node) {
64
- if (node.source.value !== constants_1.FRAMEWORK_UTILS_SOURCE) {
65
- return;
66
- }
67
- for (const specifier of node.specifiers) {
68
- if (specifier.type === "ImportSpecifier" &&
69
- specifier.imported.type === "Identifier" &&
70
- specifier.imported.name === DEFINE_LINK) {
71
- defineLinkLocalNames.add(specifier.local.name);
72
- }
73
- }
54
+ (0, link_1.trackDefineLinkImports)(node, defineLinkLocalNames);
74
55
  },
75
56
  CallExpression(node) {
76
- if (defineLinkLocalNames.size === 0) {
77
- return;
78
- }
79
- if (node.callee.type !== "Identifier" ||
80
- !defineLinkLocalNames.has(node.callee.name)) {
57
+ if (!(0, link_1.isDefineLinkCall)(node, defineLinkLocalNames)) {
81
58
  return;
82
59
  }
83
60
  const [arg1, arg2, options] = node.arguments;
@@ -1 +1 @@
1
- {"version":3,"file":"rule.js","sourceRoot":"","sources":["../../../src/rules/read-only-link-requires-field/rule.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rule.js","sourceRoot":"","sources":["../../../src/rules/read-only-link-requires-field/rule.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"root":["../src/constants.ts","../src/create-rule.ts","../src/index.ts","../src/configs/modules.ts","../src/configs/recommended.ts","../src/configs/shared.ts","../src/configs/strict.ts","../src/rules/index.ts","../src/rules/admin-component-must-be-arrow-function/index.ts","../src/rules/admin-component-must-be-arrow-function/rule.ts","../src/rules/admin-env-vars-import-meta/index.ts","../src/rules/admin-env-vars-import-meta/rule.ts","../src/rules/admin-no-medusa-utils-import/index.ts","../src/rules/admin-no-medusa-utils-import/rule.ts","../src/rules/allow-fields-must-be-global-middleware/index.ts","../src/rules/allow-fields-must-be-global-middleware/rule.ts","../src/rules/authenticate-flag-name-and-type/index.ts","../src/rules/authenticate-flag-name-and-type/rule.ts","../src/rules/data-model-table-name-snake-case/index.ts","../src/rules/data-model-table-name-snake-case/rule.ts","../src/rules/import-from-framework-not-internal/index.ts","../src/rules/import-from-framework-not-internal/rule.ts","../src/rules/link-create-keys-modules-enum/index.ts","../src/rules/link-create-keys-modules-enum/rule.ts","../src/rules/link-no-cross-module-relationship/index.ts","../src/rules/link-no-cross-module-relationship/rule.ts","../src/rules/link-uses-linkable-properties/index.ts","../src/rules/link-uses-linkable-properties/rule.ts","../src/rules/loader-must-be-exported-in-module-definition/index.ts","../src/rules/loader-must-be-exported-in-module-definition/rule.ts","../src/rules/medusa-context-on-context-param/index.ts","../src/rules/medusa-context-on-context-param/rule.ts","../src/rules/middleware-must-call-next/index.ts","../src/rules/middleware-must-call-next/rule.ts","../src/rules/middlewares-file-location-and-name/index.ts","../src/rules/middlewares-file-location-and-name/rule.ts","../src/rules/module-name-snake-case/index.ts","../src/rules/module-name-snake-case/rule.ts","../src/rules/no-async-workflow-constructor/index.ts","../src/rules/no-async-workflow-constructor/rule.ts","../src/rules/no-conditional-expressions-in-workflow/index.ts","../src/rules/no-conditional-expressions-in-workflow/rule.ts","../src/rules/no-config-on-dynamic-ui-route/index.ts","../src/rules/no-config-on-dynamic-ui-route/rule.ts","../src/rules/no-console-log-in-workflow/index.ts","../src/rules/no-console-log-in-workflow/rule.ts","../src/rules/no-deprecated-remote-query-config/index.ts","../src/rules/no-deprecated-remote-query-config/rule.ts","../src/rules/no-direct-variable-mutation-in-workflow/index.ts","../src/rules/no-direct-variable-mutation-in-workflow/rule.ts","../src/rules/no-duplicate-step-id-in-workflow/index.ts","../src/rules/no-duplicate-step-id-in-workflow/rule.ts","../src/rules/no-if-in-workflow-constructor/index.ts","../src/rules/no-if-in-workflow-constructor/rule.ts","../src/rules/no-loops-in-workflow/index.ts","../src/rules/no-loops-in-workflow/rule.ts","../src/rules/no-mikroorm-direct-import/index.ts","../src/rules/no-mikroorm-direct-import/rule.ts","../src/rules/no-nested-when-in-workflow/index.ts","../src/rules/no-nested-when-in-workflow/rule.ts","../src/rules/no-new-date-in-workflow/index.ts","../src/rules/no-new-date-in-workflow/rule.ts","../src/rules/no-non-serializable-step-return/index.ts","../src/rules/no-non-serializable-step-return/rule.ts","../src/rules/no-reserved-default-properties-in-model/index.ts","../src/rules/no-reserved-default-properties-in-model/rule.ts","../src/rules/no-service-mutations-in-api-route/index.ts","../src/rules/no-service-mutations-in-api-route/rule.ts","../src/rules/no-spread-in-workflow/index.ts","../src/rules/no-spread-in-workflow/rule.ts","../src/rules/no-throw-in-transform/index.ts","../src/rules/no-throw-in-transform/rule.ts","../src/rules/no-throw-in-workflow-constructor/index.ts","../src/rules/no-throw-in-workflow-constructor/rule.ts","../src/rules/no-trailing-slash-in-route-matcher/index.ts","../src/rules/no-trailing-slash-in-route-matcher/rule.ts","../src/rules/no-try-catch-in-workflow/index.ts","../src/rules/no-try-catch-in-workflow/rule.ts","../src/rules/no-wildcard-with-specific-fields/index.ts","../src/rules/no-wildcard-with-specific-fields/rule.ts","../src/rules/no-workflow-call-without-container/index.ts","../src/rules/no-workflow-call-without-container/rule.ts","../src/rules/prefer-allow-fields-middleware/index.ts","../src/rules/prefer-allow-fields-middleware/rule.ts","../src/rules/prefer-container-registration-keys/index.ts","../src/rules/prefer-container-registration-keys/rule.ts","../src/rules/prefer-link-over-remote-link/index.ts","../src/rules/prefer-link-over-remote-link/rule.ts","../src/rules/prefer-modules-enum/index.ts","../src/rules/prefer-modules-enum/rule.ts","../src/rules/prefer-workflow-event-over-module-event/index.ts","../src/rules/prefer-workflow-event-over-module-event/rule.ts","../src/rules/prices-in-major-units/index.ts","../src/rules/prices-in-major-units/rule.ts","../src/rules/primary-key-required/index.ts","../src/rules/primary-key-required/rule.ts","../src/rules/read-only-link-requires-field/index.ts","../src/rules/read-only-link-requires-field/rule.ts","../src/rules/route-dynamic-folder-syntax/index.ts","../src/rules/route-dynamic-folder-syntax/rule.ts","../src/rules/route-file-naming/index.ts","../src/rules/route-file-naming/rule.ts","../src/rules/route-handler-exports-uppercase/index.ts","../src/rules/route-handler-exports-uppercase/rule.ts","../src/rules/route-params-must-be-defined/index.ts","../src/rules/route-params-must-be-defined/rule.ts","../src/rules/scheduled-job-config-required/index.ts","../src/rules/scheduled-job-config-required/rule.ts","../src/rules/scheduled-job-default-export-async/index.ts","../src/rules/scheduled-job-default-export-async/rule.ts","../src/rules/scheduled-job-default-export-required/index.ts","../src/rules/scheduled-job-default-export-required/rule.ts","../src/rules/scheduled-job-name-unique/index.ts","../src/rules/scheduled-job-name-unique/rule.ts","../src/rules/scheduled-job-schedule-valid-cron/index.ts","../src/rules/scheduled-job-schedule-valid-cron/rule.ts","../src/rules/service-constructor-must-call-super/index.ts","../src/rules/service-constructor-must-call-super/rule.ts","../src/rules/service-methods-must-be-async/index.ts","../src/rules/service-methods-must-be-async/rule.ts","../src/rules/step-id-kebab-case/index.ts","../src/rules/step-id-kebab-case/rule.ts","../src/rules/step-must-return-step-response/index.ts","../src/rules/step-must-return-step-response/rule.ts","../src/rules/subscriber-config-export-required/index.ts","../src/rules/subscriber-config-export-required/rule.ts","../src/rules/subscriber-default-export-must-be-async/index.ts","../src/rules/subscriber-default-export-must-be-async/rule.ts","../src/rules/subscriber-default-export-required/index.ts","../src/rules/subscriber-default-export-required/rule.ts","../src/rules/ui-route-config-via-define-route-config/index.ts","../src/rules/ui-route-config-via-define-route-config/rule.ts","../src/rules/ui-route-file-name-page-tsx/index.ts","../src/rules/ui-route-file-name-page-tsx/rule.ts","../src/rules/ui-route-must-have-default-export/index.ts","../src/rules/ui-route-must-have-default-export/rule.ts","../src/rules/use-inject-manager-on-public-methods/index.ts","../src/rules/use-inject-manager-on-public-methods/rule.ts","../src/rules/use-medusa-error-not-generic-error/index.ts","../src/rules/use-medusa-error-not-generic-error/rule.ts","../src/rules/use-validated-body-or-query/index.ts","../src/rules/use-validated-body-or-query/rule.ts","../src/rules/when-block-must-have-name/index.ts","../src/rules/when-block-must-have-name/rule.ts","../src/rules/widget-must-export-config/index.ts","../src/rules/widget-must-export-config/rule.ts","../src/rules/widget-must-have-default-export/index.ts","../src/rules/widget-must-have-default-export/rule.ts","../src/rules/widget-zone-must-be-string-literal/index.ts","../src/rules/widget-zone-must-be-string-literal/rule.ts","../src/rules/workflow-id-matches-export-or-filename/index.ts","../src/rules/workflow-id-matches-export-or-filename/rule.ts","../src/rules/workflow-must-return-workflow-response/index.ts","../src/rules/workflow-must-return-workflow-response/rule.ts","../src/rules/zod-import-source/index.ts","../src/rules/zod-import-source/rule.ts","../src/util/admin-scope.ts","../src/util/api-route.ts","../src/util/ast.ts","../src/util/container.ts","../src/util/filename.ts","../src/util/middlewares.ts","../src/util/service-scope.ts","../src/util/strings.ts","../src/util/workflow-scope.ts"],"version":"5.9.3"}
1
+ {"root":["../src/constants.ts","../src/create-rule.ts","../src/index.ts","../src/configs/modules.ts","../src/configs/recommended.ts","../src/configs/shared.ts","../src/configs/strict.ts","../src/rules/index.ts","../src/rules/admin-component-must-be-arrow-function/index.ts","../src/rules/admin-component-must-be-arrow-function/rule.ts","../src/rules/admin-env-vars-import-meta/index.ts","../src/rules/admin-env-vars-import-meta/rule.ts","../src/rules/admin-no-medusa-utils-import/index.ts","../src/rules/admin-no-medusa-utils-import/rule.ts","../src/rules/allow-fields-must-be-global-middleware/index.ts","../src/rules/allow-fields-must-be-global-middleware/rule.ts","../src/rules/authenticate-flag-name-and-type/index.ts","../src/rules/authenticate-flag-name-and-type/rule.ts","../src/rules/data-model-table-name-snake-case/index.ts","../src/rules/data-model-table-name-snake-case/rule.ts","../src/rules/import-from-framework-not-internal/index.ts","../src/rules/import-from-framework-not-internal/rule.ts","../src/rules/link-create-keys-modules-enum/index.ts","../src/rules/link-create-keys-modules-enum/rule.ts","../src/rules/link-no-cross-module-relationship/index.ts","../src/rules/link-no-cross-module-relationship/rule.ts","../src/rules/link-uses-linkable-properties/index.ts","../src/rules/link-uses-linkable-properties/rule.ts","../src/rules/loader-must-be-exported-in-module-definition/index.ts","../src/rules/loader-must-be-exported-in-module-definition/rule.ts","../src/rules/medusa-context-on-context-param/index.ts","../src/rules/medusa-context-on-context-param/rule.ts","../src/rules/middleware-must-call-next/index.ts","../src/rules/middleware-must-call-next/rule.ts","../src/rules/middlewares-file-location-and-name/index.ts","../src/rules/middlewares-file-location-and-name/rule.ts","../src/rules/module-name-snake-case/index.ts","../src/rules/module-name-snake-case/rule.ts","../src/rules/no-async-workflow-constructor/index.ts","../src/rules/no-async-workflow-constructor/rule.ts","../src/rules/no-conditional-expressions-in-workflow/index.ts","../src/rules/no-conditional-expressions-in-workflow/rule.ts","../src/rules/no-config-on-dynamic-ui-route/index.ts","../src/rules/no-config-on-dynamic-ui-route/rule.ts","../src/rules/no-console-log-in-workflow/index.ts","../src/rules/no-console-log-in-workflow/rule.ts","../src/rules/no-deprecated-remote-query-config/index.ts","../src/rules/no-deprecated-remote-query-config/rule.ts","../src/rules/no-direct-variable-mutation-in-workflow/index.ts","../src/rules/no-direct-variable-mutation-in-workflow/rule.ts","../src/rules/no-duplicate-step-id-in-workflow/index.ts","../src/rules/no-duplicate-step-id-in-workflow/rule.ts","../src/rules/no-if-in-workflow-constructor/index.ts","../src/rules/no-if-in-workflow-constructor/rule.ts","../src/rules/no-loops-in-workflow/index.ts","../src/rules/no-loops-in-workflow/rule.ts","../src/rules/no-mikroorm-direct-import/index.ts","../src/rules/no-mikroorm-direct-import/rule.ts","../src/rules/no-nested-when-in-workflow/index.ts","../src/rules/no-nested-when-in-workflow/rule.ts","../src/rules/no-new-date-in-workflow/index.ts","../src/rules/no-new-date-in-workflow/rule.ts","../src/rules/no-non-serializable-step-return/index.ts","../src/rules/no-non-serializable-step-return/rule.ts","../src/rules/no-reserved-default-properties-in-model/index.ts","../src/rules/no-reserved-default-properties-in-model/rule.ts","../src/rules/no-service-mutations-in-api-route/index.ts","../src/rules/no-service-mutations-in-api-route/rule.ts","../src/rules/no-spread-in-workflow/index.ts","../src/rules/no-spread-in-workflow/rule.ts","../src/rules/no-throw-in-transform/index.ts","../src/rules/no-throw-in-transform/rule.ts","../src/rules/no-throw-in-workflow-constructor/index.ts","../src/rules/no-throw-in-workflow-constructor/rule.ts","../src/rules/no-trailing-slash-in-route-matcher/index.ts","../src/rules/no-trailing-slash-in-route-matcher/rule.ts","../src/rules/no-try-catch-in-workflow/index.ts","../src/rules/no-try-catch-in-workflow/rule.ts","../src/rules/no-wildcard-with-specific-fields/index.ts","../src/rules/no-wildcard-with-specific-fields/rule.ts","../src/rules/no-workflow-call-without-container/index.ts","../src/rules/no-workflow-call-without-container/rule.ts","../src/rules/prefer-allow-fields-middleware/index.ts","../src/rules/prefer-allow-fields-middleware/rule.ts","../src/rules/prefer-container-registration-keys/index.ts","../src/rules/prefer-container-registration-keys/rule.ts","../src/rules/prefer-link-over-remote-link/index.ts","../src/rules/prefer-link-over-remote-link/rule.ts","../src/rules/prefer-modules-enum/index.ts","../src/rules/prefer-modules-enum/rule.ts","../src/rules/prefer-workflow-event-over-module-event/index.ts","../src/rules/prefer-workflow-event-over-module-event/rule.ts","../src/rules/prices-in-major-units/index.ts","../src/rules/prices-in-major-units/rule.ts","../src/rules/primary-key-required/index.ts","../src/rules/primary-key-required/rule.ts","../src/rules/read-only-link-requires-field/index.ts","../src/rules/read-only-link-requires-field/rule.ts","../src/rules/route-dynamic-folder-syntax/index.ts","../src/rules/route-dynamic-folder-syntax/rule.ts","../src/rules/route-file-naming/index.ts","../src/rules/route-file-naming/rule.ts","../src/rules/route-handler-exports-uppercase/index.ts","../src/rules/route-handler-exports-uppercase/rule.ts","../src/rules/route-params-must-be-defined/index.ts","../src/rules/route-params-must-be-defined/rule.ts","../src/rules/scheduled-job-config-required/index.ts","../src/rules/scheduled-job-config-required/rule.ts","../src/rules/scheduled-job-default-export-async/index.ts","../src/rules/scheduled-job-default-export-async/rule.ts","../src/rules/scheduled-job-default-export-required/index.ts","../src/rules/scheduled-job-default-export-required/rule.ts","../src/rules/scheduled-job-name-unique/index.ts","../src/rules/scheduled-job-name-unique/rule.ts","../src/rules/scheduled-job-schedule-valid-cron/index.ts","../src/rules/scheduled-job-schedule-valid-cron/rule.ts","../src/rules/service-constructor-must-call-super/index.ts","../src/rules/service-constructor-must-call-super/rule.ts","../src/rules/service-methods-must-be-async/index.ts","../src/rules/service-methods-must-be-async/rule.ts","../src/rules/step-id-kebab-case/index.ts","../src/rules/step-id-kebab-case/rule.ts","../src/rules/step-must-return-step-response/index.ts","../src/rules/step-must-return-step-response/rule.ts","../src/rules/subscriber-config-export-required/index.ts","../src/rules/subscriber-config-export-required/rule.ts","../src/rules/subscriber-default-export-must-be-async/index.ts","../src/rules/subscriber-default-export-must-be-async/rule.ts","../src/rules/subscriber-default-export-required/index.ts","../src/rules/subscriber-default-export-required/rule.ts","../src/rules/ui-route-config-via-define-route-config/index.ts","../src/rules/ui-route-config-via-define-route-config/rule.ts","../src/rules/ui-route-file-name-page-tsx/index.ts","../src/rules/ui-route-file-name-page-tsx/rule.ts","../src/rules/ui-route-must-have-default-export/index.ts","../src/rules/ui-route-must-have-default-export/rule.ts","../src/rules/use-inject-manager-on-public-methods/index.ts","../src/rules/use-inject-manager-on-public-methods/rule.ts","../src/rules/use-medusa-error-not-generic-error/index.ts","../src/rules/use-medusa-error-not-generic-error/rule.ts","../src/rules/use-validated-body-or-query/index.ts","../src/rules/use-validated-body-or-query/rule.ts","../src/rules/when-block-must-have-name/index.ts","../src/rules/when-block-must-have-name/rule.ts","../src/rules/widget-must-export-config/index.ts","../src/rules/widget-must-export-config/rule.ts","../src/rules/widget-must-have-default-export/index.ts","../src/rules/widget-must-have-default-export/rule.ts","../src/rules/widget-zone-must-be-string-literal/index.ts","../src/rules/widget-zone-must-be-string-literal/rule.ts","../src/rules/workflow-id-matches-export-or-filename/index.ts","../src/rules/workflow-id-matches-export-or-filename/rule.ts","../src/rules/workflow-must-return-workflow-response/index.ts","../src/rules/workflow-must-return-workflow-response/rule.ts","../src/rules/zod-import-source/index.ts","../src/rules/zod-import-source/rule.ts","../src/util/admin-scope.ts","../src/util/api-route.ts","../src/util/ast.ts","../src/util/container.ts","../src/util/filename.ts","../src/util/link.ts","../src/util/middlewares.ts","../src/util/service-scope.ts","../src/util/strings.ts","../src/util/workflow-scope.ts"],"version":"5.9.3"}
@@ -0,0 +1,65 @@
1
+ import type { TSESTree } from "@typescript-eslint/utils";
2
+ export declare const DEFINE_LINK = "defineLink";
3
+ /**
4
+ * Receiver names that identify Medusa's Link service, normalized by
5
+ * {@link normalizeReceiverName} so casing and separators don't matter
6
+ * (`remoteLink`, `remote_link`, and `link_` all collapse into this set).
7
+ */
8
+ export declare const LINK_RECEIVER_NAMES: ReadonlySet<string>;
9
+ /** Type names that identify a binding as Medusa's Link service. */
10
+ export declare const LINK_TYPE_NAMES: ReadonlySet<string>;
11
+ /**
12
+ * `ContainerRegistrationKeys` / `Modules` members that resolve the Link
13
+ * service. `REMOTE_LINK` is the deprecated pre-v2.2.0 key.
14
+ */
15
+ export declare const LINK_RESOLVE_KEYS: ReadonlySet<string>;
16
+ /** String registration keys that resolve the Link service. */
17
+ export declare const LINK_RESOLVE_STRINGS: ReadonlySet<string>;
18
+ /** Lowercases and strips separators so `remote_link` and `remoteLink` match. */
19
+ export declare function normalizeReceiverName(name: string): string;
20
+ /** True when a type annotation names one of {@link LINK_TYPE_NAMES}. */
21
+ export declare function isLinkTypeAnnotation(annotation: TSESTree.TSTypeAnnotation | undefined): boolean;
22
+ /**
23
+ * True when `node` is a container resolution that yields the Link service —
24
+ * `container.resolve(ContainerRegistrationKeys.LINK)`, `resolve(Modules.LINK)`,
25
+ * `resolve<Link>(...)`, or `resolve("link_modules")`. Unwraps `await`.
26
+ */
27
+ export declare function isLinkResolveCall(node: TSESTree.Node | null | undefined): boolean;
28
+ /**
29
+ * Records the local name of a `VariableDeclarator` or `PropertyDefinition`
30
+ * that holds the Link service, recognized either by its type annotation or by
31
+ * a container resolution initializer.
32
+ *
33
+ * Call from the matching visitors; pair with {@link isLinkReceiver}.
34
+ */
35
+ export declare function trackLinkBinding(node: TSESTree.VariableDeclarator | TSESTree.PropertyDefinition, localNames: Set<string>): void;
36
+ /** The name a call's receiver is known by, e.g. `link`, `this.link_`. */
37
+ export declare function getReceiverName(object: TSESTree.Node): string | null;
38
+ /**
39
+ * True when `object` is recognizable as Medusa's Link service — either a name
40
+ * tracked by {@link trackLinkBinding} or one of {@link LINK_RECEIVER_NAMES}.
41
+ *
42
+ * Without this gate a rule matching link method names would also match
43
+ * identically-named methods on unrelated third-party SDKs.
44
+ */
45
+ export declare function isLinkReceiver(object: TSESTree.Node, localNames: ReadonlySet<string>): boolean;
46
+ /**
47
+ * Records local names bound to `defineLink` from `@medusajs/framework/utils`
48
+ * (honors `import { defineLink as dl }`).
49
+ *
50
+ * Call from an `ImportDeclaration` visitor.
51
+ */
52
+ export declare function trackDefineLinkImports(node: TSESTree.ImportDeclaration, localNames: Set<string>): void;
53
+ /** True when `node` calls a tracked `defineLink` binding. */
54
+ export declare function isDefineLinkCall(node: TSESTree.CallExpression, localNames: ReadonlySet<string>): boolean;
55
+ /**
56
+ * Matches `<X>.linkable.<y>` at any depth on `<X>`, e.g.
57
+ * `ProductModule.linkable.product` or `foo.bar.linkable.product`.
58
+ */
59
+ export declare function isLinkableMemberChain(node: TSESTree.Node): boolean;
60
+ /**
61
+ * Walks a member chain (e.g. `BlogModule.linkable.post.id`) and returns true
62
+ * when any segment is a non-computed `.linkable` access.
63
+ */
64
+ export declare function hasLinkableInChain(node: TSESTree.Node): boolean;
65
+ //# sourceMappingURL=link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/util/link.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAKxD,eAAO,MAAM,WAAW,eAAe,CAAA;AAEvC;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAOlD,CAAA;AAEF,mEAAmE;AACnE,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,MAAM,CAO9C,CAAA;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAIhD,CAAA;AAEF,8DAA8D;AAC9D,eAAO,MAAM,oBAAoB,EAAE,WAAW,CAAC,MAAM,CAInD,CAAA;AAEF,gFAAgF;AAChF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wEAAwE;AACxE,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,QAAQ,CAAC,gBAAgB,GAAG,SAAS,GAChD,OAAO,CAOT;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,GAAG,SAAS,GACrC,OAAO,CAkCT;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,QAAQ,CAAC,kBAAkB,GAAG,QAAQ,CAAC,kBAAkB,EAC/D,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GACtB,IAAI,CAuBN;AAED,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,GAAG,MAAM,GAAG,IAAI,CAYpE;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,QAAQ,CAAC,IAAI,EACrB,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,GAC9B,OAAO,CAST;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,QAAQ,CAAC,iBAAiB,EAChC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GACtB,IAAI,CAEN;AAED,6DAA6D;AAC7D,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,QAAQ,CAAC,cAAc,EAC7B,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,GAC9B,OAAO,CAMT;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,OAAO,CAYlE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,OAAO,CAa/D"}
@@ -0,0 +1,197 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LINK_RESOLVE_STRINGS = exports.LINK_RESOLVE_KEYS = exports.LINK_TYPE_NAMES = exports.LINK_RECEIVER_NAMES = exports.DEFINE_LINK = void 0;
4
+ exports.normalizeReceiverName = normalizeReceiverName;
5
+ exports.isLinkTypeAnnotation = isLinkTypeAnnotation;
6
+ exports.isLinkResolveCall = isLinkResolveCall;
7
+ exports.trackLinkBinding = trackLinkBinding;
8
+ exports.getReceiverName = getReceiverName;
9
+ exports.isLinkReceiver = isLinkReceiver;
10
+ exports.trackDefineLinkImports = trackDefineLinkImports;
11
+ exports.isDefineLinkCall = isDefineLinkCall;
12
+ exports.isLinkableMemberChain = isLinkableMemberChain;
13
+ exports.hasLinkableInChain = hasLinkableInChain;
14
+ const utils_1 = require("@typescript-eslint/utils");
15
+ const container_1 = require("./container");
16
+ const service_scope_1 = require("./service-scope");
17
+ exports.DEFINE_LINK = "defineLink";
18
+ /**
19
+ * Receiver names that identify Medusa's Link service, normalized by
20
+ * {@link normalizeReceiverName} so casing and separators don't matter
21
+ * (`remoteLink`, `remote_link`, and `link_` all collapse into this set).
22
+ */
23
+ exports.LINK_RECEIVER_NAMES = new Set([
24
+ "link",
25
+ "links",
26
+ "remotelink",
27
+ "remotelinks",
28
+ "linkmodule",
29
+ "linkmodules",
30
+ ]);
31
+ /** Type names that identify a binding as Medusa's Link service. */
32
+ exports.LINK_TYPE_NAMES = new Set([
33
+ "Link",
34
+ "ILink",
35
+ "ILinkModule",
36
+ "ILinkModuleService",
37
+ "RemoteLink",
38
+ "IRemoteLink",
39
+ ]);
40
+ /**
41
+ * `ContainerRegistrationKeys` / `Modules` members that resolve the Link
42
+ * service. `REMOTE_LINK` is the deprecated pre-v2.2.0 key.
43
+ */
44
+ exports.LINK_RESOLVE_KEYS = new Set([
45
+ "LINK",
46
+ "LINK_MODULES",
47
+ "REMOTE_LINK",
48
+ ]);
49
+ /** String registration keys that resolve the Link service. */
50
+ exports.LINK_RESOLVE_STRINGS = new Set([
51
+ "link",
52
+ "link_modules",
53
+ "remoteLink",
54
+ ]);
55
+ /** Lowercases and strips separators so `remote_link` and `remoteLink` match. */
56
+ function normalizeReceiverName(name) {
57
+ return name.toLowerCase().replace(/[^a-z0-9]/g, "");
58
+ }
59
+ /** True when a type annotation names one of {@link LINK_TYPE_NAMES}. */
60
+ function isLinkTypeAnnotation(annotation) {
61
+ const typeNode = annotation?.typeAnnotation;
62
+ return (typeNode?.type === utils_1.AST_NODE_TYPES.TSTypeReference &&
63
+ typeNode.typeName.type === utils_1.AST_NODE_TYPES.Identifier &&
64
+ exports.LINK_TYPE_NAMES.has(typeNode.typeName.name));
65
+ }
66
+ /**
67
+ * True when `node` is a container resolution that yields the Link service —
68
+ * `container.resolve(ContainerRegistrationKeys.LINK)`, `resolve(Modules.LINK)`,
69
+ * `resolve<Link>(...)`, or `resolve("link_modules")`. Unwraps `await`.
70
+ */
71
+ function isLinkResolveCall(node) {
72
+ let expression = node;
73
+ while (expression?.type === utils_1.AST_NODE_TYPES.AwaitExpression) {
74
+ expression = expression.argument;
75
+ }
76
+ if (expression?.type !== utils_1.AST_NODE_TYPES.CallExpression ||
77
+ !(0, container_1.isResolveCallee)(expression.callee)) {
78
+ return false;
79
+ }
80
+ const typeArgument = expression.typeArguments?.params[0];
81
+ if (typeArgument?.type === utils_1.AST_NODE_TYPES.TSTypeReference &&
82
+ typeArgument.typeName.type === utils_1.AST_NODE_TYPES.Identifier &&
83
+ exports.LINK_TYPE_NAMES.has(typeArgument.typeName.name)) {
84
+ return true;
85
+ }
86
+ const key = expression.arguments[0];
87
+ if (!key) {
88
+ return false;
89
+ }
90
+ if (key.type === utils_1.AST_NODE_TYPES.Literal && typeof key.value === "string") {
91
+ return exports.LINK_RESOLVE_STRINGS.has(key.value);
92
+ }
93
+ return (key.type === utils_1.AST_NODE_TYPES.MemberExpression &&
94
+ !key.computed &&
95
+ key.property.type === utils_1.AST_NODE_TYPES.Identifier &&
96
+ exports.LINK_RESOLVE_KEYS.has(key.property.name));
97
+ }
98
+ /**
99
+ * Records the local name of a `VariableDeclarator` or `PropertyDefinition`
100
+ * that holds the Link service, recognized either by its type annotation or by
101
+ * a container resolution initializer.
102
+ *
103
+ * Call from the matching visitors; pair with {@link isLinkReceiver}.
104
+ */
105
+ function trackLinkBinding(node, localNames) {
106
+ if (node.type === utils_1.AST_NODE_TYPES.VariableDeclarator) {
107
+ if (node.id.type !== utils_1.AST_NODE_TYPES.Identifier) {
108
+ return;
109
+ }
110
+ if (isLinkTypeAnnotation(node.id.typeAnnotation) ||
111
+ isLinkResolveCall(node.init)) {
112
+ localNames.add(node.id.name);
113
+ }
114
+ return;
115
+ }
116
+ if (node.computed || node.key.type !== utils_1.AST_NODE_TYPES.Identifier) {
117
+ return;
118
+ }
119
+ if (isLinkTypeAnnotation(node.typeAnnotation) ||
120
+ isLinkResolveCall(node.value)) {
121
+ localNames.add(node.key.name);
122
+ }
123
+ }
124
+ /** The name a call's receiver is known by, e.g. `link`, `this.link_`. */
125
+ function getReceiverName(object) {
126
+ if (object.type === utils_1.AST_NODE_TYPES.Identifier) {
127
+ return object.name;
128
+ }
129
+ if (object.type === utils_1.AST_NODE_TYPES.MemberExpression &&
130
+ !object.computed &&
131
+ object.property.type === utils_1.AST_NODE_TYPES.Identifier) {
132
+ return object.property.name;
133
+ }
134
+ return null;
135
+ }
136
+ /**
137
+ * True when `object` is recognizable as Medusa's Link service — either a name
138
+ * tracked by {@link trackLinkBinding} or one of {@link LINK_RECEIVER_NAMES}.
139
+ *
140
+ * Without this gate a rule matching link method names would also match
141
+ * identically-named methods on unrelated third-party SDKs.
142
+ */
143
+ function isLinkReceiver(object, localNames) {
144
+ const receiver = getReceiverName(object);
145
+ if (!receiver) {
146
+ return false;
147
+ }
148
+ return (localNames.has(receiver) ||
149
+ exports.LINK_RECEIVER_NAMES.has(normalizeReceiverName(receiver)));
150
+ }
151
+ /**
152
+ * Records local names bound to `defineLink` from `@medusajs/framework/utils`
153
+ * (honors `import { defineLink as dl }`).
154
+ *
155
+ * Call from an `ImportDeclaration` visitor.
156
+ */
157
+ function trackDefineLinkImports(node, localNames) {
158
+ (0, service_scope_1.trackFrameworkUtilsImports)(node, { [exports.DEFINE_LINK]: localNames });
159
+ }
160
+ /** True when `node` calls a tracked `defineLink` binding. */
161
+ function isDefineLinkCall(node, localNames) {
162
+ return (localNames.size > 0 &&
163
+ node.callee.type === utils_1.AST_NODE_TYPES.Identifier &&
164
+ localNames.has(node.callee.name));
165
+ }
166
+ /**
167
+ * Matches `<X>.linkable.<y>` at any depth on `<X>`, e.g.
168
+ * `ProductModule.linkable.product` or `foo.bar.linkable.product`.
169
+ */
170
+ function isLinkableMemberChain(node) {
171
+ if (node.type !== utils_1.AST_NODE_TYPES.MemberExpression || node.computed) {
172
+ return false;
173
+ }
174
+ const object = node.object;
175
+ if (object.type !== utils_1.AST_NODE_TYPES.MemberExpression || object.computed) {
176
+ return false;
177
+ }
178
+ return (object.property.type === utils_1.AST_NODE_TYPES.Identifier &&
179
+ object.property.name === "linkable");
180
+ }
181
+ /**
182
+ * Walks a member chain (e.g. `BlogModule.linkable.post.id`) and returns true
183
+ * when any segment is a non-computed `.linkable` access.
184
+ */
185
+ function hasLinkableInChain(node) {
186
+ let current = node;
187
+ while (current && current.type === utils_1.AST_NODE_TYPES.MemberExpression) {
188
+ if (!current.computed &&
189
+ current.property.type === utils_1.AST_NODE_TYPES.Identifier &&
190
+ current.property.name === "linkable") {
191
+ return true;
192
+ }
193
+ current = current.object;
194
+ }
195
+ return false;
196
+ }
197
+ //# sourceMappingURL=link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/util/link.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@medusajs/eslint-plugin",
3
- "version": "2.21.0",
3
+ "version": "2.21.1-preview-20260917150924",
4
4
  "description": "Official ESLint plugin for Medusa projects. Enforces Medusa's framework conventions across API routes, modules, workflows, subscribers, jobs, admin extensions, and module links.",
5
5
  "repository": {
6
6
  "type": "git",