@atlaskit/eslint-plugin-platform 2.8.0 → 2.9.1

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 (47) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/cjs/index.js +8 -1
  3. package/dist/cjs/rules/ensure-critical-dependency-resolutions/index.js +0 -1
  4. package/dist/cjs/rules/ensure-use-sync-external-store-server-snapshot/index.js +41 -0
  5. package/dist/cjs/rules/import/no-barrel-entry-imports/index.js +534 -74
  6. package/dist/cjs/rules/import/no-barrel-entry-jest-mock/index.js +428 -119
  7. package/dist/cjs/rules/import/no-jest-mock-barrel-files/index.js +3 -2
  8. package/dist/cjs/rules/import/no-relative-barrel-file-imports/index.js +7 -3
  9. package/dist/cjs/rules/import/shared/jest-utils.js +62 -9
  10. package/dist/cjs/rules/import/shared/package-resolution.js +300 -22
  11. package/dist/cjs/rules/no-restricted-fedramp-imports/index.js +65 -0
  12. package/dist/cjs/rules/visit-example-type-import-required/index.js +409 -0
  13. package/dist/es2019/index.js +8 -1
  14. package/dist/es2019/rules/ensure-critical-dependency-resolutions/index.js +0 -1
  15. package/dist/es2019/rules/ensure-use-sync-external-store-server-snapshot/index.js +43 -0
  16. package/dist/es2019/rules/import/no-barrel-entry-imports/index.js +431 -25
  17. package/dist/es2019/rules/import/no-barrel-entry-jest-mock/index.js +287 -25
  18. package/dist/es2019/rules/import/no-jest-mock-barrel-files/index.js +3 -2
  19. package/dist/es2019/rules/import/no-relative-barrel-file-imports/index.js +7 -3
  20. package/dist/es2019/rules/import/shared/jest-utils.js +44 -0
  21. package/dist/es2019/rules/import/shared/package-resolution.js +211 -4
  22. package/dist/es2019/rules/no-restricted-fedramp-imports/index.js +47 -0
  23. package/dist/es2019/rules/visit-example-type-import-required/index.js +375 -0
  24. package/dist/esm/index.js +8 -1
  25. package/dist/esm/rules/ensure-critical-dependency-resolutions/index.js +0 -1
  26. package/dist/esm/rules/ensure-use-sync-external-store-server-snapshot/index.js +35 -0
  27. package/dist/esm/rules/import/no-barrel-entry-imports/index.js +535 -75
  28. package/dist/esm/rules/import/no-barrel-entry-jest-mock/index.js +430 -121
  29. package/dist/esm/rules/import/no-jest-mock-barrel-files/index.js +3 -2
  30. package/dist/esm/rules/import/no-relative-barrel-file-imports/index.js +7 -3
  31. package/dist/esm/rules/import/shared/jest-utils.js +61 -9
  32. package/dist/esm/rules/import/shared/package-resolution.js +298 -24
  33. package/dist/esm/rules/no-restricted-fedramp-imports/index.js +59 -0
  34. package/dist/esm/rules/visit-example-type-import-required/index.js +402 -0
  35. package/dist/types/index.d.ts +14 -0
  36. package/dist/types/rules/ensure-use-sync-external-store-server-snapshot/index.d.ts +3 -0
  37. package/dist/types/rules/import/shared/jest-utils.d.ts +8 -0
  38. package/dist/types/rules/import/shared/package-resolution.d.ts +47 -2
  39. package/dist/types/rules/no-restricted-fedramp-imports/index.d.ts +3 -0
  40. package/dist/types/rules/visit-example-type-import-required/index.d.ts +4 -0
  41. package/dist/types-ts4.5/index.d.ts +14 -0
  42. package/dist/types-ts4.5/rules/ensure-use-sync-external-store-server-snapshot/index.d.ts +3 -0
  43. package/dist/types-ts4.5/rules/import/shared/jest-utils.d.ts +8 -0
  44. package/dist/types-ts4.5/rules/import/shared/package-resolution.d.ts +47 -2
  45. package/dist/types-ts4.5/rules/no-restricted-fedramp-imports/index.d.ts +3 -0
  46. package/dist/types-ts4.5/rules/visit-example-type-import-required/index.d.ts +4 -0
  47. package/package.json +3 -1
@@ -671,7 +671,9 @@ function traceSymbolsToExports(_ref10) {
671
671
  exportMap = _ref10.exportMap,
672
672
  exportsMap = _ref10.exportsMap,
673
673
  currentExportPath = _ref10.currentExportPath,
674
- fs = _ref10.fs;
674
+ fs = _ref10.fs,
675
+ barrelPackageName = _ref10.barrelPackageName,
676
+ preferImportedPackageSubpath = _ref10.preferImportedPackageSubpath;
675
677
  var groupedByExport = new Map();
676
678
  var crossPackageGroups = new Map();
677
679
  var unmappedSymbols = [];
@@ -679,6 +681,7 @@ function traceSymbolsToExports(_ref10) {
679
681
  _step13;
680
682
  try {
681
683
  for (_iterator13.s(); !(_step13 = _iterator13.n()).done;) {
684
+ var _findExportForSourceF, _findExportForSourceF2;
682
685
  var symbolName = _step13.value;
683
686
  var exportInfo = exportMap.get(symbolName);
684
687
  if (!exportInfo) {
@@ -688,25 +691,47 @@ function traceSymbolsToExports(_ref10) {
688
691
 
689
692
  // Check for cross-package source first
690
693
  if (exportInfo.crossPackageSource) {
691
- var key = "".concat(exportInfo.crossPackageSource.packageName).concat(exportInfo.crossPackageSource.exportPath === '.' ? '' : exportInfo.crossPackageSource.exportPath.slice(1));
694
+ var key = void 0;
695
+ var tracedOriginalName = exportInfo.originalName;
696
+ var barrelBridgeExportPath = void 0;
697
+ if (preferImportedPackageSubpath) {
698
+ var bridge = (0, _packageResolution.findCrossPackageBridgeExportPath)({
699
+ exportsMap: exportsMap,
700
+ crossPackageName: exportInfo.crossPackageSource.packageName,
701
+ exportedName: symbolName,
702
+ fs: fs
703
+ });
704
+ if (bridge) {
705
+ key = "".concat(barrelPackageName).concat(bridge.exportPath.slice(1));
706
+ barrelBridgeExportPath = bridge.exportPath;
707
+ if (bridge.entryPointExportName !== undefined) {
708
+ tracedOriginalName = bridge.entryPointExportName === symbolName ? undefined : bridge.entryPointExportName;
709
+ }
710
+ } else {
711
+ key = "".concat(exportInfo.crossPackageSource.packageName).concat(exportInfo.crossPackageSource.exportPath === '.' ? '' : exportInfo.crossPackageSource.exportPath.slice(1));
712
+ }
713
+ } else {
714
+ key = "".concat(exportInfo.crossPackageSource.packageName).concat(exportInfo.crossPackageSource.exportPath === '.' ? '' : exportInfo.crossPackageSource.exportPath.slice(1));
715
+ }
692
716
  if (!crossPackageGroups.has(key)) {
693
717
  crossPackageGroups.set(key, []);
694
718
  }
695
719
  crossPackageGroups.get(key).push({
696
720
  symbolName: symbolName,
697
- originalName: exportInfo.originalName,
721
+ originalName: tracedOriginalName,
698
722
  sourceFilePath: exportInfo.path,
699
723
  isTypeOnly: exportInfo.isTypeOnly,
700
- crossPackageSource: exportInfo.crossPackageSource
724
+ crossPackageSource: exportInfo.crossPackageSource,
725
+ barrelBridgeExportPath: barrelBridgeExportPath
701
726
  });
702
727
  continue;
703
728
  }
704
729
 
705
730
  // First try to find an export that directly exposes the source file
706
- var targetExportPath = (0, _packageResolution.findExportForSourceFile)({
731
+ var targetExportPath = (_findExportForSourceF = (_findExportForSourceF2 = (0, _packageResolution.findExportForSourceFile)({
707
732
  sourceFilePath: exportInfo.path,
708
733
  exportsMap: exportsMap
709
- });
734
+ })) === null || _findExportForSourceF2 === void 0 ? void 0 : _findExportForSourceF2.exportPath) !== null && _findExportForSourceF !== void 0 ? _findExportForSourceF : null;
710
735
 
711
736
  // If no direct match, check which export can provide this symbol
712
737
  // (handles nested barrels where the symbol is re-exported through intermediate files)
@@ -766,16 +791,80 @@ function escapeRegExp(str) {
766
791
  return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
767
792
  }
768
793
 
794
+ /** Mock object keys that are module interop metadata, not package exports. */
795
+ var ESM_INTEROP_MOCK_KEYS = new Set(['__esModule']);
796
+
797
+ /**
798
+ * If a preamble line is `const|let actual = jest.requireActual('<barrel>')`, rewrite the specifier to
799
+ * `targetImportPathForThisMock` when every `binding.<prop>` read in this split mock's implementation
800
+ * resolves to that same path via `symbolToNewImportPath`. Otherwise leave unchanged (e.g. mixed paths
801
+ * still need the barrel module).
802
+ */
803
+ function rewritePreambleLineBarrelRequireActual(_ref12) {
804
+ var lineText = _ref12.lineText,
805
+ oldBarrelPath = _ref12.oldBarrelPath,
806
+ targetImportPathForThisMock = _ref12.targetImportPathForThisMock,
807
+ mockImplementationTextForGroup = _ref12.mockImplementationTextForGroup,
808
+ symbolToNewImportPath = _ref12.symbolToNewImportPath;
809
+ var requireActualRe = /jest\.requireActual(?:<[^>]*>)?\((['"])([^'"]+)\1\)/;
810
+ var requireMatch = requireActualRe.exec(lineText);
811
+ if (!requireMatch || requireMatch[2] !== oldBarrelPath) {
812
+ return lineText;
813
+ }
814
+ var quote = requireMatch[1];
815
+ var bindingMatch = /^\s*(?:const|let)\s+(\w+)\s*=/m.exec(lineText);
816
+ if (!bindingMatch) {
817
+ return lineText;
818
+ }
819
+ var binding = bindingMatch[1];
820
+ var propAccessRe = new RegExp("\\b".concat(escapeRegExp(binding), "\\.(\\w+)"), 'g');
821
+ var accessedProps = new Set();
822
+ var propMatch;
823
+ while ((propMatch = propAccessRe.exec(mockImplementationTextForGroup)) !== null) {
824
+ accessedProps.add(propMatch[1]);
825
+ }
826
+ if (accessedProps.size === 0) {
827
+ return lineText;
828
+ }
829
+ var resolvedPaths = [];
830
+ var _iterator14 = _createForOfIteratorHelper(accessedProps),
831
+ _step14;
832
+ try {
833
+ for (_iterator14.s(); !(_step14 = _iterator14.n()).done;) {
834
+ var prop = _step14.value;
835
+ var mapped = symbolToNewImportPath.get(prop);
836
+ if (mapped) {
837
+ resolvedPaths.push(mapped);
838
+ }
839
+ }
840
+ } catch (err) {
841
+ _iterator14.e(err);
842
+ } finally {
843
+ _iterator14.f();
844
+ }
845
+ if (resolvedPaths.length === 0) {
846
+ return lineText;
847
+ }
848
+ var uniquePaths = new Set(resolvedPaths);
849
+ if (uniquePaths.size !== 1 || !uniquePaths.has(targetImportPathForThisMock)) {
850
+ return lineText;
851
+ }
852
+ return lineText.replace("jest.requireActual(".concat(quote).concat(oldBarrelPath).concat(quote, ")"), "jest.requireActual(".concat(quote).concat(targetImportPathForThisMock).concat(quote, ")"));
853
+ }
854
+
769
855
  /**
770
856
  * Generate fix text for multiple jest.mock calls
771
857
  */
772
- function generateMockFixes(_ref12) {
773
- var groups = _ref12.groups,
774
- crossPackageGroups = _ref12.crossPackageGroups,
775
- packageName = _ref12.packageName,
776
- mockProperties = _ref12.mockProperties,
777
- quote = _ref12.quote,
778
- preambleStatements = _ref12.preambleStatements;
858
+ function generateMockFixes(_ref13) {
859
+ var groups = _ref13.groups,
860
+ crossPackageGroups = _ref13.crossPackageGroups,
861
+ packageName = _ref13.packageName,
862
+ mockProperties = _ref13.mockProperties,
863
+ quote = _ref13.quote,
864
+ preambleStatements = _ref13.preambleStatements,
865
+ propagateEsModuleFromOriginalMock = _ref13.propagateEsModuleFromOriginalMock,
866
+ oldBarrelImportPath = _ref13.oldBarrelImportPath,
867
+ symbolToNewImportPath = _ref13.symbolToNewImportPath;
779
868
  var mockCalls = [];
780
869
 
781
870
  // Helper to generate a single mock call
@@ -783,15 +872,15 @@ function generateMockFixes(_ref12) {
783
872
  var propTexts = [];
784
873
  propTexts.push("...jest.requireActual(".concat(quote).concat(fullImportPath).concat(quote, ")"));
785
874
 
786
- // Add __esModule: true when mocking default exports
787
- if (group.hasDefaultExport) {
875
+ // Add __esModule: true when mocking default exports, or when the original mock already used __esModule (apply to every split).
876
+ if (group.hasDefaultExport || propagateEsModuleFromOriginalMock) {
788
877
  propTexts.push('__esModule: true');
789
878
  }
790
- var _iterator14 = _createForOfIteratorHelper(group.propertyNames),
791
- _step14;
879
+ var _iterator15 = _createForOfIteratorHelper(group.propertyNames),
880
+ _step15;
792
881
  try {
793
- for (_iterator14.s(); !(_step14 = _iterator14.n()).done;) {
794
- var propName = _step14.value;
882
+ for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) {
883
+ var propName = _step15.value;
795
884
  // First try to get from group's propertyTexts (used for merged mocks)
796
885
  var groupPropText = group.propertyTexts.get(propName);
797
886
  if (groupPropText) {
@@ -825,21 +914,34 @@ function generateMockFixes(_ref12) {
825
914
  }
826
915
  }
827
916
  }
828
-
829
- // Determine if we need preamble for this group
830
917
  } catch (err) {
831
- _iterator14.e(err);
918
+ _iterator15.e(err);
832
919
  } finally {
833
- _iterator14.f();
920
+ _iterator15.f();
834
921
  }
922
+ var combinedGroupImplText = group.propertyNames.map(function (name) {
923
+ var _ref14, _group$propertyTexts$, _mockProperties$get;
924
+ return (_ref14 = (_group$propertyTexts$ = group.propertyTexts.get(name)) !== null && _group$propertyTexts$ !== void 0 ? _group$propertyTexts$ : (_mockProperties$get = mockProperties.get(name)) === null || _mockProperties$get === void 0 ? void 0 : _mockProperties$get.text) !== null && _ref14 !== void 0 ? _ref14 : '';
925
+ }).join('\n');
926
+
927
+ // Determine if we need preamble for this group
835
928
  var neededPreamble = getNeededPreamble({
836
929
  propertyTexts: propTexts,
837
930
  allPreamble: preambleStatements
838
931
  });
932
+ var rewrittenPreamble = neededPreamble.map(function (p) {
933
+ return rewritePreambleLineBarrelRequireActual({
934
+ lineText: p.text,
935
+ oldBarrelPath: oldBarrelImportPath,
936
+ targetImportPathForThisMock: fullImportPath,
937
+ mockImplementationTextForGroup: combinedGroupImplText,
938
+ symbolToNewImportPath: symbolToNewImportPath
939
+ });
940
+ });
839
941
  if (neededPreamble.length > 0) {
840
942
  // Generate block body arrow function with preamble
841
- var preambleLines = neededPreamble.map(function (p) {
842
- return "\t".concat(p.text);
943
+ var preambleLines = rewrittenPreamble.map(function (text) {
944
+ return "\t".concat(text);
843
945
  }).join('\n');
844
946
  var formattedProps = propTexts.map(function (p) {
845
947
  return "\t\t".concat(p, ",");
@@ -855,34 +957,34 @@ function generateMockFixes(_ref12) {
855
957
  };
856
958
 
857
959
  // Generate mocks for cross-package groups first
858
- var _iterator15 = _createForOfIteratorHelper(crossPackageGroups),
859
- _step15;
960
+ var _iterator16 = _createForOfIteratorHelper(crossPackageGroups),
961
+ _step16;
860
962
  try {
861
- for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) {
862
- var group = _step15.value;
963
+ for (_iterator16.s(); !(_step16 = _iterator16.n()).done;) {
964
+ var group = _step16.value;
863
965
  mockCalls.push(generateMockCall(group, group.importPath));
864
966
  }
865
967
 
866
968
  // Generate mocks for same-package groups
867
969
  } catch (err) {
868
- _iterator15.e(err);
970
+ _iterator16.e(err);
869
971
  } finally {
870
- _iterator15.f();
972
+ _iterator16.f();
871
973
  }
872
- var _iterator16 = _createForOfIteratorHelper(groups),
873
- _step16;
974
+ var _iterator17 = _createForOfIteratorHelper(groups),
975
+ _step17;
874
976
  try {
875
- for (_iterator16.s(); !(_step16 = _iterator16.n()).done;) {
876
- var _group = _step16.value;
977
+ for (_iterator17.s(); !(_step17 = _iterator17.n()).done;) {
978
+ var _group = _step17.value;
877
979
  var fullImportPath = "".concat(packageName).concat(_group.exportPath.slice(1));
878
980
  mockCalls.push(generateMockCall(_group, fullImportPath));
879
981
  }
880
982
 
881
983
  // Join with semicolons but don't add trailing semicolon
882
984
  } catch (err) {
883
- _iterator16.e(err);
985
+ _iterator17.e(err);
884
986
  } finally {
885
- _iterator16.f();
987
+ _iterator17.f();
886
988
  }
887
989
  return mockCalls.join(';\n');
888
990
  }
@@ -895,11 +997,11 @@ function generateMockFixes(_ref12) {
895
997
  * Resolves jest.mock context for barrel file analysis.
896
998
  * Returns null if the mock should not be processed.
897
999
  */
898
- function resolveJestMockContext(_ref13) {
899
- var importPath = _ref13.importPath,
900
- workspaceRoot = _ref13.workspaceRoot,
901
- fs = _ref13.fs,
902
- applyToImportsFrom = _ref13.applyToImportsFrom;
1000
+ function resolveJestMockContext(_ref15) {
1001
+ var importPath = _ref15.importPath,
1002
+ workspaceRoot = _ref15.workspaceRoot,
1003
+ fs = _ref15.fs,
1004
+ applyToImportsFrom = _ref15.applyToImportsFrom;
903
1005
  if ((0, _fileSystem.isRelativeImport)(importPath)) {
904
1006
  return null;
905
1007
  }
@@ -962,9 +1064,9 @@ function resolveJestMockContext(_ref13) {
962
1064
  /**
963
1065
  * Check if the entry file is a barrel file (re-exports from other files)
964
1066
  */
965
- function isBarrelFile(_ref14) {
966
- var exportMap = _ref14.exportMap,
967
- entryFilePath = _ref14.entryFilePath;
1067
+ function isBarrelFile(_ref16) {
1068
+ var exportMap = _ref16.exportMap,
1069
+ entryFilePath = _ref16.entryFilePath;
968
1070
  return (0, _barrelParsing.hasReExportsFromOtherFiles)({
969
1071
  exportMap: exportMap,
970
1072
  sourceFilePath: entryFilePath
@@ -991,12 +1093,17 @@ var ruleMeta = {
991
1093
  type: 'string'
992
1094
  },
993
1095
  description: 'The folder paths (relative to workspace root) containing packages whose imports will be checked and autofixed.'
1096
+ },
1097
+ preferImportedPackageSubpath: {
1098
+ type: 'boolean',
1099
+ description: 'Prefer subpaths on the mocked barrel package when they bridge to the dependency.'
994
1100
  }
995
1101
  },
996
1102
  additionalProperties: false
997
1103
  }],
998
1104
  messages: {
999
- barrelEntryMock: "jest.mock('{{path}}') is mocking a barrel file entry point. Split into separate mocks for each source file using package.json exports."
1105
+ barrelEntryMock: "jest.mock('{{path}}') is mocking a barrel file entry point. Split into separate mocks for each source file using package.json exports.",
1106
+ barrelEntryRequireActual: "jest.requireActual('{{path}}') references a barrel file entry point. Use a specific package.json export path instead."
1000
1107
  }
1001
1108
  };
1002
1109
 
@@ -1008,9 +1115,10 @@ function createRule(fs) {
1008
1115
  return {
1009
1116
  meta: ruleMeta,
1010
1117
  create: function create(context) {
1011
- var _options$applyToImpor;
1118
+ var _options$applyToImpor, _options$preferImport;
1012
1119
  var options = context.options[0] || {};
1013
1120
  var applyToImportsFrom = (_options$applyToImpor = options.applyToImportsFrom) !== null && _options$applyToImpor !== void 0 ? _options$applyToImpor : _fileSystem.DEFAULT_TARGET_FOLDERS;
1121
+ var preferImportedPackageSubpath = (_options$preferImport = options.preferImportedPackageSubpath) !== null && _options$preferImport !== void 0 ? _options$preferImport : false;
1014
1122
  var workspaceRoot = (0, _fileSystem.findWorkspaceRoot)({
1015
1123
  startPath: (0, _path.dirname)(context.filename),
1016
1124
  fs: fs,
@@ -1019,6 +1127,136 @@ function createRule(fs) {
1019
1127
  return {
1020
1128
  CallExpression: function CallExpression(rawNode) {
1021
1129
  var node = rawNode;
1130
+
1131
+ // Handle standalone jest.requireActual() calls that reference barrel entries.
1132
+ // e.g. jest.requireActual('@atlaskit/pkg').Foo or const { Foo } = jest.requireActual('@atlaskit/pkg')
1133
+ if ((0, _jestUtils.isJestRequireActual)(node)) {
1134
+ var raImportPath = (0, _jestUtils.extractImportPath)(node);
1135
+ if (!raImportPath) {
1136
+ return;
1137
+ }
1138
+ var raContext = resolveJestMockContext({
1139
+ importPath: raImportPath,
1140
+ workspaceRoot: workspaceRoot,
1141
+ fs: fs,
1142
+ applyToImportsFrom: applyToImportsFrom
1143
+ });
1144
+ if (!raContext) {
1145
+ return;
1146
+ }
1147
+ if (!isBarrelFile({
1148
+ exportMap: raContext.exportMap,
1149
+ entryFilePath: raContext.entryFilePath
1150
+ })) {
1151
+ return;
1152
+ }
1153
+
1154
+ // `jest.requireActual('<barrel>')` inside `jest.mock('<barrel>')` is handled by the mock
1155
+ // rule's fix (preamble retargeting + `jest.requireActual('barrel').x` rewriting), including
1156
+ // `const actual = jest.requireActual('<barrel>')` with no member access on the call.
1157
+ // Skip standalone handling here to avoid duplicate diagnostics.
1158
+ var ancestor = node.parent;
1159
+ while (ancestor) {
1160
+ if (ancestor.type === 'CallExpression' && (0, _jestUtils.isJestMockCall)(ancestor)) {
1161
+ var ancestorPath = (0, _jestUtils.extractImportPath)(ancestor);
1162
+ if (ancestorPath) {
1163
+ var ancestorCtx = resolveJestMockContext({
1164
+ importPath: ancestorPath,
1165
+ workspaceRoot: workspaceRoot,
1166
+ fs: fs,
1167
+ applyToImportsFrom: applyToImportsFrom
1168
+ });
1169
+ if (ancestorCtx && isBarrelFile({
1170
+ exportMap: ancestorCtx.exportMap,
1171
+ entryFilePath: ancestorCtx.entryFilePath
1172
+ })) {
1173
+ return;
1174
+ }
1175
+ }
1176
+ }
1177
+ ancestor = ancestor.parent;
1178
+ }
1179
+
1180
+ // Determine which symbols are accessed from the barrel
1181
+ var parent = node.parent;
1182
+ var accessedSymbols = [];
1183
+ if ((parent === null || parent === void 0 ? void 0 : parent.type) === 'MemberExpression' && parent.property.type === 'Identifier') {
1184
+ accessedSymbols.push(parent.property.name);
1185
+ } else if ((parent === null || parent === void 0 ? void 0 : parent.type) === 'VariableDeclarator' && parent.id.type === 'ObjectPattern') {
1186
+ var _iterator18 = _createForOfIteratorHelper(parent.id.properties),
1187
+ _step18;
1188
+ try {
1189
+ for (_iterator18.s(); !(_step18 = _iterator18.n()).done;) {
1190
+ var prop = _step18.value;
1191
+ if (prop.type === 'Property' && prop.key.type === 'Identifier') {
1192
+ accessedSymbols.push(prop.key.name);
1193
+ }
1194
+ }
1195
+ } catch (err) {
1196
+ _iterator18.e(err);
1197
+ } finally {
1198
+ _iterator18.f();
1199
+ }
1200
+ }
1201
+ if (accessedSymbols.length === 0) {
1202
+ context.report({
1203
+ node: node,
1204
+ messageId: 'barrelEntryRequireActual',
1205
+ data: {
1206
+ path: raImportPath
1207
+ }
1208
+ });
1209
+ return;
1210
+ }
1211
+ var _traceSymbolsToExport = traceSymbolsToExports({
1212
+ symbolNames: accessedSymbols,
1213
+ exportMap: raContext.exportMap,
1214
+ exportsMap: raContext.exportsMap,
1215
+ currentExportPath: raContext.currentExportPath,
1216
+ fs: fs,
1217
+ barrelPackageName: raContext.packageName,
1218
+ preferImportedPackageSubpath: preferImportedPackageSubpath
1219
+ }),
1220
+ _groupedByExport = _traceSymbolsToExport.groupedByExport,
1221
+ _crossPackageGroups = _traceSymbolsToExport.crossPackageGroups;
1222
+ var newPath = null;
1223
+ if (_groupedByExport.size === 1 && _crossPackageGroups.size === 0) {
1224
+ var _groupedByExport$keys = _groupedByExport.keys(),
1225
+ _groupedByExport$keys2 = (0, _slicedToArray2.default)(_groupedByExport$keys, 1),
1226
+ exportPath = _groupedByExport$keys2[0];
1227
+ newPath = "".concat(raContext.packageName).concat(exportPath.slice(1));
1228
+ } else if (_crossPackageGroups.size === 1 && _groupedByExport.size === 0) {
1229
+ var _crossPackageGroups$k = _crossPackageGroups.keys(),
1230
+ _crossPackageGroups$k2 = (0, _slicedToArray2.default)(_crossPackageGroups$k, 1),
1231
+ cpImportPath = _crossPackageGroups$k2[0];
1232
+ newPath = cpImportPath;
1233
+ }
1234
+ var _sourceCode = context.getSourceCode();
1235
+ if (newPath) {
1236
+ var resolvedNewPath = newPath;
1237
+ context.report({
1238
+ node: node,
1239
+ messageId: 'barrelEntryRequireActual',
1240
+ data: {
1241
+ path: raImportPath
1242
+ },
1243
+ fix: function fix(fixer) {
1244
+ var firstArg = node.arguments[0];
1245
+ var quote = _sourceCode.getText(firstArg)[0];
1246
+ return fixer.replaceText(firstArg, "".concat(quote).concat(resolvedNewPath).concat(quote));
1247
+ }
1248
+ });
1249
+ } else {
1250
+ context.report({
1251
+ node: node,
1252
+ messageId: 'barrelEntryRequireActual',
1253
+ data: {
1254
+ path: raImportPath
1255
+ }
1256
+ });
1257
+ }
1258
+ return;
1259
+ }
1022
1260
  if (!(0, _jestUtils.isJestMockCall)(node)) {
1023
1261
  return;
1024
1262
  }
@@ -1065,17 +1303,22 @@ function createRule(fs) {
1065
1303
  if (mockProperties.size === 0) {
1066
1304
  return;
1067
1305
  }
1068
- var symbolNames = Array.from(mockProperties.keys());
1069
- var _traceSymbolsToExport = traceSymbolsToExports({
1306
+ var originalMockHadEsModule = mockProperties.has('__esModule');
1307
+ var symbolNames = Array.from(mockProperties.keys()).filter(function (name) {
1308
+ return !ESM_INTEROP_MOCK_KEYS.has(name);
1309
+ });
1310
+ var _traceSymbolsToExport2 = traceSymbolsToExports({
1070
1311
  symbolNames: symbolNames,
1071
1312
  exportMap: mockContext.exportMap,
1072
1313
  exportsMap: mockContext.exportsMap,
1073
1314
  currentExportPath: mockContext.currentExportPath,
1074
- fs: fs
1315
+ fs: fs,
1316
+ barrelPackageName: mockContext.packageName,
1317
+ preferImportedPackageSubpath: preferImportedPackageSubpath
1075
1318
  }),
1076
- groupedByExport = _traceSymbolsToExport.groupedByExport,
1077
- crossPackageGroups = _traceSymbolsToExport.crossPackageGroups,
1078
- unmappedSymbols = _traceSymbolsToExport.unmappedSymbols;
1319
+ groupedByExport = _traceSymbolsToExport2.groupedByExport,
1320
+ crossPackageGroups = _traceSymbolsToExport2.crossPackageGroups,
1321
+ unmappedSymbols = _traceSymbolsToExport2.unmappedSymbols;
1079
1322
 
1080
1323
  // If no symbols can be mapped to specific exports or cross-package sources,
1081
1324
  // there's nothing to fix so don't report an error
@@ -1083,20 +1326,20 @@ function createRule(fs) {
1083
1326
  return;
1084
1327
  }
1085
1328
  var groups = [];
1086
- var _iterator17 = _createForOfIteratorHelper(groupedByExport),
1087
- _step17;
1329
+ var _iterator19 = _createForOfIteratorHelper(groupedByExport),
1330
+ _step19;
1088
1331
  try {
1089
- for (_iterator17.s(); !(_step17 = _iterator17.n()).done;) {
1090
- var _step17$value = (0, _slicedToArray2.default)(_step17.value, 2),
1091
- exportPath = _step17$value[0],
1092
- symbols = _step17$value[1];
1332
+ for (_iterator19.s(); !(_step19 = _iterator19.n()).done;) {
1333
+ var _step19$value = (0, _slicedToArray2.default)(_step19.value, 2),
1334
+ _exportPath = _step19$value[0],
1335
+ symbols = _step19$value[1];
1093
1336
  // Build name mapping for aliased exports
1094
1337
  var nameMapping = new Map();
1095
- var _iterator22 = _createForOfIteratorHelper(symbols),
1096
- _step22;
1338
+ var _iterator25 = _createForOfIteratorHelper(symbols),
1339
+ _step25;
1097
1340
  try {
1098
- for (_iterator22.s(); !(_step22 = _iterator22.n()).done;) {
1099
- var s = _step22.value;
1341
+ for (_iterator25.s(); !(_step25 = _iterator25.n()).done;) {
1342
+ var s = _step25.value;
1100
1343
  if (s.originalName) {
1101
1344
  nameMapping.set(s.symbolName, s.originalName);
1102
1345
  }
@@ -1104,16 +1347,16 @@ function createRule(fs) {
1104
1347
 
1105
1348
  // Check if any symbol in this group is a default export
1106
1349
  } catch (err) {
1107
- _iterator22.e(err);
1350
+ _iterator25.e(err);
1108
1351
  } finally {
1109
- _iterator22.f();
1352
+ _iterator25.f();
1110
1353
  }
1111
1354
  var hasDefaultExport = symbols.some(function (s) {
1112
1355
  return s.originalName === 'default';
1113
1356
  });
1114
1357
  groups.push({
1115
- exportPath: exportPath,
1116
- importPath: "".concat(mockContext.packageName).concat(exportPath.slice(1)),
1358
+ exportPath: _exportPath,
1359
+ importPath: "".concat(mockContext.packageName).concat(_exportPath.slice(1)),
1117
1360
  propertyNames: symbols.map(function (s) {
1118
1361
  return s.symbolName;
1119
1362
  }),
@@ -1127,25 +1370,25 @@ function createRule(fs) {
1127
1370
 
1128
1371
  // Build cross-package groups
1129
1372
  } catch (err) {
1130
- _iterator17.e(err);
1373
+ _iterator19.e(err);
1131
1374
  } finally {
1132
- _iterator17.f();
1375
+ _iterator19.f();
1133
1376
  }
1134
1377
  var crossPackageMockGroups = [];
1135
- var _iterator18 = _createForOfIteratorHelper(crossPackageGroups),
1136
- _step18;
1378
+ var _iterator20 = _createForOfIteratorHelper(crossPackageGroups),
1379
+ _step20;
1137
1380
  try {
1138
- for (_iterator18.s(); !(_step18 = _iterator18.n()).done;) {
1139
- var _step18$value = (0, _slicedToArray2.default)(_step18.value, 2),
1140
- _importPath = _step18$value[0],
1141
- _symbols = _step18$value[1];
1381
+ for (_iterator20.s(); !(_step20 = _iterator20.n()).done;) {
1382
+ var _step20$value = (0, _slicedToArray2.default)(_step20.value, 2),
1383
+ _importPath = _step20$value[0],
1384
+ _symbols = _step20$value[1];
1142
1385
  // Build name mapping for aliased exports
1143
1386
  var _nameMapping = new Map();
1144
- var _iterator23 = _createForOfIteratorHelper(_symbols),
1145
- _step23;
1387
+ var _iterator26 = _createForOfIteratorHelper(_symbols),
1388
+ _step26;
1146
1389
  try {
1147
- for (_iterator23.s(); !(_step23 = _iterator23.n()).done;) {
1148
- var _s = _step23.value;
1390
+ for (_iterator26.s(); !(_step26 = _iterator26.n()).done;) {
1391
+ var _s = _step26.value;
1149
1392
  if (_s.originalName) {
1150
1393
  _nameMapping.set(_s.symbolName, _s.originalName);
1151
1394
  }
@@ -1153,9 +1396,9 @@ function createRule(fs) {
1153
1396
 
1154
1397
  // Check if any symbol in this group is a default export
1155
1398
  } catch (err) {
1156
- _iterator23.e(err);
1399
+ _iterator26.e(err);
1157
1400
  } finally {
1158
- _iterator23.f();
1401
+ _iterator26.f();
1159
1402
  }
1160
1403
  var _hasDefaultExport = _symbols.some(function (s) {
1161
1404
  return s.originalName === 'default';
@@ -1163,8 +1406,9 @@ function createRule(fs) {
1163
1406
 
1164
1407
  // Get cross-package source info from the first symbol (all symbols in same group have same source)
1165
1408
  var crossPackageSource = _symbols[0].crossPackageSource;
1409
+ var bridgeExportPath = _symbols[0].barrelBridgeExportPath;
1166
1410
  crossPackageMockGroups.push({
1167
- exportPath: crossPackageSource.exportPath,
1411
+ exportPath: bridgeExportPath !== null && bridgeExportPath !== void 0 ? bridgeExportPath : crossPackageSource.exportPath,
1168
1412
  importPath: _importPath,
1169
1413
  propertyNames: _symbols.map(function (s) {
1170
1414
  return s.symbolName;
@@ -1177,9 +1421,9 @@ function createRule(fs) {
1177
1421
  });
1178
1422
  }
1179
1423
  } catch (err) {
1180
- _iterator18.e(err);
1424
+ _iterator20.e(err);
1181
1425
  } finally {
1182
- _iterator18.f();
1426
+ _iterator20.f();
1183
1427
  }
1184
1428
  if (unmappedSymbols.length > 0) {
1185
1429
  groups.push({
@@ -1221,11 +1465,11 @@ function createRule(fs) {
1221
1465
  if (existingMock && existingMock.node !== node) {
1222
1466
  // Merge properties from existing mock with new properties
1223
1467
  var newPropertiesMap = new Map();
1224
- var _iterator19 = _createForOfIteratorHelper(group.propertyNames),
1225
- _step19;
1468
+ var _iterator21 = _createForOfIteratorHelper(group.propertyNames),
1469
+ _step21;
1226
1470
  try {
1227
- for (_iterator19.s(); !(_step19 = _iterator19.n()).done;) {
1228
- var propName = _step19.value;
1471
+ for (_iterator21.s(); !(_step21 = _iterator21.n()).done;) {
1472
+ var propName = _step21.value;
1229
1473
  var propInfo = mockProperties.get(propName);
1230
1474
  if (propInfo) {
1231
1475
  // Check if this property needs to be renamed (aliased export)
@@ -1246,9 +1490,9 @@ function createRule(fs) {
1246
1490
  }
1247
1491
  }
1248
1492
  } catch (err) {
1249
- _iterator19.e(err);
1493
+ _iterator21.e(err);
1250
1494
  } finally {
1251
- _iterator19.f();
1495
+ _iterator21.f();
1252
1496
  }
1253
1497
  var mergedProperties = mergeMockProperties({
1254
1498
  existingProperties: existingMock.properties,
@@ -1260,10 +1504,10 @@ function createRule(fs) {
1260
1504
  exportPath: group.exportPath,
1261
1505
  importPath: group.importPath,
1262
1506
  propertyNames: Array.from(mergedProperties.keys()),
1263
- propertyTexts: new Map(Array.from(mergedProperties.entries()).map(function (_ref15) {
1264
- var _ref16 = (0, _slicedToArray2.default)(_ref15, 2),
1265
- k = _ref16[0],
1266
- v = _ref16[1];
1507
+ propertyTexts: new Map(Array.from(mergedProperties.entries()).map(function (_ref17) {
1508
+ var _ref18 = (0, _slicedToArray2.default)(_ref17, 2),
1509
+ k = _ref18[0],
1510
+ v = _ref18[1];
1267
1511
  return [k, v.text];
1268
1512
  })),
1269
1513
  nameMapping: new Map(),
@@ -1278,32 +1522,46 @@ function createRule(fs) {
1278
1522
  mergedGroups.push(group);
1279
1523
  }
1280
1524
  }
1281
- var fixText = generateMockFixes({
1282
- groups: mergedGroups,
1283
- crossPackageGroups: crossPackageMockGroups,
1284
- packageName: mockContext.packageName,
1285
- mockProperties: mockProperties,
1286
- quote: quote,
1287
- preambleStatements: preambleStatements
1288
- });
1289
-
1290
- // Build a map of symbol name -> new import path for jest.requireMock() rewriting
1291
1525
  var symbolToNewImportPath = new Map();
1292
1526
  for (var _i4 = 0, _arr = [].concat(mergedGroups, crossPackageMockGroups); _i4 < _arr.length; _i4++) {
1293
1527
  var _group2 = _arr[_i4];
1294
- var _iterator20 = _createForOfIteratorHelper(_group2.propertyNames),
1295
- _step20;
1528
+ var _iterator22 = _createForOfIteratorHelper(_group2.propertyNames),
1529
+ _step22;
1296
1530
  try {
1297
- for (_iterator20.s(); !(_step20 = _iterator20.n()).done;) {
1298
- var _propName = _step20.value;
1531
+ for (_iterator22.s(); !(_step22 = _iterator22.n()).done;) {
1532
+ var _propName = _step22.value;
1299
1533
  symbolToNewImportPath.set(_propName, _group2.importPath);
1300
1534
  }
1301
1535
  } catch (err) {
1302
- _iterator20.e(err);
1536
+ _iterator22.e(err);
1303
1537
  } finally {
1304
- _iterator20.f();
1538
+ _iterator22.f();
1305
1539
  }
1306
1540
  }
1541
+ var fixText = generateMockFixes({
1542
+ groups: mergedGroups,
1543
+ crossPackageGroups: crossPackageMockGroups,
1544
+ packageName: mockContext.packageName,
1545
+ mockProperties: mockProperties,
1546
+ quote: quote,
1547
+ preambleStatements: preambleStatements,
1548
+ propagateEsModuleFromOriginalMock: originalMockHadEsModule,
1549
+ oldBarrelImportPath: oldImportPath,
1550
+ symbolToNewImportPath: symbolToNewImportPath
1551
+ });
1552
+
1553
+ // Post-process fixText to update jest.requireActual('barrel').Symbol
1554
+ // references embedded in property texts (e.g. inside jest.fn callbacks)
1555
+ fixText = fixText.replace(/jest\.requireActual(?:<[^>]*>)?\((['"])([^'"]+)\1\)\.(\w+)/g, function (match, _q, path, symbol) {
1556
+ if (path !== oldImportPath) {
1557
+ return match;
1558
+ }
1559
+ var newPath = symbolToNewImportPath.get(symbol);
1560
+ if (newPath && newPath !== path) {
1561
+ return match.replace(path, newPath);
1562
+ }
1563
+ return match;
1564
+ });
1307
1565
 
1308
1566
  // Sort nodes by position
1309
1567
  var sortedNodesToRemove = nodesToRemove.sort(function (a, b) {
@@ -1350,27 +1608,78 @@ function createRule(fs) {
1350
1608
  return candidatePath === oldImportPath;
1351
1609
  }
1352
1610
  });
1353
- var _iterator21 = _createForOfIteratorHelper(requireMockCalls),
1354
- _step21;
1611
+ var _iterator23 = _createForOfIteratorHelper(requireMockCalls),
1612
+ _step23;
1355
1613
  try {
1356
- for (_iterator21.s(); !(_step21 = _iterator21.n()).done;) {
1357
- var requireMockNode = _step21.value;
1614
+ for (_iterator23.s(); !(_step23 = _iterator23.n()).done;) {
1615
+ var requireMockNode = _step23.value;
1358
1616
  var requireMockArg = requireMockNode.arguments[0];
1359
1617
  if (!requireMockArg) {
1360
1618
  continue;
1361
1619
  }
1362
- var newPath = (0, _jestUtils.resolveNewPathForRequireMock)({
1620
+ var _newPath = (0, _jestUtils.resolveNewPathForRequireMock)({
1363
1621
  requireMockNode: requireMockNode,
1364
1622
  symbolToNewPath: symbolToNewImportPath
1365
1623
  });
1366
- if (newPath) {
1367
- fixes.push(fixer.replaceText(requireMockArg, "".concat(quote).concat(newPath).concat(quote)));
1624
+ if (_newPath) {
1625
+ fixes.push(fixer.replaceText(requireMockArg, "".concat(quote).concat(_newPath).concat(quote)));
1368
1626
  }
1369
1627
  }
1628
+
1629
+ // Fix jest.requireActual() calls that reference the old barrel path.
1630
+ // Only fix calls OUTSIDE the replaced jest.mock node range
1631
+ // (calls inside it are handled via fixText string replacement below).
1632
+ } catch (err) {
1633
+ _iterator23.e(err);
1634
+ } finally {
1635
+ _iterator23.f();
1636
+ }
1637
+ var replacedRanges = sortedNodesToRemove.map(function (n) {
1638
+ return n.range;
1639
+ });
1640
+ var requireActualCalls = (0, _jestUtils.findJestRequireActualCalls)({
1641
+ ast: ast,
1642
+ matchPath: function matchPath(candidatePath) {
1643
+ return candidatePath === oldImportPath;
1644
+ }
1645
+ });
1646
+ var _iterator24 = _createForOfIteratorHelper(requireActualCalls),
1647
+ _step24;
1648
+ try {
1649
+ var _loop = function _loop() {
1650
+ var raNode = _step24.value;
1651
+ var raArg = raNode.arguments[0];
1652
+ if (!raArg || !raNode.range) {
1653
+ return 0; // continue
1654
+ }
1655
+
1656
+ // Skip calls inside any node being replaced (ranges overlap)
1657
+ var insideReplacedNode = replacedRanges.some(function (_ref19) {
1658
+ var _ref20 = (0, _slicedToArray2.default)(_ref19, 2),
1659
+ start = _ref20[0],
1660
+ end = _ref20[1];
1661
+ return raNode.range[0] >= start && raNode.range[1] <= end;
1662
+ });
1663
+ if (insideReplacedNode) {
1664
+ return 0; // continue
1665
+ }
1666
+ var newPath = (0, _jestUtils.resolveNewPathForRequireMock)({
1667
+ requireMockNode: raNode,
1668
+ symbolToNewPath: symbolToNewImportPath
1669
+ });
1670
+ if (newPath) {
1671
+ fixes.push(fixer.replaceText(raArg, "".concat(quote).concat(newPath).concat(quote)));
1672
+ }
1673
+ },
1674
+ _ret;
1675
+ for (_iterator24.s(); !(_step24 = _iterator24.n()).done;) {
1676
+ _ret = _loop();
1677
+ if (_ret === 0) continue;
1678
+ }
1370
1679
  } catch (err) {
1371
- _iterator21.e(err);
1680
+ _iterator24.e(err);
1372
1681
  } finally {
1373
- _iterator21.f();
1682
+ _iterator24.f();
1374
1683
  }
1375
1684
  return fixes;
1376
1685
  }