@atlaskit/eslint-plugin-platform 2.7.1 → 2.8.0

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.
Files changed (125) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cjs/index.js +17 -9
  3. package/dist/cjs/rules/constants.js +1 -1
  4. package/dist/cjs/rules/ensure-critical-dependency-resolutions/index.js +5 -5
  5. package/dist/cjs/rules/ensure-no-private-dependencies/index.js +48 -66
  6. package/dist/cjs/rules/feature-gating/inline-usage/index.js +14 -3
  7. package/dist/cjs/rules/feature-gating/no-alias/index.js +1 -1
  8. package/dist/cjs/rules/feature-gating/no-module-level-eval/index.js +1 -1
  9. package/dist/cjs/rules/feature-gating/no-module-level-eval-nav4/index.js +1 -1
  10. package/dist/cjs/rules/feature-gating/no-preconditioning/index.js +4 -1
  11. package/dist/cjs/rules/feature-gating/prefer-fg/index.js +1 -1
  12. package/dist/cjs/rules/feature-gating/static-feature-flags/index.js +2 -2
  13. package/dist/cjs/rules/feature-gating/use-recommended-utils/index.js +1 -1
  14. package/dist/cjs/rules/feature-gating/valid-gate-name/index.js +60 -0
  15. package/dist/cjs/rules/import/no-barrel-entry-imports/index.js +871 -0
  16. package/dist/cjs/rules/import/no-barrel-entry-jest-mock/index.js +1384 -0
  17. package/dist/cjs/rules/import/no-conversation-assistant-barrel-imports/index.js +43 -0
  18. package/dist/cjs/rules/import/no-jest-mock-barrel-files/index.js +1401 -0
  19. package/dist/cjs/rules/import/no-relative-barrel-file-imports/index.js +777 -0
  20. package/dist/cjs/rules/import/shared/barrel-parsing.js +511 -0
  21. package/dist/cjs/rules/import/shared/file-system.js +186 -0
  22. package/dist/cjs/rules/import/shared/jest-utils.js +191 -0
  23. package/dist/cjs/rules/import/shared/package-registry.js +263 -0
  24. package/dist/cjs/rules/import/shared/package-resolution.js +185 -0
  25. package/dist/cjs/rules/import/shared/perf.js +89 -0
  26. package/dist/cjs/rules/import/shared/types.js +67 -0
  27. package/dist/cjs/rules/no-invalid-storybook-decorator-usage/index.js +1 -1
  28. package/dist/cjs/rules/no-sparse-checkout/index.js +1 -1
  29. package/dist/cjs/rules/prefer-crypto-random-uuid/index.js +87 -0
  30. package/dist/cjs/rules/use-entrypoints-in-examples/index.js +1 -1
  31. package/dist/es2019/index.js +17 -9
  32. package/dist/es2019/rules/constants.js +1 -1
  33. package/dist/es2019/rules/ensure-critical-dependency-resolutions/index.js +5 -5
  34. package/dist/es2019/rules/ensure-no-private-dependencies/index.js +10 -9
  35. package/dist/es2019/rules/feature-gating/inline-usage/index.js +14 -3
  36. package/dist/es2019/rules/feature-gating/no-alias/index.js +1 -1
  37. package/dist/es2019/rules/feature-gating/no-module-level-eval/index.js +1 -1
  38. package/dist/es2019/rules/feature-gating/no-module-level-eval-nav4/index.js +1 -1
  39. package/dist/es2019/rules/feature-gating/no-preconditioning/index.js +4 -1
  40. package/dist/es2019/rules/feature-gating/prefer-fg/index.js +1 -1
  41. package/dist/es2019/rules/feature-gating/static-feature-flags/index.js +2 -2
  42. package/dist/es2019/rules/feature-gating/use-recommended-utils/index.js +1 -1
  43. package/dist/es2019/rules/feature-gating/valid-gate-name/index.js +52 -0
  44. package/dist/es2019/rules/import/no-barrel-entry-imports/index.js +801 -0
  45. package/dist/es2019/rules/import/no-barrel-entry-jest-mock/index.js +1113 -0
  46. package/dist/es2019/rules/import/no-conversation-assistant-barrel-imports/index.js +37 -0
  47. package/dist/es2019/rules/import/no-jest-mock-barrel-files/index.js +1179 -0
  48. package/dist/es2019/rules/import/no-relative-barrel-file-imports/index.js +738 -0
  49. package/dist/es2019/rules/import/shared/barrel-parsing.js +433 -0
  50. package/dist/es2019/rules/import/shared/file-system.js +174 -0
  51. package/dist/es2019/rules/import/shared/jest-utils.js +159 -0
  52. package/dist/es2019/rules/import/shared/package-registry.js +240 -0
  53. package/dist/es2019/rules/import/shared/package-resolution.js +161 -0
  54. package/dist/es2019/rules/import/shared/perf.js +83 -0
  55. package/dist/es2019/rules/import/shared/types.js +57 -0
  56. package/dist/es2019/rules/no-invalid-storybook-decorator-usage/index.js +1 -1
  57. package/dist/es2019/rules/no-sparse-checkout/index.js +1 -1
  58. package/dist/es2019/rules/prefer-crypto-random-uuid/index.js +81 -0
  59. package/dist/es2019/rules/use-entrypoints-in-examples/index.js +1 -1
  60. package/dist/esm/index.js +17 -9
  61. package/dist/esm/rules/constants.js +1 -1
  62. package/dist/esm/rules/ensure-critical-dependency-resolutions/index.js +5 -5
  63. package/dist/esm/rules/ensure-no-private-dependencies/index.js +48 -65
  64. package/dist/esm/rules/feature-gating/inline-usage/index.js +14 -3
  65. package/dist/esm/rules/feature-gating/no-alias/index.js +1 -1
  66. package/dist/esm/rules/feature-gating/no-module-level-eval/index.js +1 -1
  67. package/dist/esm/rules/feature-gating/no-module-level-eval-nav4/index.js +1 -1
  68. package/dist/esm/rules/feature-gating/no-preconditioning/index.js +4 -1
  69. package/dist/esm/rules/feature-gating/prefer-fg/index.js +1 -1
  70. package/dist/esm/rules/feature-gating/static-feature-flags/index.js +2 -2
  71. package/dist/esm/rules/feature-gating/use-recommended-utils/index.js +1 -1
  72. package/dist/esm/rules/feature-gating/valid-gate-name/index.js +53 -0
  73. package/dist/esm/rules/import/no-barrel-entry-imports/index.js +864 -0
  74. package/dist/esm/rules/import/no-barrel-entry-jest-mock/index.js +1375 -0
  75. package/dist/esm/rules/import/no-conversation-assistant-barrel-imports/index.js +37 -0
  76. package/dist/esm/rules/import/no-jest-mock-barrel-files/index.js +1391 -0
  77. package/dist/esm/rules/import/no-relative-barrel-file-imports/index.js +770 -0
  78. package/dist/esm/rules/import/shared/barrel-parsing.js +500 -0
  79. package/dist/esm/rules/import/shared/file-system.js +176 -0
  80. package/dist/esm/rules/import/shared/jest-utils.js +179 -0
  81. package/dist/esm/rules/import/shared/package-registry.js +256 -0
  82. package/dist/esm/rules/import/shared/package-resolution.js +175 -0
  83. package/dist/esm/rules/import/shared/perf.js +80 -0
  84. package/dist/esm/rules/import/shared/types.js +61 -0
  85. package/dist/esm/rules/no-invalid-storybook-decorator-usage/index.js +1 -1
  86. package/dist/esm/rules/no-sparse-checkout/index.js +1 -1
  87. package/dist/esm/rules/prefer-crypto-random-uuid/index.js +81 -0
  88. package/dist/esm/rules/use-entrypoints-in-examples/index.js +1 -1
  89. package/dist/types/index.d.ts +18 -16
  90. package/dist/types/rules/import/no-barrel-entry-imports/index.d.ts +9 -0
  91. package/dist/types/rules/import/no-barrel-entry-jest-mock/index.d.ts +9 -0
  92. package/dist/types/rules/import/no-conversation-assistant-barrel-imports/index.d.ts +3 -0
  93. package/dist/types/rules/import/no-jest-mock-barrel-files/index.d.ts +22 -0
  94. package/dist/types/rules/import/no-relative-barrel-file-imports/index.d.ts +5 -0
  95. package/dist/types/rules/import/shared/barrel-parsing.d.ts +30 -0
  96. package/dist/types/rules/import/shared/file-system.d.ts +38 -0
  97. package/dist/types/rules/import/shared/jest-utils.d.ts +47 -0
  98. package/dist/types/rules/import/shared/package-registry.d.ts +26 -0
  99. package/dist/types/rules/import/shared/package-resolution.d.ts +38 -0
  100. package/dist/types/rules/import/shared/perf.d.ts +13 -0
  101. package/dist/types/rules/import/shared/types.d.ts +131 -0
  102. package/dist/types/rules/prefer-crypto-random-uuid/index.d.ts +3 -0
  103. package/dist/types-ts4.5/index.d.ts +18 -28
  104. package/dist/types-ts4.5/rules/import/no-barrel-entry-imports/index.d.ts +9 -0
  105. package/dist/types-ts4.5/rules/import/no-barrel-entry-jest-mock/index.d.ts +9 -0
  106. package/dist/types-ts4.5/rules/import/no-jest-mock-barrel-files/index.d.ts +22 -0
  107. package/dist/types-ts4.5/rules/import/no-relative-barrel-file-imports/index.d.ts +5 -0
  108. package/dist/types-ts4.5/rules/import/shared/barrel-parsing.d.ts +30 -0
  109. package/dist/types-ts4.5/rules/import/shared/file-system.d.ts +38 -0
  110. package/dist/types-ts4.5/rules/import/shared/jest-utils.d.ts +47 -0
  111. package/dist/types-ts4.5/rules/import/shared/package-registry.d.ts +26 -0
  112. package/dist/types-ts4.5/rules/import/shared/package-resolution.d.ts +38 -0
  113. package/dist/types-ts4.5/rules/import/shared/perf.d.ts +13 -0
  114. package/dist/types-ts4.5/rules/import/shared/types.d.ts +131 -0
  115. package/package.json +4 -5
  116. package/dist/cjs/rules/ensure-feature-flag-prefix/index.js +0 -75
  117. package/dist/cjs/rules/ensure-native-and-af-exports-synced/index.js +0 -158
  118. package/dist/es2019/rules/ensure-feature-flag-prefix/index.js +0 -65
  119. package/dist/es2019/rules/ensure-native-and-af-exports-synced/index.js +0 -146
  120. package/dist/esm/rules/ensure-feature-flag-prefix/index.js +0 -69
  121. package/dist/esm/rules/ensure-native-and-af-exports-synced/index.js +0 -151
  122. /package/dist/types/rules/{ensure-native-and-af-exports-synced → feature-gating/valid-gate-name}/index.d.ts +0 -0
  123. /package/dist/types-ts4.5/rules/{ensure-feature-flag-prefix → feature-gating/valid-gate-name}/index.d.ts +0 -0
  124. /package/dist/types-ts4.5/rules/{ensure-native-and-af-exports-synced → import/no-conversation-assistant-barrel-imports}/index.d.ts +0 -0
  125. /package/dist/{types/rules/ensure-feature-flag-prefix → types-ts4.5/rules/prefer-crypto-random-uuid}/index.d.ts +0 -0
@@ -0,0 +1,511 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.getNamedExportsFromFile = getNamedExportsFromFile;
9
+ exports.hasReExportsFromOtherFiles = hasReExportsFromOtherFiles;
10
+ exports.parseBarrelExports = parseBarrelExports;
11
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+ var _path = require("path");
14
+ var ts = _interopRequireWildcard(require("typescript"));
15
+ var _fileSystem = require("./file-system");
16
+ var _packageResolution = require("./package-resolution");
17
+ var _perf = require("./perf");
18
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
19
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
20
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
21
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
22
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
23
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
24
+ /**
25
+ * Maximum depth to traverse when looking for source files in barrel exports.
26
+ * Can be adjusted based on project structure needs.
27
+ */
28
+ var MAX_BARREL_DEPTH = 10;
29
+
30
+ /**
31
+ * Get all named exports from a file.
32
+ * This extracts what names are exported from a file for star exports.
33
+ */
34
+ function getNamedExportsFromFile(_ref) {
35
+ var filePath = _ref.filePath,
36
+ fs = _ref.fs;
37
+ var names = new Set();
38
+ var content = (0, _fileSystem.readFileContent)({
39
+ filePath: filePath,
40
+ fs: fs
41
+ });
42
+ if (!content) {
43
+ return names;
44
+ }
45
+ try {
46
+ var sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
47
+ ts.forEachChild(sourceFile, function (node) {
48
+ if (ts.isExportDeclaration(node)) {
49
+ if (node.exportClause && ts.isNamedExports(node.exportClause)) {
50
+ node.exportClause.elements.forEach(function (e) {
51
+ return names.add(e.name.text);
52
+ });
53
+ }
54
+ } else if (ts.isExportAssignment(node)) {
55
+ names.add('default');
56
+ } else if (ts.isVariableStatement(node)) {
57
+ if (node.modifiers && node.modifiers.some(function (m) {
58
+ return m.kind === ts.SyntaxKind.ExportKeyword;
59
+ })) {
60
+ node.declarationList.declarations.forEach(function (d) {
61
+ if (ts.isIdentifier(d.name)) {
62
+ names.add(d.name.text);
63
+ }
64
+ });
65
+ }
66
+ } else if (ts.isFunctionDeclaration(node) || ts.isClassDeclaration(node) || ts.isInterfaceDeclaration(node) || ts.isTypeAliasDeclaration(node) || ts.isEnumDeclaration(node)) {
67
+ if (node.modifiers && node.modifiers.some(function (m) {
68
+ return m.kind === ts.SyntaxKind.ExportKeyword;
69
+ })) {
70
+ if (node.name && ts.isIdentifier(node.name)) {
71
+ names.add(node.name.text);
72
+ }
73
+ }
74
+ }
75
+ });
76
+ } catch (_unused) {
77
+ // Ignore parsing errors
78
+ }
79
+ return names;
80
+ }
81
+
82
+ /**
83
+ * Check if an export map represents a barrel file (has re-exports from other files)
84
+ */
85
+ function hasReExportsFromOtherFiles(_ref2) {
86
+ var exportMap = _ref2.exportMap,
87
+ sourceFilePath = _ref2.sourceFilePath;
88
+ return Array.from(exportMap.values()).some(function (info) {
89
+ return info.path !== sourceFilePath;
90
+ });
91
+ }
92
+
93
+ /**
94
+ * Process a named export element with cross-package support and add it to the exports map
95
+ */
96
+ function processNamedExportElementWithCrossPackage(_ref3) {
97
+ var element = _ref3.element,
98
+ resolvedSource = _ref3.resolvedSource,
99
+ nestedExports = _ref3.nestedExports,
100
+ isStatementTypeOnly = _ref3.isStatementTypeOnly,
101
+ exports = _ref3.exports,
102
+ crossPackageSource = _ref3.crossPackageSource;
103
+ var localName = element.name.text;
104
+ var propertyName = element.propertyName ? element.propertyName.text : localName;
105
+ var isElementTypeOnly = isStatementTypeOnly || element.isTypeOnly;
106
+ var isDefaultExport = propertyName === 'default';
107
+ // Track if this export is aliased (exported name differs from source name)
108
+ var isAliased = element.propertyName !== undefined && localName !== propertyName;
109
+ if (nestedExports) {
110
+ var deepSource = nestedExports.get(propertyName);
111
+ if (deepSource) {
112
+ var _deepSource$originalN;
113
+ exports.set(localName, {
114
+ path: deepSource.path,
115
+ isTypeOnly: isElementTypeOnly || deepSource.isTypeOnly,
116
+ isDefaultExport: deepSource.isDefaultExport,
117
+ // Use deep source's original name if available, otherwise use propertyName if aliased
118
+ originalName: (_deepSource$originalN = deepSource.originalName) !== null && _deepSource$originalN !== void 0 ? _deepSource$originalN : isAliased ? propertyName : undefined,
119
+ // Preserve existing crossPackageSource from nested exports, or use the one from this level
120
+ crossPackageSource: deepSource.crossPackageSource || crossPackageSource
121
+ });
122
+ } else {
123
+ exports.set(localName, {
124
+ path: resolvedSource,
125
+ isTypeOnly: isElementTypeOnly,
126
+ isDefaultExport: isDefaultExport,
127
+ originalName: isAliased ? propertyName : undefined,
128
+ crossPackageSource: crossPackageSource
129
+ });
130
+ }
131
+ } else {
132
+ exports.set(localName, {
133
+ path: resolvedSource,
134
+ isTypeOnly: isElementTypeOnly,
135
+ isDefaultExport: isDefaultExport,
136
+ originalName: isAliased ? propertyName : undefined,
137
+ crossPackageSource: crossPackageSource
138
+ });
139
+ }
140
+ }
141
+
142
+ /**
143
+ * Handle star exports with cross-package support (export * from '...')
144
+ */
145
+ function processStarExportWithCrossPackage(_ref4) {
146
+ var resolvedSource = _ref4.resolvedSource,
147
+ nestedExports = _ref4.nestedExports,
148
+ exports = _ref4.exports,
149
+ fs = _ref4.fs,
150
+ crossPackageSource = _ref4.crossPackageSource;
151
+ if (nestedExports) {
152
+ var _iterator = _createForOfIteratorHelper(nestedExports),
153
+ _step;
154
+ try {
155
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
156
+ var _step$value = (0, _slicedToArray2.default)(_step.value, 2),
157
+ name = _step$value[0],
158
+ info = _step$value[1];
159
+ if (name !== 'default') {
160
+ // Preserve existing crossPackageSource from nested exports, or use the one from this level
161
+ exports.set(name, _objectSpread(_objectSpread({}, info), {}, {
162
+ crossPackageSource: info.crossPackageSource || crossPackageSource
163
+ }));
164
+ }
165
+ }
166
+ } catch (err) {
167
+ _iterator.e(err);
168
+ } finally {
169
+ _iterator.f();
170
+ }
171
+ } else {
172
+ var nonBarrelExports = getNamedExportsFromFile({
173
+ filePath: resolvedSource,
174
+ fs: fs
175
+ });
176
+ var _iterator2 = _createForOfIteratorHelper(nonBarrelExports),
177
+ _step2;
178
+ try {
179
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
180
+ var _name = _step2.value;
181
+ if (_name !== 'default') {
182
+ exports.set(_name, {
183
+ path: resolvedSource,
184
+ isTypeOnly: false,
185
+ crossPackageSource: crossPackageSource
186
+ });
187
+ }
188
+ }
189
+ } catch (err) {
190
+ _iterator2.e(err);
191
+ } finally {
192
+ _iterator2.f();
193
+ }
194
+ }
195
+ }
196
+
197
+ /**
198
+ * Process export declarations that have module specifiers (export ... from '...')
199
+ */
200
+ function processExportWithModuleSpecifier(_ref5) {
201
+ var statement = _ref5.statement,
202
+ resolveModule = _ref5.resolveModule,
203
+ depth = _ref5.depth,
204
+ exports = _ref5.exports,
205
+ fs = _ref5.fs,
206
+ workspaceRoot = _ref5.workspaceRoot,
207
+ visitedPackages = _ref5.visitedPackages;
208
+ if (!statement.moduleSpecifier || !ts.isStringLiteral(statement.moduleSpecifier)) {
209
+ return;
210
+ }
211
+ var modulePath = statement.moduleSpecifier.text;
212
+
213
+ // Try relative resolution first (existing behavior)
214
+ var resolvedSource = resolveModule(modulePath);
215
+ var crossPackageSource;
216
+
217
+ // If not a relative import, try cross-package resolution
218
+ if (!resolvedSource && !(0, _fileSystem.isRelativeImport)(modulePath) && workspaceRoot) {
219
+ var crossPackageInfo = (0, _packageResolution.resolveCrossPackageImport)({
220
+ moduleSpecifier: modulePath,
221
+ workspaceRoot: workspaceRoot,
222
+ fs: fs
223
+ });
224
+ if (crossPackageInfo) {
225
+ // Check for circular dependencies
226
+ if (visitedPackages !== null && visitedPackages !== void 0 && visitedPackages.has(crossPackageInfo.packageName)) {
227
+ return;
228
+ }
229
+ resolvedSource = crossPackageInfo.entryFilePath;
230
+ crossPackageSource = {
231
+ packageName: crossPackageInfo.packageName,
232
+ exportPath: crossPackageInfo.exportPath
233
+ };
234
+ }
235
+ }
236
+ if (!resolvedSource) {
237
+ return;
238
+ }
239
+ var isStatementTypeOnly = statement.isTypeOnly;
240
+
241
+ // For cross-package imports, track visited packages to prevent circular deps
242
+ var newVisitedPackages = visitedPackages ? new Set(visitedPackages) : new Set();
243
+ if (crossPackageSource) {
244
+ newVisitedPackages.add(crossPackageSource.packageName);
245
+ }
246
+
247
+ // Always trace through nested barrels and cross-package exports to find the ultimate source
248
+ var potentialNestedExports = parseBarrelExports({
249
+ barrelFilePath: resolvedSource,
250
+ depth: depth + 1,
251
+ fs: fs,
252
+ workspaceRoot: workspaceRoot,
253
+ visitedPackages: newVisitedPackages
254
+ });
255
+ var nestedExports = hasReExportsFromOtherFiles({
256
+ exportMap: potentialNestedExports,
257
+ sourceFilePath: resolvedSource
258
+ }) ? potentialNestedExports : null;
259
+ if (statement.exportClause) {
260
+ if (ts.isNamedExports(statement.exportClause)) {
261
+ var _iterator3 = _createForOfIteratorHelper(statement.exportClause.elements),
262
+ _step3;
263
+ try {
264
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
265
+ var element = _step3.value;
266
+ processNamedExportElementWithCrossPackage({
267
+ element: element,
268
+ resolvedSource: resolvedSource,
269
+ nestedExports: nestedExports,
270
+ isStatementTypeOnly: isStatementTypeOnly,
271
+ exports: exports,
272
+ crossPackageSource: crossPackageSource
273
+ });
274
+ }
275
+ } catch (err) {
276
+ _iterator3.e(err);
277
+ } finally {
278
+ _iterator3.f();
279
+ }
280
+ } else if (ts.isNamespaceExport(statement.exportClause)) {
281
+ var name = statement.exportClause.name.text;
282
+ exports.set(name, {
283
+ path: resolvedSource,
284
+ isTypeOnly: isStatementTypeOnly,
285
+ crossPackageSource: crossPackageSource
286
+ });
287
+ }
288
+ } else {
289
+ processStarExportWithCrossPackage({
290
+ resolvedSource: resolvedSource,
291
+ nestedExports: nestedExports,
292
+ exports: exports,
293
+ fs: fs,
294
+ crossPackageSource: crossPackageSource
295
+ });
296
+ }
297
+ }
298
+
299
+ /**
300
+ * Process local export statements (no module specifier)
301
+ */
302
+ function processLocalExportDeclaration(_ref6) {
303
+ var statement = _ref6.statement,
304
+ barrelFilePath = _ref6.barrelFilePath,
305
+ exports = _ref6.exports;
306
+ if (!statement.exportClause || !ts.isNamedExports(statement.exportClause)) {
307
+ return;
308
+ }
309
+ var isStatementTypeOnly = statement.isTypeOnly;
310
+ var _iterator4 = _createForOfIteratorHelper(statement.exportClause.elements),
311
+ _step4;
312
+ try {
313
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
314
+ var element = _step4.value;
315
+ var isElementTypeOnly = isStatementTypeOnly || element.isTypeOnly;
316
+ exports.set(element.name.text, {
317
+ path: barrelFilePath,
318
+ isTypeOnly: isElementTypeOnly
319
+ });
320
+ }
321
+ } catch (err) {
322
+ _iterator4.e(err);
323
+ } finally {
324
+ _iterator4.f();
325
+ }
326
+ }
327
+
328
+ /**
329
+ * Process various declaration statements with export modifiers
330
+ */
331
+ function processExportedDeclaration(_ref7) {
332
+ var statement = _ref7.statement,
333
+ barrelFilePath = _ref7.barrelFilePath,
334
+ exports = _ref7.exports;
335
+ if (ts.isExportAssignment(statement)) {
336
+ exports.set('default', {
337
+ path: barrelFilePath,
338
+ isTypeOnly: false
339
+ });
340
+ return;
341
+ }
342
+ var hasExportModifier = 'modifiers' in statement && Array.isArray(statement.modifiers) && statement.modifiers.some(function (m) {
343
+ return m.kind === ts.SyntaxKind.ExportKeyword;
344
+ });
345
+ if (!hasExportModifier) {
346
+ return;
347
+ }
348
+ if (ts.isVariableStatement(statement)) {
349
+ var _iterator5 = _createForOfIteratorHelper(statement.declarationList.declarations),
350
+ _step5;
351
+ try {
352
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
353
+ var decl = _step5.value;
354
+ if (ts.isIdentifier(decl.name)) {
355
+ exports.set(decl.name.text, {
356
+ path: barrelFilePath,
357
+ isTypeOnly: false
358
+ });
359
+ }
360
+ }
361
+ } catch (err) {
362
+ _iterator5.e(err);
363
+ } finally {
364
+ _iterator5.f();
365
+ }
366
+ } else if (ts.isFunctionDeclaration(statement) || ts.isClassDeclaration(statement)) {
367
+ if (statement.name && ts.isIdentifier(statement.name)) {
368
+ exports.set(statement.name.text, {
369
+ path: barrelFilePath,
370
+ isTypeOnly: false
371
+ });
372
+ }
373
+ } else if (ts.isInterfaceDeclaration(statement) || ts.isTypeAliasDeclaration(statement)) {
374
+ if (statement.name && ts.isIdentifier(statement.name)) {
375
+ exports.set(statement.name.text, {
376
+ path: barrelFilePath,
377
+ isTypeOnly: true
378
+ });
379
+ }
380
+ } else if (ts.isEnumDeclaration(statement)) {
381
+ if (statement.name && ts.isIdentifier(statement.name)) {
382
+ exports.set(statement.name.text, {
383
+ path: barrelFilePath,
384
+ isTypeOnly: false
385
+ });
386
+ }
387
+ }
388
+ }
389
+
390
+ /**
391
+ * Parse export statements from a file to find where each export comes from.
392
+ * Returns a map of export name -> ExportInfo.
393
+ *
394
+ * This function recursively traces through nested barrels and cross-package re-exports
395
+ * to find the ultimate source file for each export.
396
+ */
397
+ function parseBarrelExports(_ref8) {
398
+ var barrelFilePath = _ref8.barrelFilePath,
399
+ _ref8$depth = _ref8.depth,
400
+ depth = _ref8$depth === void 0 ? 0 : _ref8$depth,
401
+ fs = _ref8.fs,
402
+ workspaceRoot = _ref8.workspaceRoot,
403
+ visitedPackages = _ref8.visitedPackages;
404
+ (0, _perf.perfInc)({
405
+ fs: fs,
406
+ key: 'parseBarrelExports.calls'
407
+ });
408
+ return (0, _perf.perfTime)({
409
+ fs: fs,
410
+ key: 'parseBarrelExports.totalMs',
411
+ fn: function fn() {
412
+ if (depth > MAX_BARREL_DEPTH) {
413
+ return new Map();
414
+ }
415
+ if (!fs.cache.barrelExportsByPath) {
416
+ fs.cache.barrelExportsByPath = new Map();
417
+ }
418
+ var currentMtimeMs = 0;
419
+ try {
420
+ var _fs$statSync$mtimeMs;
421
+ currentMtimeMs = (_fs$statSync$mtimeMs = fs.statSync(barrelFilePath).mtimeMs) !== null && _fs$statSync$mtimeMs !== void 0 ? _fs$statSync$mtimeMs : 0;
422
+ } catch (_unused2) {
423
+ currentMtimeMs = 0;
424
+ }
425
+ var cached = fs.cache.barrelExportsByPath.get(barrelFilePath);
426
+ if (cached && cached.mtimeMs === currentMtimeMs) {
427
+ (0, _perf.perfInc)({
428
+ fs: fs,
429
+ key: 'parseBarrelExports.cacheHit'
430
+ });
431
+ return cached.exports;
432
+ }
433
+ (0, _perf.perfInc)({
434
+ fs: fs,
435
+ key: 'parseBarrelExports.cacheMiss'
436
+ });
437
+ var exports = new Map();
438
+ var content = (0, _fileSystem.readFileContent)({
439
+ filePath: barrelFilePath,
440
+ fs: fs
441
+ });
442
+ if (!content) {
443
+ return exports;
444
+ }
445
+ var sourceFile;
446
+ try {
447
+ sourceFile = (0, _perf.perfTime)({
448
+ fs: fs,
449
+ key: 'parseBarrelExports.tsCreateSourceFileMs',
450
+ fn: function fn() {
451
+ return ts.createSourceFile(barrelFilePath, content, ts.ScriptTarget.Latest, true);
452
+ }
453
+ });
454
+ } catch (_unused3) {
455
+ return exports;
456
+ }
457
+ var barrelDir = (0, _path.dirname)(barrelFilePath);
458
+ var resolveModule = function resolveModule(moduleSpecifier) {
459
+ if (!(0, _fileSystem.isRelativeImport)(moduleSpecifier)) {
460
+ return null;
461
+ }
462
+ return (0, _fileSystem.resolveImportPath)({
463
+ basedir: barrelDir,
464
+ importPath: moduleSpecifier,
465
+ fs: fs
466
+ });
467
+ };
468
+ var _iterator6 = _createForOfIteratorHelper(sourceFile.statements),
469
+ _step6;
470
+ try {
471
+ for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
472
+ var statement = _step6.value;
473
+ if (ts.isExportDeclaration(statement)) {
474
+ if (statement.moduleSpecifier) {
475
+ processExportWithModuleSpecifier({
476
+ statement: statement,
477
+ resolveModule: resolveModule,
478
+ depth: depth,
479
+ exports: exports,
480
+ fs: fs,
481
+ workspaceRoot: workspaceRoot,
482
+ visitedPackages: visitedPackages
483
+ });
484
+ } else {
485
+ processLocalExportDeclaration({
486
+ statement: statement,
487
+ barrelFilePath: barrelFilePath,
488
+ exports: exports
489
+ });
490
+ }
491
+ } else {
492
+ processExportedDeclaration({
493
+ statement: statement,
494
+ barrelFilePath: barrelFilePath,
495
+ exports: exports
496
+ });
497
+ }
498
+ }
499
+ } catch (err) {
500
+ _iterator6.e(err);
501
+ } finally {
502
+ _iterator6.f();
503
+ }
504
+ fs.cache.barrelExportsByPath.set(barrelFilePath, {
505
+ mtimeMs: currentMtimeMs,
506
+ exports: exports
507
+ });
508
+ return exports;
509
+ }
510
+ });
511
+ }
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.DEFAULT_TARGET_FOLDERS = void 0;
7
+ exports.findWorkspaceRoot = findWorkspaceRoot;
8
+ exports.isRelativeImport = isRelativeImport;
9
+ exports.readFileContent = readFileContent;
10
+ exports.resolveImportPath = resolveImportPath;
11
+ var _path = require("path");
12
+ /**
13
+ * The default folder paths that barrel import rules apply to.
14
+ * Only imports from packages within these folders will be checked.
15
+ * This can be overridden via lint rule options.
16
+ */
17
+ var DEFAULT_TARGET_FOLDERS = exports.DEFAULT_TARGET_FOLDERS = ['platform/packages/ai-mate', 'platform/packages/search'];
18
+
19
+ /**
20
+ * Try to read file contents with error handling.
21
+ * Returns null if file cannot be read.
22
+ */
23
+ function readFileContent(_ref) {
24
+ var filePath = _ref.filePath,
25
+ fs = _ref.fs;
26
+ if (!fs.cache.fileContentByPath) {
27
+ fs.cache.fileContentByPath = new Map();
28
+ }
29
+ try {
30
+ if (!fs.existsSync(filePath)) {
31
+ return null;
32
+ }
33
+ var currentMtimeMs = null;
34
+ try {
35
+ var _fs$statSync$mtimeMs;
36
+ currentMtimeMs = (_fs$statSync$mtimeMs = fs.statSync(filePath).mtimeMs) !== null && _fs$statSync$mtimeMs !== void 0 ? _fs$statSync$mtimeMs : null;
37
+ } catch (_unused) {
38
+ // If stat fails, use null to force a re-read (don't use cached value)
39
+ currentMtimeMs = null;
40
+ }
41
+ var cached = fs.cache.fileContentByPath.get(filePath);
42
+ // Only use cache if we have a valid mtime and it matches
43
+ if (cached && currentMtimeMs !== null && cached.mtimeMs === currentMtimeMs) {
44
+ return cached.content;
45
+ }
46
+ var content = fs.readFileSync(filePath, 'utf-8');
47
+ fs.cache.fileContentByPath.set(filePath, {
48
+ mtimeMs: currentMtimeMs,
49
+ content: content
50
+ });
51
+ return content;
52
+ } catch (_unused2) {
53
+ // Silently fail if file cannot be read
54
+ }
55
+ return null;
56
+ }
57
+
58
+ /**
59
+ * Check if a path is a relative import (starts with ./ or ../)
60
+ */
61
+ function isRelativeImport(importPath) {
62
+ return importPath.startsWith('./') || importPath.startsWith('../');
63
+ }
64
+
65
+ /**
66
+ * Resolve the actual file path from an import path.
67
+ * Handles extension inference and index file resolution.
68
+ */
69
+ function resolveImportPath(_ref2) {
70
+ var basedir = _ref2.basedir,
71
+ importPath = _ref2.importPath,
72
+ fs = _ref2.fs;
73
+ if (!fs.cache.resolvedImportPathByKey) {
74
+ fs.cache.resolvedImportPathByKey = new Map();
75
+ }
76
+ var cacheKey = "".concat(basedir, "::").concat(importPath);
77
+ if (fs.cache.resolvedImportPathByKey.has(cacheKey)) {
78
+ var _fs$cache$resolvedImp;
79
+ return (_fs$cache$resolvedImp = fs.cache.resolvedImportPathByKey.get(cacheKey)) !== null && _fs$cache$resolvedImp !== void 0 ? _fs$cache$resolvedImp : null;
80
+ }
81
+ var possibleExtensions = ['.ts', '.tsx', '.js', '.jsx'];
82
+ var absolutePath = (0, _path.resolve)(basedir, importPath);
83
+
84
+ // Check exact path first (for explicit extensions)
85
+ if (fs.existsSync(absolutePath)) {
86
+ try {
87
+ var stats = fs.statSync(absolutePath);
88
+ if (stats.isFile()) {
89
+ var resolvedPath = fs.realpathSync(absolutePath);
90
+ fs.cache.resolvedImportPathByKey.set(cacheKey, resolvedPath);
91
+ return resolvedPath;
92
+ }
93
+ } catch (_unused3) {
94
+ // Ignore errors
95
+ }
96
+ }
97
+
98
+ // Try with extensions
99
+ for (var _i = 0, _possibleExtensions = possibleExtensions; _i < _possibleExtensions.length; _i++) {
100
+ var ext = _possibleExtensions[_i];
101
+ var pathWithExt = absolutePath + ext;
102
+ if (fs.existsSync(pathWithExt)) {
103
+ try {
104
+ var _resolvedPath = fs.realpathSync(pathWithExt);
105
+ fs.cache.resolvedImportPathByKey.set(cacheKey, _resolvedPath);
106
+ return _resolvedPath;
107
+ } catch (_unused4) {
108
+ fs.cache.resolvedImportPathByKey.set(cacheKey, pathWithExt);
109
+ return pathWithExt;
110
+ }
111
+ }
112
+ }
113
+
114
+ // Try as directory with index
115
+ for (var _i2 = 0, _possibleExtensions2 = possibleExtensions; _i2 < _possibleExtensions2.length; _i2++) {
116
+ var _ext = _possibleExtensions2[_i2];
117
+ var indexPath = (0, _path.join)(absolutePath, "index".concat(_ext));
118
+ if (fs.existsSync(indexPath)) {
119
+ try {
120
+ var _resolvedPath2 = fs.realpathSync(indexPath);
121
+ fs.cache.resolvedImportPathByKey.set(cacheKey, _resolvedPath2);
122
+ return _resolvedPath2;
123
+ } catch (_unused5) {
124
+ fs.cache.resolvedImportPathByKey.set(cacheKey, indexPath);
125
+ return indexPath;
126
+ }
127
+ }
128
+ }
129
+ fs.cache.resolvedImportPathByKey.set(cacheKey, null);
130
+ return null;
131
+ }
132
+
133
+ /**
134
+ * Find the workspace root using git rev-parse --show-toplevel.
135
+ * The result is cached on fs.cache.gitRepoRoot to avoid repeated shell calls.
136
+ * Falls back to directory traversal if git command fails.
137
+ */
138
+ function findWorkspaceRoot(_ref3) {
139
+ var startPath = _ref3.startPath,
140
+ fs = _ref3.fs,
141
+ _ref3$applyToImportsF = _ref3.applyToImportsFrom,
142
+ applyToImportsFrom = _ref3$applyToImportsF === void 0 ? DEFAULT_TARGET_FOLDERS : _ref3$applyToImportsF;
143
+ // Return cached value if available
144
+ if (fs.cache.gitRepoRoot) {
145
+ return fs.cache.gitRepoRoot;
146
+ }
147
+
148
+ // Try to get the git repository root
149
+ var gitRoot = fs.execSync('git rev-parse --show-toplevel', {
150
+ cwd: startPath
151
+ });
152
+ if (gitRoot) {
153
+ fs.cache.gitRepoRoot = gitRoot;
154
+ return gitRoot;
155
+ }
156
+
157
+ // Fallback: traverse up looking for workspace markers
158
+ var current = startPath;
159
+ var maxDepth = 20;
160
+ var depth = 0;
161
+ while (depth < maxDepth) {
162
+ // Check if we've found the platform folder (which contains the target folders)
163
+ if (applyToImportsFrom.some(function (folder) {
164
+ return fs.existsSync((0, _path.join)(current, folder));
165
+ })) {
166
+ fs.cache.gitRepoRoot = current;
167
+ return current;
168
+ }
169
+
170
+ // Check for root-level indicators
171
+ var hasRootPackageJson = fs.existsSync((0, _path.join)(current, 'package.json'));
172
+ var hasYarnLock = fs.existsSync((0, _path.join)(current, 'yarn.lock'));
173
+ if (hasRootPackageJson && hasYarnLock) {
174
+ fs.cache.gitRepoRoot = current;
175
+ return current;
176
+ }
177
+ var parent = (0, _path.dirname)(current);
178
+ if (parent === current) {
179
+ // Reached filesystem root
180
+ return startPath;
181
+ }
182
+ current = parent;
183
+ depth++;
184
+ }
185
+ return startPath;
186
+ }