@atlaskit/eslint-plugin-platform 2.7.2 → 2.9.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.
- package/CHANGELOG.md +16 -0
- package/dist/cjs/index.js +19 -3
- package/dist/cjs/rules/ensure-use-sync-external-store-server-snapshot/index.js +41 -0
- package/dist/cjs/rules/feature-gating/valid-gate-name/index.js +60 -0
- package/dist/cjs/rules/import/no-barrel-entry-imports/index.js +1279 -0
- package/dist/cjs/rules/import/no-barrel-entry-jest-mock/index.js +1659 -0
- package/dist/cjs/rules/import/no-conversation-assistant-barrel-imports/index.js +43 -0
- package/dist/cjs/rules/import/no-jest-mock-barrel-files/index.js +1402 -0
- package/dist/cjs/rules/import/no-relative-barrel-file-imports/index.js +781 -0
- package/dist/cjs/rules/import/shared/barrel-parsing.js +511 -0
- package/dist/cjs/rules/import/shared/file-system.js +186 -0
- package/dist/cjs/rules/import/shared/jest-utils.js +244 -0
- package/dist/cjs/rules/import/shared/package-registry.js +263 -0
- package/dist/cjs/rules/import/shared/package-resolution.js +318 -0
- package/dist/cjs/rules/import/shared/perf.js +89 -0
- package/dist/cjs/rules/import/shared/types.js +67 -0
- package/dist/cjs/rules/visit-example-type-import-required/index.js +409 -0
- package/dist/es2019/index.js +19 -3
- package/dist/es2019/rules/ensure-use-sync-external-store-server-snapshot/index.js +43 -0
- package/dist/es2019/rules/feature-gating/valid-gate-name/index.js +52 -0
- package/dist/es2019/rules/import/no-barrel-entry-imports/index.js +1158 -0
- package/dist/es2019/rules/import/no-barrel-entry-jest-mock/index.js +1341 -0
- package/dist/es2019/rules/import/no-conversation-assistant-barrel-imports/index.js +37 -0
- package/dist/es2019/rules/import/no-jest-mock-barrel-files/index.js +1180 -0
- package/dist/es2019/rules/import/no-relative-barrel-file-imports/index.js +742 -0
- package/dist/es2019/rules/import/shared/barrel-parsing.js +433 -0
- package/dist/es2019/rules/import/shared/file-system.js +174 -0
- package/dist/es2019/rules/import/shared/jest-utils.js +203 -0
- package/dist/es2019/rules/import/shared/package-registry.js +240 -0
- package/dist/es2019/rules/import/shared/package-resolution.js +253 -0
- package/dist/es2019/rules/import/shared/perf.js +83 -0
- package/dist/es2019/rules/import/shared/types.js +57 -0
- package/dist/es2019/rules/visit-example-type-import-required/index.js +375 -0
- package/dist/esm/index.js +19 -3
- package/dist/esm/rules/ensure-use-sync-external-store-server-snapshot/index.js +35 -0
- package/dist/esm/rules/feature-gating/valid-gate-name/index.js +53 -0
- package/dist/esm/rules/import/no-barrel-entry-imports/index.js +1272 -0
- package/dist/esm/rules/import/no-barrel-entry-jest-mock/index.js +1650 -0
- package/dist/esm/rules/import/no-conversation-assistant-barrel-imports/index.js +37 -0
- package/dist/esm/rules/import/no-jest-mock-barrel-files/index.js +1392 -0
- package/dist/esm/rules/import/no-relative-barrel-file-imports/index.js +774 -0
- package/dist/esm/rules/import/shared/barrel-parsing.js +500 -0
- package/dist/esm/rules/import/shared/file-system.js +176 -0
- package/dist/esm/rules/import/shared/jest-utils.js +231 -0
- package/dist/esm/rules/import/shared/package-registry.js +256 -0
- package/dist/esm/rules/import/shared/package-resolution.js +306 -0
- package/dist/esm/rules/import/shared/perf.js +80 -0
- package/dist/esm/rules/import/shared/types.js +61 -0
- package/dist/esm/rules/visit-example-type-import-required/index.js +402 -0
- package/dist/types/index.d.ts +28 -2
- package/dist/types/rules/ensure-use-sync-external-store-server-snapshot/index.d.ts +3 -0
- package/dist/types/rules/feature-gating/valid-gate-name/index.d.ts +3 -0
- package/dist/types/rules/import/no-barrel-entry-imports/index.d.ts +9 -0
- package/dist/types/rules/import/no-barrel-entry-jest-mock/index.d.ts +9 -0
- package/dist/types/rules/import/no-conversation-assistant-barrel-imports/index.d.ts +3 -0
- package/dist/types/rules/import/no-jest-mock-barrel-files/index.d.ts +22 -0
- package/dist/types/rules/import/no-relative-barrel-file-imports/index.d.ts +5 -0
- package/dist/types/rules/import/shared/barrel-parsing.d.ts +30 -0
- package/dist/types/rules/import/shared/file-system.d.ts +38 -0
- package/dist/types/rules/import/shared/jest-utils.d.ts +55 -0
- package/dist/types/rules/import/shared/package-registry.d.ts +26 -0
- package/dist/types/rules/import/shared/package-resolution.d.ts +58 -0
- package/dist/types/rules/import/shared/perf.d.ts +13 -0
- package/dist/types/rules/import/shared/types.d.ts +131 -0
- package/dist/types/rules/visit-example-type-import-required/index.d.ts +4 -0
- package/dist/types-ts4.5/index.d.ts +28 -2
- package/dist/types-ts4.5/rules/import/no-barrel-entry-imports/index.d.ts +9 -0
- package/dist/types-ts4.5/rules/import/no-barrel-entry-jest-mock/index.d.ts +9 -0
- package/dist/types-ts4.5/rules/import/no-conversation-assistant-barrel-imports/index.d.ts +3 -0
- package/dist/types-ts4.5/rules/import/no-jest-mock-barrel-files/index.d.ts +22 -0
- package/dist/types-ts4.5/rules/import/no-relative-barrel-file-imports/index.d.ts +5 -0
- package/dist/types-ts4.5/rules/import/shared/barrel-parsing.d.ts +30 -0
- package/dist/types-ts4.5/rules/import/shared/file-system.d.ts +38 -0
- package/dist/types-ts4.5/rules/import/shared/jest-utils.d.ts +55 -0
- package/dist/types-ts4.5/rules/import/shared/package-registry.d.ts +26 -0
- package/dist/types-ts4.5/rules/import/shared/package-resolution.d.ts +58 -0
- package/dist/types-ts4.5/rules/import/shared/perf.d.ts +13 -0
- package/dist/types-ts4.5/rules/import/shared/types.d.ts +131 -0
- package/dist/types-ts4.5/rules/visit-example-type-import-required/index.d.ts +4 -0
- package/package.json +6 -2
- package/dist/cjs/rules/ensure-native-and-af-exports-synced/index.js +0 -158
- package/dist/es2019/rules/ensure-native-and-af-exports-synced/index.js +0 -146
- package/dist/esm/rules/ensure-native-and-af-exports-synced/index.js +0 -151
- /package/dist/types-ts4.5/rules/{ensure-native-and-af-exports-synced → ensure-use-sync-external-store-server-snapshot}/index.d.ts +0 -0
- /package/dist/{types/rules/ensure-native-and-af-exports-synced → types-ts4.5/rules/feature-gating/valid-gate-name}/index.d.ts +0 -0
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof3 = require("@babel/runtime/helpers/typeof");
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.extractPackageNameFromImport = extractPackageNameFromImport;
|
|
9
|
+
exports.findExportForSourceFile = findExportForSourceFile;
|
|
10
|
+
exports.parsePackageExports = parsePackageExports;
|
|
11
|
+
exports.resolveCrossPackageImport = resolveCrossPackageImport;
|
|
12
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
13
|
+
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
14
|
+
var _path = require("path");
|
|
15
|
+
var ts = _interopRequireWildcard(require("typescript"));
|
|
16
|
+
var _fileSystem = require("./file-system");
|
|
17
|
+
var _packageRegistry = require("./package-registry");
|
|
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" != _typeof3(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 _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; } } }; }
|
|
20
|
+
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; } }
|
|
21
|
+
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; }
|
|
22
|
+
var ENTRY_POINT_FOLDER_NAMES = new Set(['entry-points', 'entrypoints', 'entrypoint', 'entry-point']);
|
|
23
|
+
function isInEntryPointsFolder(filePath) {
|
|
24
|
+
var parts = filePath.split(/[/\\]/);
|
|
25
|
+
return parts.some(function (part) {
|
|
26
|
+
return ENTRY_POINT_FOLDER_NAMES.has(part);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Parse an entry-point wrapper file and resolve the source files it re-exports from,
|
|
31
|
+
* along with name mappings (source export name → entry-point export name).
|
|
32
|
+
*/
|
|
33
|
+
function resolveEntryPointReExports(_ref) {
|
|
34
|
+
var entryPointFilePath = _ref.entryPointFilePath,
|
|
35
|
+
fs = _ref.fs;
|
|
36
|
+
var content = (0, _fileSystem.readFileContent)({
|
|
37
|
+
filePath: entryPointFilePath,
|
|
38
|
+
fs: fs
|
|
39
|
+
});
|
|
40
|
+
if (!content) {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
var sourceFile = ts.createSourceFile(entryPointFilePath, content, ts.ScriptTarget.Latest, true);
|
|
45
|
+
var basedir = (0, _path.dirname)(entryPointFilePath);
|
|
46
|
+
var results = [];
|
|
47
|
+
var _iterator = _createForOfIteratorHelper(sourceFile.statements),
|
|
48
|
+
_step;
|
|
49
|
+
try {
|
|
50
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
51
|
+
var statement = _step.value;
|
|
52
|
+
if (ts.isExportDeclaration(statement) && statement.moduleSpecifier && ts.isStringLiteral(statement.moduleSpecifier)) {
|
|
53
|
+
var modulePath = statement.moduleSpecifier.text;
|
|
54
|
+
if (!(0, _fileSystem.isRelativeImport)(modulePath)) {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
var resolved = (0, _fileSystem.resolveImportPath)({
|
|
58
|
+
basedir: basedir,
|
|
59
|
+
importPath: modulePath,
|
|
60
|
+
fs: fs
|
|
61
|
+
});
|
|
62
|
+
if (!resolved) {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
var nameMap = new Map();
|
|
66
|
+
if (statement.exportClause && ts.isNamedExports(statement.exportClause)) {
|
|
67
|
+
var _iterator2 = _createForOfIteratorHelper(statement.exportClause.elements),
|
|
68
|
+
_step2;
|
|
69
|
+
try {
|
|
70
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
71
|
+
var element = _step2.value;
|
|
72
|
+
var exportedName = element.name.text;
|
|
73
|
+
var sourceName = element.propertyName ? element.propertyName.text : exportedName;
|
|
74
|
+
nameMap.set(sourceName, exportedName);
|
|
75
|
+
}
|
|
76
|
+
} catch (err) {
|
|
77
|
+
_iterator2.e(err);
|
|
78
|
+
} finally {
|
|
79
|
+
_iterator2.f();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
results.push({
|
|
83
|
+
sourcePath: resolved,
|
|
84
|
+
nameMap: nameMap
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
} catch (err) {
|
|
89
|
+
_iterator.e(err);
|
|
90
|
+
} finally {
|
|
91
|
+
_iterator.f();
|
|
92
|
+
}
|
|
93
|
+
return results;
|
|
94
|
+
} catch (_unused) {
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Parse the package.json exports field and return a map of export paths to resolved file paths.
|
|
101
|
+
*/
|
|
102
|
+
function parsePackageExports(_ref2) {
|
|
103
|
+
var packageDir = _ref2.packageDir,
|
|
104
|
+
fs = _ref2.fs;
|
|
105
|
+
// Memoize per-package to avoid repeated reads/parses during IDE lint runs.
|
|
106
|
+
// Additionally, invalidate per-package if the package.json mtime changes
|
|
107
|
+
// (covers unstaged local edits in IDE).
|
|
108
|
+
if (!fs.cache.packageExportsByDir) {
|
|
109
|
+
fs.cache.packageExportsByDir = new Map();
|
|
110
|
+
}
|
|
111
|
+
var packageJsonPath = (0, _path.join)(packageDir, 'package.json');
|
|
112
|
+
var currentMtimeMs = null;
|
|
113
|
+
try {
|
|
114
|
+
var _fs$statSync$mtimeMs;
|
|
115
|
+
currentMtimeMs = (_fs$statSync$mtimeMs = fs.statSync(packageJsonPath).mtimeMs) !== null && _fs$statSync$mtimeMs !== void 0 ? _fs$statSync$mtimeMs : null;
|
|
116
|
+
} catch (_unused2) {
|
|
117
|
+
// If package.json can't be stat'ed (missing/inaccessible), use null to force re-read
|
|
118
|
+
currentMtimeMs = null;
|
|
119
|
+
}
|
|
120
|
+
var cached = fs.cache.packageExportsByDir.get(packageDir);
|
|
121
|
+
// Only use cache if we have a valid mtime and it matches
|
|
122
|
+
if (cached && currentMtimeMs !== null && cached.packageJsonMtimeMs === currentMtimeMs) {
|
|
123
|
+
return cached.exportsMap;
|
|
124
|
+
}
|
|
125
|
+
var exportsMap = new Map();
|
|
126
|
+
try {
|
|
127
|
+
var content = (0, _fileSystem.readFileContent)({
|
|
128
|
+
filePath: packageJsonPath,
|
|
129
|
+
fs: fs
|
|
130
|
+
});
|
|
131
|
+
if (!content) {
|
|
132
|
+
return exportsMap;
|
|
133
|
+
}
|
|
134
|
+
var packageJson = JSON.parse(content);
|
|
135
|
+
var exports = packageJson.exports;
|
|
136
|
+
if (!exports || (0, _typeof2.default)(exports) !== 'object') {
|
|
137
|
+
return exportsMap;
|
|
138
|
+
}
|
|
139
|
+
for (var _i = 0, _Object$entries = Object.entries(exports); _i < _Object$entries.length; _i++) {
|
|
140
|
+
var _Object$entries$_i = (0, _slicedToArray2.default)(_Object$entries[_i], 2),
|
|
141
|
+
exportPath = _Object$entries$_i[0],
|
|
142
|
+
exportValue = _Object$entries$_i[1];
|
|
143
|
+
// Handle both simple string values and conditional exports objects
|
|
144
|
+
var resolvedPath = null;
|
|
145
|
+
if (typeof exportValue === 'string') {
|
|
146
|
+
resolvedPath = exportValue;
|
|
147
|
+
} else if ((0, _typeof2.default)(exportValue) === 'object' && exportValue !== null) {
|
|
148
|
+
// Handle conditional exports like { "import": "./...", "require": "./..." }
|
|
149
|
+
// Prefer "import" or "default" or first available
|
|
150
|
+
var condExports = exportValue;
|
|
151
|
+
resolvedPath = condExports['import'] || condExports['default'] || Object.values(condExports)[0];
|
|
152
|
+
}
|
|
153
|
+
if (resolvedPath && typeof resolvedPath === 'string') {
|
|
154
|
+
// Resolve the path relative to the package directory
|
|
155
|
+
var absolutePath = (0, _fileSystem.resolveImportPath)({
|
|
156
|
+
basedir: packageDir,
|
|
157
|
+
importPath: resolvedPath,
|
|
158
|
+
fs: fs
|
|
159
|
+
});
|
|
160
|
+
if (absolutePath) {
|
|
161
|
+
exportsMap.set(exportPath, absolutePath);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
} catch (_unused3) {
|
|
166
|
+
// Ignore parsing errors
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Cache even empty maps to avoid re-reading invalid/missing exports repeatedly.
|
|
170
|
+
fs.cache.packageExportsByDir.set(packageDir, {
|
|
171
|
+
packageJsonMtimeMs: currentMtimeMs,
|
|
172
|
+
exportsMap: exportsMap
|
|
173
|
+
});
|
|
174
|
+
return exportsMap;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Find a matching export entry for a given source file path.
|
|
178
|
+
* Returns the export path (e.g., "./controllers/analytics") or null if not found.
|
|
179
|
+
*
|
|
180
|
+
* When `fs` is provided, also checks entry-point wrapper files. If an export resolves
|
|
181
|
+
* to a file inside a recognized entry-points folder (entry-points, entrypoints, etc.),
|
|
182
|
+
* the wrapper is parsed to see if it re-exports from `sourceFilePath`.
|
|
183
|
+
*
|
|
184
|
+
* `sourceExportName` is the name under which the symbol is exported from the source file
|
|
185
|
+
* (e.g. `'default'`). Used to look up the corresponding entry-point export name so the
|
|
186
|
+
* caller can generate the correct import style.
|
|
187
|
+
*/
|
|
188
|
+
function findExportForSourceFile(_ref3) {
|
|
189
|
+
var sourceFilePath = _ref3.sourceFilePath,
|
|
190
|
+
exportsMap = _ref3.exportsMap,
|
|
191
|
+
fs = _ref3.fs,
|
|
192
|
+
sourceExportName = _ref3.sourceExportName;
|
|
193
|
+
var _iterator3 = _createForOfIteratorHelper(exportsMap),
|
|
194
|
+
_step3;
|
|
195
|
+
try {
|
|
196
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
197
|
+
var _step3$value = (0, _slicedToArray2.default)(_step3.value, 2),
|
|
198
|
+
_exportPath = _step3$value[0],
|
|
199
|
+
_resolvedPath = _step3$value[1];
|
|
200
|
+
if (_resolvedPath === sourceFilePath) {
|
|
201
|
+
return {
|
|
202
|
+
exportPath: _exportPath
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
} catch (err) {
|
|
207
|
+
_iterator3.e(err);
|
|
208
|
+
} finally {
|
|
209
|
+
_iterator3.f();
|
|
210
|
+
}
|
|
211
|
+
if (fs) {
|
|
212
|
+
var _iterator4 = _createForOfIteratorHelper(exportsMap),
|
|
213
|
+
_step4;
|
|
214
|
+
try {
|
|
215
|
+
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
|
216
|
+
var _step4$value = (0, _slicedToArray2.default)(_step4.value, 2),
|
|
217
|
+
exportPath = _step4$value[0],
|
|
218
|
+
resolvedPath = _step4$value[1];
|
|
219
|
+
if (isInEntryPointsFolder(resolvedPath)) {
|
|
220
|
+
var reExports = resolveEntryPointReExports({
|
|
221
|
+
entryPointFilePath: resolvedPath,
|
|
222
|
+
fs: fs
|
|
223
|
+
});
|
|
224
|
+
var _iterator5 = _createForOfIteratorHelper(reExports),
|
|
225
|
+
_step5;
|
|
226
|
+
try {
|
|
227
|
+
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
|
|
228
|
+
var reExport = _step5.value;
|
|
229
|
+
if (reExport.sourcePath === sourceFilePath) {
|
|
230
|
+
var entryPointExportName = void 0;
|
|
231
|
+
if (sourceExportName !== undefined && reExport.nameMap.has(sourceExportName)) {
|
|
232
|
+
entryPointExportName = reExport.nameMap.get(sourceExportName);
|
|
233
|
+
}
|
|
234
|
+
return {
|
|
235
|
+
exportPath: exportPath,
|
|
236
|
+
entryPointExportName: entryPointExportName
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
} catch (err) {
|
|
241
|
+
_iterator5.e(err);
|
|
242
|
+
} finally {
|
|
243
|
+
_iterator5.f();
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
} catch (err) {
|
|
248
|
+
_iterator4.e(err);
|
|
249
|
+
} finally {
|
|
250
|
+
_iterator4.f();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return null;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Extract the package name and subpath from an import specifier.
|
|
258
|
+
* Returns null if the import is not a scoped package import.
|
|
259
|
+
*/
|
|
260
|
+
function extractPackageNameFromImport(moduleSpecifier) {
|
|
261
|
+
var match = moduleSpecifier.match(/^(@[^/]+\/[^/]+)(\/.*)?$/);
|
|
262
|
+
if (!match) {
|
|
263
|
+
return null;
|
|
264
|
+
}
|
|
265
|
+
return {
|
|
266
|
+
packageName: match[1],
|
|
267
|
+
subPath: match[2] || ''
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Resolve a cross-package import to its package directory and export info.
|
|
273
|
+
* Returns null if the package is not in the target folder or cannot be resolved.
|
|
274
|
+
*/
|
|
275
|
+
function resolveCrossPackageImport(_ref4) {
|
|
276
|
+
var moduleSpecifier = _ref4.moduleSpecifier,
|
|
277
|
+
workspaceRoot = _ref4.workspaceRoot,
|
|
278
|
+
fs = _ref4.fs;
|
|
279
|
+
// Only handle @atlassian/* scoped packages
|
|
280
|
+
var parsed = extractPackageNameFromImport(moduleSpecifier);
|
|
281
|
+
if (!parsed) {
|
|
282
|
+
return null;
|
|
283
|
+
}
|
|
284
|
+
var packageName = parsed.packageName,
|
|
285
|
+
subPath = parsed.subPath;
|
|
286
|
+
|
|
287
|
+
// Check if package is in target folder
|
|
288
|
+
var packageDir = (0, _packageRegistry.findPackageInRegistry)({
|
|
289
|
+
packageName: packageName,
|
|
290
|
+
workspaceRoot: workspaceRoot,
|
|
291
|
+
fs: fs
|
|
292
|
+
});
|
|
293
|
+
if (!packageDir) {
|
|
294
|
+
return null;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// Parse package.json exports
|
|
298
|
+
var exportsMap = parsePackageExports({
|
|
299
|
+
packageDir: packageDir,
|
|
300
|
+
fs: fs
|
|
301
|
+
});
|
|
302
|
+
if (exportsMap.size === 0) {
|
|
303
|
+
return null;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// Determine the export path (e.g., '.' or './utils')
|
|
307
|
+
var exportPath = subPath ? '.' + subPath : '.';
|
|
308
|
+
var entryFilePath = exportsMap.get(exportPath);
|
|
309
|
+
if (!entryFilePath) {
|
|
310
|
+
return null;
|
|
311
|
+
}
|
|
312
|
+
return {
|
|
313
|
+
packageName: packageName,
|
|
314
|
+
packageDir: packageDir,
|
|
315
|
+
exportPath: exportPath,
|
|
316
|
+
entryFilePath: entryFilePath
|
|
317
|
+
};
|
|
318
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.PERF_ENV_VAR = void 0;
|
|
7
|
+
exports.isPerfEnabled = isPerfEnabled;
|
|
8
|
+
exports.perfInc = perfInc;
|
|
9
|
+
exports.perfTime = perfTime;
|
|
10
|
+
var PERF_ENV_VAR = exports.PERF_ENV_VAR = 'INTERNAL_ESLINT_BARREL_PERF';
|
|
11
|
+
function nowMs() {
|
|
12
|
+
// eslint-disable-next-line no-restricted-globals
|
|
13
|
+
return typeof performance !== 'undefined' && performance.now ? performance.now() : Date.now();
|
|
14
|
+
}
|
|
15
|
+
function isPerfEnabled() {
|
|
16
|
+
return process.env[PERF_ENV_VAR] === '1' || process.env[PERF_ENV_VAR] === 'true';
|
|
17
|
+
}
|
|
18
|
+
function ensurePerfInitialized(_ref) {
|
|
19
|
+
var fs = _ref.fs;
|
|
20
|
+
if (!fs.cache.perf) {
|
|
21
|
+
fs.cache.perf = {
|
|
22
|
+
installedExitHook: false,
|
|
23
|
+
counters: {},
|
|
24
|
+
timers: {}
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function ensureExitHookInstalled(_ref2) {
|
|
29
|
+
var fs = _ref2.fs;
|
|
30
|
+
if (!isPerfEnabled()) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
ensurePerfInitialized({
|
|
34
|
+
fs: fs
|
|
35
|
+
});
|
|
36
|
+
if (fs.cache.perf.installedExitHook) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
fs.cache.perf.installedExitHook = true;
|
|
40
|
+
// eslint-disable-next-line no-console
|
|
41
|
+
console.error("[eslint-plugin-internal] perf enabled via ".concat(PERF_ENV_VAR));
|
|
42
|
+
process.once('exit', function () {
|
|
43
|
+
var _fs$cache$perf$counte, _fs$cache$perf, _fs$cache$perf$timers, _fs$cache$perf2;
|
|
44
|
+
// eslint-disable-next-line no-console
|
|
45
|
+
console.error("[eslint-plugin-internal] perf exit hook fired (".concat(PERF_ENV_VAR, ")"));
|
|
46
|
+
// eslint-disable-next-line no-console
|
|
47
|
+
console.log("[eslint-plugin-internal] perf summary (".concat(PERF_ENV_VAR, ")"));
|
|
48
|
+
// eslint-disable-next-line no-console
|
|
49
|
+
console.log(JSON.stringify({
|
|
50
|
+
counters: (_fs$cache$perf$counte = (_fs$cache$perf = fs.cache.perf) === null || _fs$cache$perf === void 0 ? void 0 : _fs$cache$perf.counters) !== null && _fs$cache$perf$counte !== void 0 ? _fs$cache$perf$counte : {},
|
|
51
|
+
timers: (_fs$cache$perf$timers = (_fs$cache$perf2 = fs.cache.perf) === null || _fs$cache$perf2 === void 0 ? void 0 : _fs$cache$perf2.timers) !== null && _fs$cache$perf$timers !== void 0 ? _fs$cache$perf$timers : {}
|
|
52
|
+
}, null, 2));
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
function perfInc(_ref3) {
|
|
56
|
+
var _perf$counters$key;
|
|
57
|
+
var fs = _ref3.fs,
|
|
58
|
+
key = _ref3.key,
|
|
59
|
+
_ref3$by = _ref3.by,
|
|
60
|
+
by = _ref3$by === void 0 ? 1 : _ref3$by;
|
|
61
|
+
if (!isPerfEnabled()) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
ensureExitHookInstalled({
|
|
65
|
+
fs: fs
|
|
66
|
+
});
|
|
67
|
+
var perf = fs.cache.perf;
|
|
68
|
+
perf.counters[key] = ((_perf$counters$key = perf.counters[key]) !== null && _perf$counters$key !== void 0 ? _perf$counters$key : 0) + by;
|
|
69
|
+
}
|
|
70
|
+
function perfTime(_ref4) {
|
|
71
|
+
var fs = _ref4.fs,
|
|
72
|
+
key = _ref4.key,
|
|
73
|
+
fn = _ref4.fn;
|
|
74
|
+
if (!isPerfEnabled()) {
|
|
75
|
+
return fn();
|
|
76
|
+
}
|
|
77
|
+
ensureExitHookInstalled({
|
|
78
|
+
fs: fs
|
|
79
|
+
});
|
|
80
|
+
var perf = fs.cache.perf;
|
|
81
|
+
var start = nowMs();
|
|
82
|
+
try {
|
|
83
|
+
return fn();
|
|
84
|
+
} finally {
|
|
85
|
+
var _perf$timers$key;
|
|
86
|
+
var duration = nowMs() - start;
|
|
87
|
+
perf.timers[key] = ((_perf$timers$key = perf.timers[key]) !== null && _perf$timers$key !== void 0 ? _perf$timers$key : 0) + duration;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.realFileSystem = void 0;
|
|
8
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
9
|
+
var _child_process = require("child_process");
|
|
10
|
+
var _fs = require("fs");
|
|
11
|
+
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; }
|
|
12
|
+
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; }
|
|
13
|
+
/**
|
|
14
|
+
* Directory entry returned by readdirSync with withFileTypes option.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* State for the package registry cache.
|
|
19
|
+
* This is used to cache package name to directory mappings for efficient lookups.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Cache structure for file system operations.
|
|
24
|
+
* Contains both package registry cache and workspace root cache.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* File system abstraction for testability.
|
|
29
|
+
* This interface allows the core logic to be tested with mock file systems.
|
|
30
|
+
* The cache property holds package resolution state and can be passed as an empty
|
|
31
|
+
* object for tests to ensure fresh state for each test case.
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Real file system implementation using Node.js fs module.
|
|
36
|
+
*/
|
|
37
|
+
var realFileSystem = exports.realFileSystem = {
|
|
38
|
+
existsSync: _fs.existsSync,
|
|
39
|
+
readFileSync: _fs.readFileSync,
|
|
40
|
+
realpathSync: _fs.realpathSync,
|
|
41
|
+
statSync: _fs.statSync,
|
|
42
|
+
readdirSync: function readdirSync(path, options) {
|
|
43
|
+
return (0, _fs.readdirSync)(path, options);
|
|
44
|
+
},
|
|
45
|
+
execSync: function execSync(command, options) {
|
|
46
|
+
try {
|
|
47
|
+
return (0, _child_process.execSync)(command, _objectSpread(_objectSpread({}, options), {}, {
|
|
48
|
+
encoding: 'utf-8'
|
|
49
|
+
})).trim();
|
|
50
|
+
} catch (_unused) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
cache: {}
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Information about cross-package re-export origin.
|
|
59
|
+
*/
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Information about where an export originates.
|
|
63
|
+
*/
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Context for package resolution operations.
|
|
67
|
+
*/
|