@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.
- package/CHANGELOG.md +14 -0
- package/dist/cjs/index.js +17 -9
- package/dist/cjs/rules/constants.js +1 -1
- package/dist/cjs/rules/ensure-critical-dependency-resolutions/index.js +5 -5
- package/dist/cjs/rules/ensure-no-private-dependencies/index.js +48 -66
- package/dist/cjs/rules/feature-gating/inline-usage/index.js +14 -3
- package/dist/cjs/rules/feature-gating/no-alias/index.js +1 -1
- package/dist/cjs/rules/feature-gating/no-module-level-eval/index.js +1 -1
- package/dist/cjs/rules/feature-gating/no-module-level-eval-nav4/index.js +1 -1
- package/dist/cjs/rules/feature-gating/no-preconditioning/index.js +4 -1
- package/dist/cjs/rules/feature-gating/prefer-fg/index.js +1 -1
- package/dist/cjs/rules/feature-gating/static-feature-flags/index.js +2 -2
- package/dist/cjs/rules/feature-gating/use-recommended-utils/index.js +1 -1
- package/dist/cjs/rules/feature-gating/valid-gate-name/index.js +60 -0
- package/dist/cjs/rules/import/no-barrel-entry-imports/index.js +871 -0
- package/dist/cjs/rules/import/no-barrel-entry-jest-mock/index.js +1384 -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 +1401 -0
- package/dist/cjs/rules/import/no-relative-barrel-file-imports/index.js +777 -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 +191 -0
- package/dist/cjs/rules/import/shared/package-registry.js +263 -0
- package/dist/cjs/rules/import/shared/package-resolution.js +185 -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/no-invalid-storybook-decorator-usage/index.js +1 -1
- package/dist/cjs/rules/no-sparse-checkout/index.js +1 -1
- package/dist/cjs/rules/prefer-crypto-random-uuid/index.js +87 -0
- package/dist/cjs/rules/use-entrypoints-in-examples/index.js +1 -1
- package/dist/es2019/index.js +17 -9
- package/dist/es2019/rules/constants.js +1 -1
- package/dist/es2019/rules/ensure-critical-dependency-resolutions/index.js +5 -5
- package/dist/es2019/rules/ensure-no-private-dependencies/index.js +10 -9
- package/dist/es2019/rules/feature-gating/inline-usage/index.js +14 -3
- package/dist/es2019/rules/feature-gating/no-alias/index.js +1 -1
- package/dist/es2019/rules/feature-gating/no-module-level-eval/index.js +1 -1
- package/dist/es2019/rules/feature-gating/no-module-level-eval-nav4/index.js +1 -1
- package/dist/es2019/rules/feature-gating/no-preconditioning/index.js +4 -1
- package/dist/es2019/rules/feature-gating/prefer-fg/index.js +1 -1
- package/dist/es2019/rules/feature-gating/static-feature-flags/index.js +2 -2
- package/dist/es2019/rules/feature-gating/use-recommended-utils/index.js +1 -1
- package/dist/es2019/rules/feature-gating/valid-gate-name/index.js +52 -0
- package/dist/es2019/rules/import/no-barrel-entry-imports/index.js +801 -0
- package/dist/es2019/rules/import/no-barrel-entry-jest-mock/index.js +1113 -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 +1179 -0
- package/dist/es2019/rules/import/no-relative-barrel-file-imports/index.js +738 -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 +159 -0
- package/dist/es2019/rules/import/shared/package-registry.js +240 -0
- package/dist/es2019/rules/import/shared/package-resolution.js +161 -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/no-invalid-storybook-decorator-usage/index.js +1 -1
- package/dist/es2019/rules/no-sparse-checkout/index.js +1 -1
- package/dist/es2019/rules/prefer-crypto-random-uuid/index.js +81 -0
- package/dist/es2019/rules/use-entrypoints-in-examples/index.js +1 -1
- package/dist/esm/index.js +17 -9
- package/dist/esm/rules/constants.js +1 -1
- package/dist/esm/rules/ensure-critical-dependency-resolutions/index.js +5 -5
- package/dist/esm/rules/ensure-no-private-dependencies/index.js +48 -65
- package/dist/esm/rules/feature-gating/inline-usage/index.js +14 -3
- package/dist/esm/rules/feature-gating/no-alias/index.js +1 -1
- package/dist/esm/rules/feature-gating/no-module-level-eval/index.js +1 -1
- package/dist/esm/rules/feature-gating/no-module-level-eval-nav4/index.js +1 -1
- package/dist/esm/rules/feature-gating/no-preconditioning/index.js +4 -1
- package/dist/esm/rules/feature-gating/prefer-fg/index.js +1 -1
- package/dist/esm/rules/feature-gating/static-feature-flags/index.js +2 -2
- package/dist/esm/rules/feature-gating/use-recommended-utils/index.js +1 -1
- package/dist/esm/rules/feature-gating/valid-gate-name/index.js +53 -0
- package/dist/esm/rules/import/no-barrel-entry-imports/index.js +864 -0
- package/dist/esm/rules/import/no-barrel-entry-jest-mock/index.js +1375 -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 +1391 -0
- package/dist/esm/rules/import/no-relative-barrel-file-imports/index.js +770 -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 +179 -0
- package/dist/esm/rules/import/shared/package-registry.js +256 -0
- package/dist/esm/rules/import/shared/package-resolution.js +175 -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/no-invalid-storybook-decorator-usage/index.js +1 -1
- package/dist/esm/rules/no-sparse-checkout/index.js +1 -1
- package/dist/esm/rules/prefer-crypto-random-uuid/index.js +81 -0
- package/dist/esm/rules/use-entrypoints-in-examples/index.js +1 -1
- package/dist/types/index.d.ts +18 -16
- 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 +47 -0
- package/dist/types/rules/import/shared/package-registry.d.ts +26 -0
- package/dist/types/rules/import/shared/package-resolution.d.ts +38 -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/prefer-crypto-random-uuid/index.d.ts +3 -0
- package/dist/types-ts4.5/index.d.ts +18 -28
- 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-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 +47 -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 +38 -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/package.json +4 -5
- package/dist/cjs/rules/ensure-feature-flag-prefix/index.js +0 -75
- package/dist/cjs/rules/ensure-native-and-af-exports-synced/index.js +0 -158
- package/dist/es2019/rules/ensure-feature-flag-prefix/index.js +0 -65
- package/dist/es2019/rules/ensure-native-and-af-exports-synced/index.js +0 -146
- package/dist/esm/rules/ensure-feature-flag-prefix/index.js +0 -69
- package/dist/esm/rules/ensure-native-and-af-exports-synced/index.js +0 -151
- /package/dist/types/rules/{ensure-native-and-af-exports-synced → feature-gating/valid-gate-name}/index.d.ts +0 -0
- /package/dist/types-ts4.5/rules/{ensure-feature-flag-prefix → feature-gating/valid-gate-name}/index.d.ts +0 -0
- /package/dist/types-ts4.5/rules/{ensure-native-and-af-exports-synced → import/no-conversation-assistant-barrel-imports}/index.d.ts +0 -0
- /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
|
+
}
|