@teambit/dependencies 1.0.82 → 1.0.83

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 (43) hide show
  1. package/dependencies-loader/README.md +34 -0
  2. package/dependencies-loader/apply-overrides.ts +552 -0
  3. package/dependencies-loader/auto-detect-deps.ts +761 -0
  4. package/dependencies-loader/dependencies-data.ts +47 -0
  5. package/dependencies-loader/dependencies-loader.ts +174 -0
  6. package/dependencies-loader/dependencies-versions-resolver.ts +160 -0
  7. package/dependencies-loader/index.ts +2 -0
  8. package/dependencies-loader/overrides-dependencies.ts +115 -0
  9. package/dependencies-loader/package-to-definetly-typed.spec.ts +53 -0
  10. package/dependencies-loader/package-to-definetly-typed.ts +10 -0
  11. package/dist/dependencies-loader/README.md +34 -0
  12. package/dist/dependencies-loader/apply-overrides.d.ts +100 -0
  13. package/dist/dependencies-loader/apply-overrides.js +541 -0
  14. package/dist/dependencies-loader/apply-overrides.js.map +1 -0
  15. package/dist/dependencies-loader/auto-detect-deps.d.ts +165 -0
  16. package/dist/dependencies-loader/auto-detect-deps.js +768 -0
  17. package/dist/dependencies-loader/auto-detect-deps.js.map +1 -0
  18. package/dist/dependencies-loader/dependencies-data.d.ts +17 -0
  19. package/dist/dependencies-loader/dependencies-data.js +72 -0
  20. package/dist/dependencies-loader/dependencies-data.js.map +1 -0
  21. package/dist/dependencies-loader/dependencies-loader.d.ts +30 -0
  22. package/dist/dependencies-loader/dependencies-loader.js +229 -0
  23. package/dist/dependencies-loader/dependencies-loader.js.map +1 -0
  24. package/dist/dependencies-loader/dependencies-versions-resolver.d.ts +6 -0
  25. package/dist/dependencies-loader/dependencies-versions-resolver.js +153 -0
  26. package/dist/dependencies-loader/dependencies-versions-resolver.js.map +1 -0
  27. package/dist/dependencies-loader/index.d.ts +2 -0
  28. package/dist/dependencies-loader/index.js +33 -0
  29. package/dist/dependencies-loader/index.js.map +1 -0
  30. package/dist/dependencies-loader/overrides-dependencies.d.ts +17 -0
  31. package/dist/dependencies-loader/overrides-dependencies.js +118 -0
  32. package/dist/dependencies-loader/overrides-dependencies.js.map +1 -0
  33. package/dist/dependencies-loader/package-to-definetly-typed.d.ts +1 -0
  34. package/dist/dependencies-loader/package-to-definetly-typed.js +18 -0
  35. package/dist/dependencies-loader/package-to-definetly-typed.js.map +1 -0
  36. package/dist/dependencies-loader/package-to-definetly-typed.spec.d.ts +1 -0
  37. package/dist/dependencies-loader/package-to-definetly-typed.spec.js +27 -0
  38. package/dist/dependencies-loader/package-to-definetly-typed.spec.js.map +1 -0
  39. package/dist/dependencies.main.runtime.d.ts +21 -4
  40. package/dist/dependencies.main.runtime.js +49 -14
  41. package/dist/dependencies.main.runtime.js.map +1 -1
  42. package/package.json +17 -6
  43. /package/dist/{preview-1701813377689.js → preview-1701874572488.js} +0 -0
@@ -0,0 +1,100 @@
1
+ import { ComponentID } from '@teambit/component-id';
2
+ import { IssuesList } from '@teambit/component-issues';
3
+ import Component from '@teambit/legacy/dist/consumer/component/consumer-component';
4
+ import { Workspace } from '@teambit/workspace';
5
+ import { Dependency } from '@teambit/legacy/dist/consumer/component/dependencies';
6
+ import { DependencyResolverMain } from '@teambit/dependency-resolver';
7
+ import Consumer from '@teambit/legacy/dist/consumer/consumer';
8
+ import OverridesDependencies from './overrides-dependencies';
9
+ import { DependenciesData } from './dependencies-data';
10
+ import { DebugDependencies } from './auto-detect-deps';
11
+ export declare type AllDependencies = {
12
+ dependencies: Dependency[];
13
+ devDependencies: Dependency[];
14
+ };
15
+ export declare type AllPackagesDependencies = {
16
+ packageDependencies: Record<string, string>;
17
+ devPackageDependencies: Record<string, string>;
18
+ peerPackageDependencies: Record<string, string>;
19
+ };
20
+ export declare class ApplyOverrides {
21
+ private component;
22
+ private depsResolver;
23
+ private workspace?;
24
+ componentId: ComponentID;
25
+ componentFromModel: Component;
26
+ allDependencies: AllDependencies;
27
+ allPackagesDependencies: AllPackagesDependencies;
28
+ /**
29
+ * This will store a copy of the package deps before removal
30
+ * in order to apply auto detected rules that are running after the removal
31
+ */
32
+ originAllPackagesDependencies: AllPackagesDependencies;
33
+ issues: IssuesList;
34
+ coreAspects: string[];
35
+ processedFiles: string[];
36
+ overridesDependencies: OverridesDependencies;
37
+ debugDependenciesData: DebugDependencies;
38
+ autoDetectOverrides: Record<string, any> | undefined;
39
+ constructor(component: Component, depsResolver: DependencyResolverMain, workspace?: Workspace | undefined);
40
+ get consumer(): Consumer | undefined;
41
+ getDependenciesData(): Promise<{
42
+ dependenciesData: DependenciesData;
43
+ overridesDependencies: OverridesDependencies;
44
+ autoDetectOverrides?: Record<string, any>;
45
+ }>;
46
+ /**
47
+ * Given the tree of file dependencies from the driver, find the components of these files.
48
+ * Each dependency file has a path, use bit.map to search for the component name by that path.
49
+ * If the component is found, add it to "this.allDependencies.dependencies". Otherwise, add it to "this.issues.untrackedDependencies".
50
+ *
51
+ * For the found components, add their sourceRelativePath and destinationRelativePath, they are being used for
52
+ * generating links upon import:
53
+ * sourceRelativePath - location of the link file.
54
+ * destinationRelativePath - destination written inside the link file.
55
+ *
56
+ * When a dependency is found in a regular (implementation) file, it goes to `dependencies`. If
57
+ * it found on a test file, it goes to `devDependencies`.
58
+ * Similarly, when a package is found in a regular file, it goes to `packageDependencies`. When
59
+ * if found in a test file, it goes to `devPackageDependencies`.
60
+ * An exception for the above is when a package is required in a regular or test file but is also
61
+ * mentioned in the `package.json` file as a peerDependency, in that case, the package is added
62
+ * to `peerPackageDependencies` and removed from other places. Unless this package is overridden
63
+ * and marked as ignored in the consumer or component config file.
64
+ */
65
+ private populateDependencies;
66
+ private removeIgnoredComponentsByOverrides;
67
+ private loadAutoDetectOverrides;
68
+ private cloneAllPackagesDependencies;
69
+ private removeIgnoredPackagesByOverrides;
70
+ private _resolvePackageData;
71
+ private _getComponentIdToAdd;
72
+ getDependenciesToAddManually(packageJson: Record<string, any> | null | undefined, existingDependencies: AllDependencies): {
73
+ components: Record<string, any>;
74
+ packages: Record<string, any>;
75
+ } | undefined;
76
+ private manuallyAddDependencies;
77
+ /**
78
+ * Remove the dependencies which appear both in dev and regular deps from the dev
79
+ * Because if a dependency is both dev dependency and regular dependency it should be treated as regular one
80
+ * Apply for both packages and components dependencies
81
+ */
82
+ private removeDevAndEnvDepsIfTheyAlsoRegulars;
83
+ private applyPeersFromComponentModel;
84
+ private applyPackageJson;
85
+ private applyWorkspacePolicy;
86
+ /**
87
+ * It removes the @teambit/legacy dependency from the dependencies/devDeps and adds it as a peer dependency with ^.
88
+ */
89
+ private makeLegacyAsPeer;
90
+ private applyAutoDetectOverridesOnComponent;
91
+ private applyAutoDetectedPeersFromEnvOnEnvItSelf;
92
+ /**
93
+ * returns `package.json` of the component when it's imported, or `package.json` of the workspace
94
+ * when it's authored.
95
+ */
96
+ private _getPackageJson;
97
+ private _getPackageJsonFromComponentModel;
98
+ private setLegacyInsideHarmonyIssue;
99
+ private _pkgFieldMapping;
100
+ }
@@ -0,0 +1,541 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ApplyOverrides = void 0;
7
+ function _ramda() {
8
+ const data = _interopRequireDefault(require("ramda"));
9
+ _ramda = function () {
10
+ return data;
11
+ };
12
+ return data;
13
+ }
14
+ function _path() {
15
+ const data = _interopRequireDefault(require("path"));
16
+ _path = function () {
17
+ return data;
18
+ };
19
+ return data;
20
+ }
21
+ function _componentId() {
22
+ const data = require("@teambit/component-id");
23
+ _componentId = function () {
24
+ return data;
25
+ };
26
+ return data;
27
+ }
28
+ function _lodash() {
29
+ const data = require("lodash");
30
+ _lodash = function () {
31
+ return data;
32
+ };
33
+ return data;
34
+ }
35
+ function _componentIssues() {
36
+ const data = require("@teambit/component-issues");
37
+ _componentIssues = function () {
38
+ return data;
39
+ };
40
+ return data;
41
+ }
42
+ function _constants() {
43
+ const data = require("@teambit/legacy/dist/constants");
44
+ _constants = function () {
45
+ return data;
46
+ };
47
+ return data;
48
+ }
49
+ function _packageJsonFile() {
50
+ const data = _interopRequireDefault(require("@teambit/legacy/dist/consumer/component/package-json-file"));
51
+ _packageJsonFile = function () {
52
+ return data;
53
+ };
54
+ return data;
55
+ }
56
+ function _packages() {
57
+ const data = require("@teambit/legacy/dist/utils/packages");
58
+ _packages = function () {
59
+ return data;
60
+ };
61
+ return data;
62
+ }
63
+ function _dependencies() {
64
+ const data = require("@teambit/legacy/dist/consumer/component/dependencies");
65
+ _dependencies = function () {
66
+ return data;
67
+ };
68
+ return data;
69
+ }
70
+ function _overridesDependencies() {
71
+ const data = _interopRequireDefault(require("./overrides-dependencies"));
72
+ _overridesDependencies = function () {
73
+ return data;
74
+ };
75
+ return data;
76
+ }
77
+ function _dependenciesData() {
78
+ const data = require("./dependencies-data");
79
+ _dependenciesData = function () {
80
+ return data;
81
+ };
82
+ return data;
83
+ }
84
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
85
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
86
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
87
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
88
+ const DepsKeysToAllPackagesDepsKeys = {
89
+ dependencies: 'packageDependencies',
90
+ devDependencies: 'devPackageDependencies',
91
+ peerDependencies: 'peerPackageDependencies'
92
+ };
93
+ class ApplyOverrides {
94
+ constructor(component, depsResolver, workspace) {
95
+ this.component = component;
96
+ this.depsResolver = depsResolver;
97
+ this.workspace = workspace;
98
+ _defineProperty(this, "componentId", void 0);
99
+ _defineProperty(this, "componentFromModel", void 0);
100
+ _defineProperty(this, "allDependencies", void 0);
101
+ _defineProperty(this, "allPackagesDependencies", void 0);
102
+ /**
103
+ * This will store a copy of the package deps before removal
104
+ * in order to apply auto detected rules that are running after the removal
105
+ */
106
+ _defineProperty(this, "originAllPackagesDependencies", void 0);
107
+ _defineProperty(this, "issues", void 0);
108
+ _defineProperty(this, "coreAspects", []);
109
+ _defineProperty(this, "processedFiles", void 0);
110
+ _defineProperty(this, "overridesDependencies", void 0);
111
+ _defineProperty(this, "debugDependenciesData", void 0);
112
+ _defineProperty(this, "autoDetectOverrides", void 0);
113
+ this.componentId = component.componentId;
114
+ // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
115
+ this.componentFromModel = this.component.componentFromModel;
116
+ this.allDependencies = {
117
+ dependencies: [],
118
+ devDependencies: []
119
+ };
120
+ this.allPackagesDependencies = {
121
+ packageDependencies: {},
122
+ devPackageDependencies: {},
123
+ peerPackageDependencies: {}
124
+ };
125
+ this.processedFiles = [];
126
+ this.issues = component.issues;
127
+ this.setLegacyInsideHarmonyIssue();
128
+ this.overridesDependencies = new (_overridesDependencies().default)(component);
129
+ this.debugDependenciesData = {
130
+ components: []
131
+ };
132
+ }
133
+ get consumer() {
134
+ var _this$workspace;
135
+ return (_this$workspace = this.workspace) === null || _this$workspace === void 0 ? void 0 : _this$workspace.consumer;
136
+ }
137
+ async getDependenciesData() {
138
+ await this.populateDependencies();
139
+ const dependenciesData = new (_dependenciesData().DependenciesData)(this.allDependencies, this.allPackagesDependencies, this.issues, this.coreAspects);
140
+ return {
141
+ dependenciesData,
142
+ overridesDependencies: this.overridesDependencies,
143
+ autoDetectOverrides: this.autoDetectOverrides
144
+ };
145
+ }
146
+
147
+ /**
148
+ * Given the tree of file dependencies from the driver, find the components of these files.
149
+ * Each dependency file has a path, use bit.map to search for the component name by that path.
150
+ * If the component is found, add it to "this.allDependencies.dependencies". Otherwise, add it to "this.issues.untrackedDependencies".
151
+ *
152
+ * For the found components, add their sourceRelativePath and destinationRelativePath, they are being used for
153
+ * generating links upon import:
154
+ * sourceRelativePath - location of the link file.
155
+ * destinationRelativePath - destination written inside the link file.
156
+ *
157
+ * When a dependency is found in a regular (implementation) file, it goes to `dependencies`. If
158
+ * it found on a test file, it goes to `devDependencies`.
159
+ * Similarly, when a package is found in a regular file, it goes to `packageDependencies`. When
160
+ * if found in a test file, it goes to `devPackageDependencies`.
161
+ * An exception for the above is when a package is required in a regular or test file but is also
162
+ * mentioned in the `package.json` file as a peerDependency, in that case, the package is added
163
+ * to `peerPackageDependencies` and removed from other places. Unless this package is overridden
164
+ * and marked as ignored in the consumer or component config file.
165
+ */
166
+ async populateDependencies() {
167
+ await this.loadAutoDetectOverrides();
168
+ this.removeIgnoredComponentsByOverrides();
169
+ this.cloneAllPackagesDependencies();
170
+ this.removeIgnoredPackagesByOverrides();
171
+ this.removeDevAndEnvDepsIfTheyAlsoRegulars();
172
+ this.applyPeersFromComponentModel();
173
+ this.applyPackageJson();
174
+ this.applyWorkspacePolicy();
175
+ this.makeLegacyAsPeer();
176
+ await this.applyAutoDetectOverridesOnComponent();
177
+ this.manuallyAddDependencies();
178
+ // Doing this here (after manuallyAddDependencies) because usually the env of the env is adding dependencies as peer of the env
179
+ // which will make this not work if it come before
180
+ // example:
181
+ // custom react has peers with react 16.4.0.
182
+ // the custom react uses the "teambit.envs/env" env, which will add react ^17.0.0 to every component that uses it
183
+ // we want to make sure that the custom react is using 16.4.0 not 17.
184
+ await this.applyAutoDetectedPeersFromEnvOnEnvItSelf();
185
+ this.coreAspects = _ramda().default.uniq(this.coreAspects);
186
+ }
187
+ removeIgnoredComponentsByOverrides() {
188
+ const shouldBeIncluded = (dep, fileType) => !this.overridesDependencies.shouldIgnorePackage(dep.packageName, fileType);
189
+ this.allDependencies.dependencies = this.allDependencies.dependencies.filter(dep => shouldBeIncluded(dep, {
190
+ isTestFile: false
191
+ }));
192
+ this.allDependencies.devDependencies = this.allDependencies.devDependencies.filter(dep => shouldBeIncluded(dep, {
193
+ isTestFile: true
194
+ }));
195
+ const missingIssue = this.issues.getIssueByName('MissingPackagesDependenciesOnFs');
196
+ if (!missingIssue) return;
197
+ const missingData = missingIssue.data;
198
+ missingData.forEach(m => {
199
+ m.missingPackages = m.missingPackages.filter(pkg => !this.overridesDependencies.shouldIgnorePackage(pkg, {
200
+ isTestFile: m.isDevFile
201
+ }));
202
+ });
203
+ missingIssue.data = missingData.filter(m => m.missingPackages.length);
204
+ if (!missingIssue.data.length) this.issues.delete(_componentIssues().IssuesClasses.MissingPackagesDependenciesOnFs);
205
+ }
206
+ async loadAutoDetectOverrides() {
207
+ var _this$workspace2;
208
+ this.autoDetectOverrides = await ((_this$workspace2 = this.workspace) === null || _this$workspace2 === void 0 ? void 0 : _this$workspace2.getAutoDetectOverrides(this.component.extensions, this.component.id, this.component.files));
209
+ }
210
+ cloneAllPackagesDependencies() {
211
+ this.originAllPackagesDependencies = (0, _lodash().cloneDeep)(this.allPackagesDependencies);
212
+ }
213
+ removeIgnoredPackagesByOverrides() {
214
+ const shouldBeIncluded = (pkgVersion, pkgName) => !this.overridesDependencies.shouldIgnorePackageByType(pkgName, 'dependencies');
215
+ const shouldBeIncludedDev = (pkgVersion, pkgName) => !this.overridesDependencies.shouldIgnorePackageByType(pkgName, 'devDependencies');
216
+ this.allPackagesDependencies.packageDependencies = _ramda().default.pickBy(shouldBeIncluded, this.allPackagesDependencies.packageDependencies);
217
+ this.allPackagesDependencies.devPackageDependencies = _ramda().default.pickBy(shouldBeIncludedDev, this.allPackagesDependencies.devPackageDependencies);
218
+ }
219
+
220
+ // TODO: maybe cache those results??
221
+ _resolvePackageData(packageName) {
222
+ const consumer = this.consumer;
223
+ if (!consumer) return undefined;
224
+ // if consumer is defined, then it has componentMap prop.
225
+ const componentMap = this.component.componentMap;
226
+ const rootDir = componentMap.rootDir;
227
+ const consumerPath = consumer.getPath();
228
+ const basePath = rootDir ? _path().default.join(consumerPath, rootDir) : consumerPath;
229
+ const modulePath = (0, _packages().resolvePackagePath)(packageName, basePath, consumerPath);
230
+ if (!modulePath) return undefined; // e.g. it's author and wasn't exported yet, so there's no node_modules of that component
231
+ const packageObject = (0, _packages().resolvePackageData)(basePath, modulePath);
232
+ return packageObject;
233
+ }
234
+ _getComponentIdToAdd(field, dependency) {
235
+ if (field === 'peerDependencies') return undefined;
236
+ const packageData = this._resolvePackageData(dependency);
237
+ return {
238
+ componentId: packageData === null || packageData === void 0 ? void 0 : packageData.componentId,
239
+ packageName: packageData === null || packageData === void 0 ? void 0 : packageData.name
240
+ };
241
+ }
242
+ getDependenciesToAddManually(packageJson, existingDependencies) {
243
+ const overrides = this.overridesDependencies.getDependenciesToAddManually();
244
+ if (!overrides) return undefined;
245
+ const components = {};
246
+ const packages = {};
247
+ _constants().DEPENDENCIES_FIELDS.forEach(depField => {
248
+ if (!overrides[depField]) return;
249
+ Object.keys(overrides[depField]).forEach(dependency => {
250
+ const dependencyValue = overrides[depField][dependency];
251
+ const componentData = this._getComponentIdToAdd(depField, dependency);
252
+ if (componentData !== null && componentData !== void 0 && componentData.componentId) {
253
+ const dependencyExist = existingDependencies[depField].find(d => d.id.isEqualWithoutVersion(componentData.componentId));
254
+ if (!dependencyExist) {
255
+ this.overridesDependencies._addManuallyAddedDep(depField, componentData.componentId.toString());
256
+ components[depField] ? components[depField].push(componentData) : components[depField] = [componentData];
257
+ }
258
+ return;
259
+ }
260
+ const addedPkg = this.overridesDependencies._manuallyAddPackage(depField, dependency, dependencyValue, packageJson);
261
+ if (addedPkg) {
262
+ packages[depField] = Object.assign(packages[depField] || {}, addedPkg);
263
+ if (componentData && !componentData.packageName) {
264
+ this.overridesDependencies.missingPackageDependencies.push(dependency);
265
+ }
266
+ }
267
+ });
268
+ });
269
+ return {
270
+ components,
271
+ packages
272
+ };
273
+ }
274
+ manuallyAddDependencies() {
275
+ const packageJson = this._getPackageJson();
276
+ const dependencies = this.getDependenciesToAddManually(packageJson, this.allDependencies);
277
+ if (!dependencies) return;
278
+ const {
279
+ components,
280
+ packages
281
+ } = dependencies;
282
+ _constants().DEPENDENCIES_FIELDS.forEach(depField => {
283
+ if (components[depField] && components[depField].length) {
284
+ components[depField].forEach(depData => this.allDependencies[depField].push(new (_dependencies().Dependency)(depData.componentId, [], depData.packageName)));
285
+ }
286
+ if (packages[depField] && !_ramda().default.isEmpty(packages[depField])) {
287
+ Object.assign(this.allPackagesDependencies[this._pkgFieldMapping(depField)], packages[depField]);
288
+ }
289
+ });
290
+ // The automatic dependency detector considers all found dependencies to be runtime dependencies.
291
+ // But this breaks proper installation of injected subdependencies that are resolved from workspace components.
292
+ if (this.allPackagesDependencies.packageDependencies && packages.peerDependencies) {
293
+ for (const peerName of Object.keys(packages.peerDependencies)) {
294
+ delete this.allPackagesDependencies.packageDependencies[peerName];
295
+ }
296
+ }
297
+ if (this.allPackagesDependencies.packageDependencies && packages.peerPackageDependencies) {
298
+ for (const peerName of Object.keys(packages.peerPackageDependencies)) {
299
+ delete this.allPackagesDependencies.packageDependencies[peerName];
300
+ }
301
+ }
302
+ }
303
+
304
+ /**
305
+ * Remove the dependencies which appear both in dev and regular deps from the dev
306
+ * Because if a dependency is both dev dependency and regular dependency it should be treated as regular one
307
+ * Apply for both packages and components dependencies
308
+ */
309
+ removeDevAndEnvDepsIfTheyAlsoRegulars() {
310
+ // remove dev and env packages that are also regular packages
311
+ const getNotRegularPackages = packages => _ramda().default.difference(_ramda().default.keys(packages), _ramda().default.keys(this.allPackagesDependencies.packageDependencies));
312
+ this.allPackagesDependencies.devPackageDependencies = _ramda().default.pick(getNotRegularPackages(this.allPackagesDependencies.devPackageDependencies), this.allPackagesDependencies.devPackageDependencies);
313
+ // remove dev dependencies that are also regular dependencies
314
+ // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
315
+ const componentDepsIds = new (_componentId().ComponentIdList)(...this.allDependencies.dependencies.map(c => c.id));
316
+ this.allDependencies.devDependencies = this.allDependencies.devDependencies.filter(d => !componentDepsIds.has(d.id));
317
+ }
318
+ applyPeersFromComponentModel() {
319
+ const getPeerDependencies = () => {
320
+ const packageJson = this._getPackageJsonFromComponentModel();
321
+ if (packageJson && packageJson.peerDependencies) return packageJson.peerDependencies;
322
+ return {};
323
+ };
324
+ const projectPeerDependencies = getPeerDependencies();
325
+ const peerPackages = {};
326
+ if (_ramda().default.isEmpty(projectPeerDependencies)) return;
327
+
328
+ // check whether the peer-dependencies was actually require in the code. if so, remove it from
329
+ // the packages/dev-packages and add it as a peer-package.
330
+ // if it was not required in the code, don't add it to the peerPackages
331
+ Object.keys(projectPeerDependencies).forEach(pkg => {
332
+ if (this.overridesDependencies.shouldIgnorePeerPackage(pkg)) return;
333
+ ['packageDependencies', 'devPackageDependencies'].forEach(field => {
334
+ if (Object.keys(this.allPackagesDependencies[field]).includes(pkg)) {
335
+ delete this.allPackagesDependencies[field][pkg];
336
+ peerPackages[pkg] = projectPeerDependencies[pkg];
337
+ }
338
+ });
339
+ });
340
+ this.allPackagesDependencies.peerPackageDependencies = peerPackages;
341
+ }
342
+ applyPackageJson() {
343
+ const packageJson = this._getPackageJson();
344
+ if (!packageJson) return;
345
+ const pkgJsonPeer = packageJson.peerDependencies || {};
346
+ const pkgJsonRegularDeps = packageJson.dependencies || {};
347
+ const peerDeps = this.allPackagesDependencies.peerPackageDependencies || {};
348
+ ['packageDependencies', 'devPackageDependencies', 'peerPackageDependencies'].forEach(field => {
349
+ _ramda().default.forEachObjIndexed((_pkgVal, pkgName) => {
350
+ const peerVersionFromPkgJson = pkgJsonPeer[pkgName];
351
+ const regularVersionFromPkgJson = pkgJsonRegularDeps[pkgName];
352
+ if (peerVersionFromPkgJson) {
353
+ delete this.allPackagesDependencies[field][pkgName];
354
+ peerDeps[pkgName] = peerVersionFromPkgJson;
355
+ } else if (regularVersionFromPkgJson) {
356
+ var _this$allPackagesDepe;
357
+ (_this$allPackagesDepe = this.allPackagesDependencies.peerPackageDependencies) === null || _this$allPackagesDepe === void 0 || delete _this$allPackagesDepe[pkgName];
358
+ this.allPackagesDependencies[field][pkgName] = regularVersionFromPkgJson;
359
+ }
360
+ }, this.allPackagesDependencies[field]);
361
+ });
362
+ this.allPackagesDependencies.peerPackageDependencies = peerDeps;
363
+ }
364
+ applyWorkspacePolicy() {
365
+ const wsPolicy = this.depsResolver.getWorkspacePolicyManifest();
366
+ if (!wsPolicy) return;
367
+ const wsPeer = wsPolicy.peerDependencies || {};
368
+ const wsRegular = wsPolicy.dependencies || {};
369
+ const peerDeps = this.allPackagesDependencies.peerPackageDependencies || {};
370
+ // we are not iterate component deps since they are resolved from what actually installed
371
+ // the policy used for installation only in that case
372
+ ['packageDependencies', 'devPackageDependencies', 'peerPackageDependencies'].forEach(field => {
373
+ _ramda().default.forEachObjIndexed((_pkgVal, pkgName) => {
374
+ const peerVersionFromWsPolicy = wsPeer[pkgName];
375
+ const regularVersionFromWsPolicy = wsRegular[pkgName];
376
+ if (peerVersionFromWsPolicy) {
377
+ delete this.allPackagesDependencies[field][pkgName];
378
+ peerDeps[pkgName] = peerVersionFromWsPolicy;
379
+ } else if (regularVersionFromWsPolicy) {
380
+ var _this$allPackagesDepe2;
381
+ (_this$allPackagesDepe2 = this.allPackagesDependencies.peerPackageDependencies) === null || _this$allPackagesDepe2 === void 0 || delete _this$allPackagesDepe2[pkgName];
382
+ this.allPackagesDependencies[field][pkgName] = regularVersionFromWsPolicy;
383
+ }
384
+ }, this.allPackagesDependencies[field]);
385
+ });
386
+ this.allPackagesDependencies.peerPackageDependencies = peerDeps;
387
+ }
388
+
389
+ /**
390
+ * It removes the @teambit/legacy dependency from the dependencies/devDeps and adds it as a peer dependency with ^.
391
+ */
392
+ makeLegacyAsPeer() {
393
+ let version;
394
+ if (this.allPackagesDependencies.packageDependencies['@teambit/legacy']) {
395
+ version = this.allPackagesDependencies.packageDependencies['@teambit/legacy'];
396
+ delete this.allPackagesDependencies.packageDependencies['@teambit/legacy'];
397
+ }
398
+ if (this.allPackagesDependencies.devPackageDependencies['@teambit/legacy']) {
399
+ if (!version) version = this.allPackagesDependencies.devPackageDependencies['@teambit/legacy'];
400
+ delete this.allPackagesDependencies.devPackageDependencies['@teambit/legacy'];
401
+ }
402
+ if (version) {
403
+ if (!Number.isNaN(version[0])) version = `^${version}`;
404
+ this.allPackagesDependencies.peerPackageDependencies['@teambit/legacy'] = version;
405
+ }
406
+ }
407
+ async applyAutoDetectOverridesOnComponent() {
408
+ var _this$issues$getIssue;
409
+ const autoDetectOverrides = this.autoDetectOverrides;
410
+ if (!autoDetectOverrides || !Object.keys(autoDetectOverrides).length) {
411
+ return;
412
+ }
413
+ const originallyExists = [];
414
+ let missingPackages = [];
415
+ // We want to also add missing packages to the peer list as we know to resolve the version from the env anyway
416
+ const missingData = (_this$issues$getIssue = this.issues.getIssueByName('MissingPackagesDependenciesOnFs')) === null || _this$issues$getIssue === void 0 ? void 0 : _this$issues$getIssue.data;
417
+ if (missingData) {
418
+ missingPackages = (0, _lodash().uniq)(missingData.map(d => d.missingPackages).flat());
419
+ }
420
+ ['dependencies', 'devDependencies', 'peerDependencies'].forEach(field => {
421
+ _ramda().default.forEachObjIndexed((pkgVal, pkgName) => {
422
+ if (this.overridesDependencies.shouldIgnorePeerPackage(pkgName)) return;
423
+ // Validate it was auto detected, we only affect stuff that were detected
424
+ const existsInCompsDeps = this.allDependencies.dependencies.find(dep => {
425
+ return dep.packageName === pkgName;
426
+ });
427
+ const existsInCompsDevDeps = this.allDependencies.devDependencies.find(dep => {
428
+ return dep.packageName === pkgName;
429
+ });
430
+ if (
431
+ // We are checking originAllPackagesDependencies instead of allPackagesDependencies
432
+ // as it might be already removed from allPackagesDependencies at this point if it was set with
433
+ // "-" in runtime/dev
434
+ // in such case we still want to apply it here
435
+ !this.originAllPackagesDependencies.packageDependencies[pkgName] && !this.originAllPackagesDependencies.devPackageDependencies[pkgName] && !this.originAllPackagesDependencies.peerPackageDependencies[pkgName] && !existsInCompsDeps && !existsInCompsDevDeps &&
436
+ // Check if it was orignally exists in the component
437
+ // as we might have a policy which looks like this:
438
+ // "components": {
439
+ // "dependencies": {
440
+ // "my-dep": "-"
441
+ // },
442
+ // "devDependencies": {
443
+ // "my-dep": "1.0.0"
444
+ // },
445
+ // }
446
+ // in that case we might remove it before getting to the devDeps then we will think that it wasn't required in the component
447
+ // which is incorrect
448
+ !originallyExists.includes(pkgName) && !missingPackages.includes(pkgName)) {
449
+ return;
450
+ }
451
+ originallyExists.push(pkgName);
452
+ const key = DepsKeysToAllPackagesDepsKeys[field];
453
+ delete this.allPackagesDependencies[key][pkgName];
454
+ // When changing peer dependency we want it to be stronger than the other types
455
+ if (field === 'peerDependencies') {
456
+ delete this.allPackagesDependencies.devPackageDependencies[pkgName];
457
+ delete this.allPackagesDependencies.packageDependencies[pkgName];
458
+ if (existsInCompsDeps) {
459
+ this.allDependencies.dependencies = this.allDependencies.dependencies.filter(dep => dep.packageName !== pkgName);
460
+ }
461
+ if (existsInCompsDevDeps) {
462
+ this.allDependencies.devDependencies = this.allDependencies.devDependencies.filter(dep => dep.packageName !== pkgName);
463
+ }
464
+ }
465
+ // delete this.allPackagesDependencies.packageDependencies[pkgName];
466
+ // delete this.allPackagesDependencies.devPackageDependencies[pkgName];
467
+ // delete this.allPackagesDependencies.peerPackageDependencies[pkgName];
468
+
469
+ // If it exists in comps deps / comp dev deps, we don't want to add it to the allPackagesDependencies
470
+ // as it will make the same dep both a dev and runtime dep
471
+ // since we are here only for auto detected deps, it means we already resolved the version correctly
472
+ // so we don't need to really modify the version
473
+ // also the version here might have a range (^ or ~ for example) so we can't
474
+ // just put it as is, as it is not valid for component deps to have range
475
+ if (pkgVal !== _constants().MANUALLY_REMOVE_DEPENDENCY && (!existsInCompsDeps && !existsInCompsDevDeps || field === 'peerDependencies')) {
476
+ this.allPackagesDependencies[key][pkgName] = pkgVal;
477
+ }
478
+ }, autoDetectOverrides[field]);
479
+ });
480
+ }
481
+ async applyAutoDetectedPeersFromEnvOnEnvItSelf() {
482
+ const envPolicy = await this.depsResolver.getEnvPolicyFromEnvLegacyId(this.component.id, this.component.files);
483
+ if (!envPolicy) return;
484
+ const envPolicyManifest = envPolicy.selfPolicy.toVersionManifest();
485
+ if (!envPolicyManifest || !Object.keys(envPolicyManifest).length) {
486
+ return;
487
+ }
488
+ const deps = this.allPackagesDependencies.packageDependencies || {};
489
+ // we are not iterate component deps since they are resolved from what actually installed
490
+ // the policy used for installation only in that case
491
+ ['packageDependencies', 'devPackageDependencies', 'peerPackageDependencies'].forEach(field => {
492
+ _ramda().default.forEachObjIndexed((_pkgVal, pkgName) => {
493
+ const peerVersionFromEnvPolicy = envPolicyManifest[pkgName];
494
+ if (peerVersionFromEnvPolicy) {
495
+ delete this.allPackagesDependencies[field][pkgName];
496
+ }
497
+ }, this.allPackagesDependencies[field]);
498
+ });
499
+ Object.assign(deps, envPolicyManifest);
500
+ // TODO: handle component deps once we support peers between components
501
+ this.allPackagesDependencies.packageDependencies = deps;
502
+ }
503
+
504
+ /**
505
+ * returns `package.json` of the component when it's imported, or `package.json` of the workspace
506
+ * when it's authored.
507
+ */
508
+ _getPackageJson() {
509
+ var _this$consumer;
510
+ return (_this$consumer = this.consumer) === null || _this$consumer === void 0 ? void 0 : _this$consumer.packageJson.packageJsonObject;
511
+ }
512
+ _getPackageJsonFromComponentModel() {
513
+ if (this.componentFromModel && this.component.componentMap) {
514
+ // a component is imported but the package.json file is missing or never written
515
+ // read the values from the model
516
+ const packageJson = _packageJsonFile().default.createFromComponent(this.component.componentMap.rootDir, this.componentFromModel);
517
+ return packageJson.packageJsonObject;
518
+ }
519
+ return undefined;
520
+ }
521
+ setLegacyInsideHarmonyIssue() {
522
+ if (this.componentFromModel && this.componentFromModel.isLegacy) {
523
+ this.issues.getOrCreate(_componentIssues().IssuesClasses.LegacyInsideHarmony).data = true;
524
+ }
525
+ }
526
+ _pkgFieldMapping(field) {
527
+ switch (field) {
528
+ case 'dependencies':
529
+ return 'packageDependencies';
530
+ case 'devDependencies':
531
+ return 'devPackageDependencies';
532
+ case 'peerDependencies':
533
+ return 'peerPackageDependencies';
534
+ default:
535
+ throw new Error(`${field} is not recognized`);
536
+ }
537
+ }
538
+ }
539
+ exports.ApplyOverrides = ApplyOverrides;
540
+
541
+ //# sourceMappingURL=apply-overrides.js.map