@teambit/workspace 0.0.956 → 0.0.957

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.
@@ -0,0 +1,43 @@
1
+ import { Harmony } from '@teambit/harmony';
2
+ import { Component, ComponentID } from '@teambit/component';
3
+ import { ExtensionDataList } from '@teambit/legacy/dist/consumer/config/extension-data';
4
+ import { ExtensionsOrigin, Workspace } from './workspace';
5
+ export declare class AspectsMerger {
6
+ private workspace;
7
+ private harmony;
8
+ private consumer;
9
+ private warnedAboutMisconfiguredEnvs;
10
+ constructor(workspace: Workspace, harmony: Harmony);
11
+ /**
12
+ * Calculate the component config based on:
13
+ * the config property in the .bitmap file
14
+ * the component.json file in the component folder
15
+ * matching pattern in the variants config
16
+ * defaults extensions from workspace config
17
+ * extensions from the model.
18
+ */
19
+ merge(componentId: ComponentID, componentFromScope?: Component, excludeOrigins?: ExtensionsOrigin[]): Promise<{
20
+ extensions: ExtensionDataList;
21
+ beforeMerge: Array<{
22
+ extensions: ExtensionDataList;
23
+ origin: ExtensionsOrigin;
24
+ extraData: any;
25
+ }>;
26
+ errors?: Error[];
27
+ }>;
28
+ private getUnmergedData;
29
+ private warnAboutMisconfiguredEnv;
30
+ private filterEnvsFromExtensionsIfNeeded;
31
+ private getConfigMergeFile;
32
+ /**
33
+ * Load all unloaded extensions from a list
34
+ * @param extensions list of extensions with config to load
35
+ */
36
+ private loadExtensions;
37
+ /**
38
+ * This will mutate the entries with extensionId prop to have resolved legacy id
39
+ * This should be worked on the extension data list not the new aspect list
40
+ * @param extensionList
41
+ */
42
+ private resolveExtensionListIds;
43
+ }
@@ -0,0 +1,347 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ require("core-js/modules/es.array.iterator.js");
5
+ require("core-js/modules/es.promise.js");
6
+ require("core-js/modules/es.regexp.exec.js");
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports.AspectsMerger = void 0;
11
+ function _defineProperty2() {
12
+ const data = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
+ _defineProperty2 = function () {
14
+ return data;
15
+ };
16
+ return data;
17
+ }
18
+ function _fsExtra() {
19
+ const data = _interopRequireDefault(require("fs-extra"));
20
+ _fsExtra = function () {
21
+ return data;
22
+ };
23
+ return data;
24
+ }
25
+ function _envs() {
26
+ const data = require("@teambit/envs");
27
+ _envs = function () {
28
+ return data;
29
+ };
30
+ return data;
31
+ }
32
+ function _extensionData() {
33
+ const data = require("@teambit/legacy/dist/consumer/config/extension-data");
34
+ _extensionData = function () {
35
+ return data;
36
+ };
37
+ return data;
38
+ }
39
+ function _lodash() {
40
+ const data = require("lodash");
41
+ _lodash = function () {
42
+ return data;
43
+ };
44
+ return data;
45
+ }
46
+ function _mergeConfigConflict() {
47
+ const data = require("./exceptions/merge-config-conflict");
48
+ _mergeConfigConflict = function () {
49
+ return data;
50
+ };
51
+ return data;
52
+ }
53
+ function _workspace() {
54
+ const data = require("./workspace");
55
+ _workspace = function () {
56
+ return data;
57
+ };
58
+ return data;
59
+ }
60
+ class AspectsMerger {
61
+ // cache env-ids that have been errored about not having "env" type
62
+ constructor(workspace, harmony) {
63
+ this.workspace = workspace;
64
+ this.harmony = harmony;
65
+ (0, _defineProperty2().default)(this, "consumer", void 0);
66
+ (0, _defineProperty2().default)(this, "warnedAboutMisconfiguredEnvs", []);
67
+ this.consumer = workspace.consumer;
68
+ }
69
+
70
+ /**
71
+ * Calculate the component config based on:
72
+ * the config property in the .bitmap file
73
+ * the component.json file in the component folder
74
+ * matching pattern in the variants config
75
+ * defaults extensions from workspace config
76
+ * extensions from the model.
77
+ */
78
+ // eslint-disable-next-line complexity
79
+ async merge(componentId, componentFromScope, excludeOrigins = []) {
80
+ var _componentFromScope$c, _componentConfigFile$, _variantConfig$propag;
81
+ // TODO: consider caching this result
82
+ let configFileExtensions;
83
+ let variantsExtensions;
84
+ let wsDefaultExtensions;
85
+ const mergeFromScope = true;
86
+ const errors = [];
87
+ const bitMapEntry = this.consumer.bitMap.getComponentIfExist(componentId._legacy);
88
+ const bitMapExtensions = bitMapEntry === null || bitMapEntry === void 0 ? void 0 : bitMapEntry.config;
89
+ let configMergeFile;
90
+ try {
91
+ configMergeFile = await this.getConfigMergeFile(componentId);
92
+ } catch (err) {
93
+ if (!(err instanceof _mergeConfigConflict().MergeConfigConflict)) {
94
+ throw err;
95
+ }
96
+ this.workspace.logger.error(`unable to parse the config file for ${componentId.toString()} due to conflicts`);
97
+ errors.push(err);
98
+ }
99
+ const adjustEnvsOnConfigMerge = conf => {
100
+ var _conf$EnvsAspect$id;
101
+ const env = (_conf$EnvsAspect$id = conf[_envs().EnvsAspect.id]) === null || _conf$EnvsAspect$id === void 0 ? void 0 : _conf$EnvsAspect$id.env;
102
+ if (!env) return;
103
+ const [id] = env.split('@');
104
+ conf[_envs().EnvsAspect.id] = {
105
+ env: id
106
+ };
107
+ conf[env] = {};
108
+ };
109
+ const unmergedData = this.getUnmergedData(componentId);
110
+ const unmergedDataMergeConf = unmergedData === null || unmergedData === void 0 ? void 0 : unmergedData.mergedConfig;
111
+ const getMergeConfigCombined = () => {
112
+ if (!configMergeFile && !unmergedDataMergeConf) return undefined;
113
+ if (!configMergeFile) return unmergedDataMergeConf;
114
+ if (!unmergedDataMergeConf) return configMergeFile;
115
+ return (0, _lodash().mergeWith)(configMergeFile, unmergedDataMergeConf, (objValue, srcValue) => {
116
+ if (Array.isArray(objValue)) {
117
+ // critical for dependencyResolver.policy.*dependencies. otherwise, it will override the array
118
+ return objValue.concat(srcValue);
119
+ }
120
+ return undefined;
121
+ });
122
+ };
123
+ const mergeConfigCombined = getMergeConfigCombined();
124
+ adjustEnvsOnConfigMerge(mergeConfigCombined || {});
125
+ const configMergeExtensions = mergeConfigCombined ? _extensionData().ExtensionDataList.fromConfigObject(mergeConfigCombined) : undefined;
126
+ const scopeExtensions = (componentFromScope === null || componentFromScope === void 0 ? void 0 : (_componentFromScope$c = componentFromScope.config) === null || _componentFromScope$c === void 0 ? void 0 : _componentFromScope$c.extensions) || new (_extensionData().ExtensionDataList)();
127
+ const [specific, nonSpecific] = (0, _lodash().partition)(scopeExtensions, entry => entry.config[_workspace().AspectSpecificField] === true);
128
+ const scopeExtensionsNonSpecific = new (_extensionData().ExtensionDataList)(...nonSpecific);
129
+ const scopeExtensionsSpecific = new (_extensionData().ExtensionDataList)(...specific);
130
+ const componentConfigFile = await this.workspace.componentConfigFile(componentId);
131
+ if (componentConfigFile) {
132
+ configFileExtensions = componentConfigFile.aspects.toLegacy();
133
+ }
134
+ const relativeComponentDir = this.workspace.componentDir(componentId, {
135
+ ignoreVersion: true
136
+ }, {
137
+ relative: true
138
+ });
139
+ const variantConfig = this.workspace.variants.byRootDirAndName(relativeComponentDir, componentId.fullName);
140
+ if (variantConfig) {
141
+ variantsExtensions = variantConfig.extensions.clone();
142
+ // Do not merge from scope when there is specific variant (which is not *) that match the component
143
+ // if (variantConfig.maxSpecificity > 0) {
144
+ // mergeFromScope = false;
145
+ // }
146
+ }
147
+ // We don't stop on each step because we want to merge the default scope even if propagate=false but the default scope is not defined
148
+ // in the case the same extension pushed twice, the former takes precedence (opposite of Object.assign)
149
+ const extensionsToMerge = [];
150
+ let envWasFoundPreviously = false;
151
+ const removedExtensionIds = [];
152
+ const addExtensionsToMerge = async (extensions, origin, extraData) => {
153
+ if (!extensions.length) {
154
+ return;
155
+ }
156
+ removedExtensionIds.push(...extensions.filter(extData => extData.isRemoved).map(extData => extData.stringId));
157
+ const extsWithoutRemoved = extensions.filterRemovedExtensions();
158
+ const selfInMergedExtensions = extsWithoutRemoved.findExtension(componentId._legacy.toStringWithoutScopeAndVersion(), true, true);
159
+ const extsWithoutSelf = selfInMergedExtensions !== null && selfInMergedExtensions !== void 0 && selfInMergedExtensions.extensionId ? extsWithoutRemoved.remove(selfInMergedExtensions.extensionId) : extsWithoutRemoved;
160
+ const {
161
+ extensionDataListFiltered,
162
+ envIsCurrentlySet
163
+ } = await this.filterEnvsFromExtensionsIfNeeded(extsWithoutSelf, envWasFoundPreviously, origin);
164
+ if (envIsCurrentlySet) {
165
+ await this.warnAboutMisconfiguredEnv(componentId, extensions);
166
+ envWasFoundPreviously = true;
167
+ }
168
+ extensionsToMerge.push({
169
+ origin,
170
+ extensions: extensionDataListFiltered,
171
+ extraData
172
+ });
173
+ };
174
+ const setDataListAsSpecific = extensions => {
175
+ extensions.forEach(dataEntry => dataEntry.config[_workspace().AspectSpecificField] = true);
176
+ };
177
+ if (configMergeExtensions && !excludeOrigins.includes('ConfigMerge')) {
178
+ await addExtensionsToMerge(_extensionData().ExtensionDataList.fromArray(configMergeExtensions), 'ConfigMerge');
179
+ }
180
+ if (bitMapExtensions && !excludeOrigins.includes('BitmapFile')) {
181
+ const extensionDataList = _extensionData().ExtensionDataList.fromConfigObject(bitMapExtensions);
182
+ setDataListAsSpecific(extensionDataList);
183
+ await addExtensionsToMerge(extensionDataList, 'BitmapFile');
184
+ }
185
+ if (configFileExtensions && !excludeOrigins.includes('ComponentJsonFile')) {
186
+ setDataListAsSpecific(configFileExtensions);
187
+ await addExtensionsToMerge(configFileExtensions, 'ComponentJsonFile');
188
+ }
189
+ if (!excludeOrigins.includes('ModelSpecific')) {
190
+ await addExtensionsToMerge(_extensionData().ExtensionDataList.fromArray(scopeExtensionsSpecific), 'ModelSpecific');
191
+ }
192
+ let continuePropagating = (_componentConfigFile$ = componentConfigFile === null || componentConfigFile === void 0 ? void 0 : componentConfigFile.propagate) !== null && _componentConfigFile$ !== void 0 ? _componentConfigFile$ : true;
193
+ if (variantsExtensions && continuePropagating && !excludeOrigins.includes('WorkspaceVariants')) {
194
+ const appliedRules = variantConfig === null || variantConfig === void 0 ? void 0 : variantConfig.sortedMatches.map(({
195
+ pattern,
196
+ specificity
197
+ }) => ({
198
+ pattern,
199
+ specificity
200
+ }));
201
+ await addExtensionsToMerge(variantsExtensions, 'WorkspaceVariants', {
202
+ appliedRules
203
+ });
204
+ }
205
+ continuePropagating = continuePropagating && ((_variantConfig$propag = variantConfig === null || variantConfig === void 0 ? void 0 : variantConfig.propagate) !== null && _variantConfig$propag !== void 0 ? _variantConfig$propag : true);
206
+ // Do not apply default extensions on the default extensions (it will create infinite loop when loading them)
207
+ const isDefaultExtension = wsDefaultExtensions === null || wsDefaultExtensions === void 0 ? void 0 : wsDefaultExtensions.findExtension(componentId.toString(), true, true);
208
+ if (wsDefaultExtensions && continuePropagating && !isDefaultExtension && !excludeOrigins.includes('WorkspaceDefault')) {
209
+ await addExtensionsToMerge(wsDefaultExtensions, 'WorkspaceDefault');
210
+ }
211
+ if (mergeFromScope && continuePropagating && !excludeOrigins.includes('ModelNonSpecific')) {
212
+ await addExtensionsToMerge(scopeExtensionsNonSpecific, 'ModelNonSpecific');
213
+ }
214
+
215
+ // It's important to do this resolution before the merge, otherwise we have issues with extensions
216
+ // coming from scope with local scope name, as opposed to the same extension comes from the workspace with default scope name
217
+ await Promise.all(extensionsToMerge.map(list => this.resolveExtensionListIds(list.extensions)));
218
+ const afterMerge = _extensionData().ExtensionDataList.mergeConfigs(extensionsToMerge.map(ext => ext.extensions));
219
+ await this.loadExtensions(afterMerge, componentId);
220
+ const withoutRemoved = afterMerge.filter(extData => !removedExtensionIds.includes(extData.stringId));
221
+ const extensions = _extensionData().ExtensionDataList.fromArray(withoutRemoved);
222
+ return {
223
+ extensions,
224
+ beforeMerge: extensionsToMerge,
225
+ errors
226
+ };
227
+ }
228
+ getUnmergedData(componentId) {
229
+ return this.workspace.scope.legacyScope.objects.unmergedComponents.getEntry(componentId._legacy.name);
230
+ }
231
+ async warnAboutMisconfiguredEnv(componentId, extensionDataList) {
232
+ if (!(await this.workspace.hasId(componentId))) {
233
+ // if this is a dependency and not belong to the workspace, don't show the warning
234
+ return;
235
+ }
236
+ const envAspect = extensionDataList.findExtension(_envs().EnvsAspect.id);
237
+ const envFromEnvsAspect = envAspect === null || envAspect === void 0 ? void 0 : envAspect.config.env;
238
+ if (!envFromEnvsAspect) return;
239
+ if (this.workspace.envs.getCoreEnvsIds().includes(envFromEnvsAspect)) return;
240
+ if (this.warnedAboutMisconfiguredEnvs.includes(envFromEnvsAspect)) return;
241
+ let env;
242
+ try {
243
+ const envId = await this.workspace.resolveComponentId(envFromEnvsAspect);
244
+ env = await this.workspace.get(envId);
245
+ } catch (err) {
246
+ return; // unable to get the component for some reason. don't sweat it. forget about the warning
247
+ }
248
+
249
+ if (!this.workspace.envs.isUsingEnvEnv(env)) {
250
+ this.warnedAboutMisconfiguredEnvs.push(envFromEnvsAspect);
251
+ this.workspace.logger.consoleWarning(`env "${envFromEnvsAspect}" is not of type env. (correct the env's type, or component config with "bit env set ${envFromEnvsAspect} teambit.envs/env")`);
252
+ }
253
+ }
254
+ async filterEnvsFromExtensionsIfNeeded(extensionDataList, envWasFoundPreviously, origin) {
255
+ const envAspect = extensionDataList.findExtension(_envs().EnvsAspect.id);
256
+ const envFromEnvsAspect = (envAspect === null || envAspect === void 0 ? void 0 : envAspect.config.env) || (envAspect === null || envAspect === void 0 ? void 0 : envAspect.data.id);
257
+ if (envWasFoundPreviously && envAspect) {
258
+ const nonEnvs = extensionDataList.filter(e => {
259
+ var _e$extensionId;
260
+ // normally the env-id inside the envs aspect doesn't have a version, but the aspect itself has a version.
261
+ if (e.stringId === envFromEnvsAspect || ((_e$extensionId = e.extensionId) === null || _e$extensionId === void 0 ? void 0 : _e$extensionId.toStringWithoutVersion()) === envFromEnvsAspect) return false;
262
+ return true;
263
+ });
264
+ // still, aspect env may have other data other then config.env.
265
+ delete envAspect.config.env;
266
+ return {
267
+ extensionDataListFiltered: new (_extensionData().ExtensionDataList)(...nonEnvs),
268
+ envIsCurrentlySet: true
269
+ };
270
+ }
271
+ if (envFromEnvsAspect && (origin === 'ModelNonSpecific' || origin === 'ModelSpecific')) {
272
+ // if env was found, search for this env in the workspace and if found, replace the env-id with the one from the workspace
273
+ const envAspectExt = extensionDataList.find(e => {
274
+ var _e$extensionId2;
275
+ return ((_e$extensionId2 = e.extensionId) === null || _e$extensionId2 === void 0 ? void 0 : _e$extensionId2.toStringWithoutVersion()) === envFromEnvsAspect;
276
+ });
277
+ const ids = await this.workspace.listIds();
278
+ const envAspectId = envAspectExt === null || envAspectExt === void 0 ? void 0 : envAspectExt.extensionId;
279
+ const found = envAspectId && ids.find(id => id._legacy.isEqualWithoutVersion(envAspectId));
280
+ if (found) {
281
+ envAspectExt.extensionId = found._legacy;
282
+ }
283
+ }
284
+ return {
285
+ extensionDataListFiltered: extensionDataList,
286
+ envIsCurrentlySet: Boolean(envFromEnvsAspect)
287
+ };
288
+ }
289
+ async getConfigMergeFile(componentId) {
290
+ const configMergePath = this.workspace.getConfigMergeFilePath(componentId);
291
+ let fileContent;
292
+ try {
293
+ fileContent = await _fsExtra().default.readFile(configMergePath, 'utf-8');
294
+ } catch (err) {
295
+ if (err.code === 'ENOENT') {
296
+ return undefined;
297
+ }
298
+ throw err;
299
+ }
300
+ try {
301
+ return JSON.parse(fileContent);
302
+ } catch (err) {
303
+ throw new (_mergeConfigConflict().MergeConfigConflict)(configMergePath);
304
+ }
305
+ }
306
+
307
+ /**
308
+ * Load all unloaded extensions from a list
309
+ * @param extensions list of extensions with config to load
310
+ */
311
+ async loadExtensions(extensions, originatedFrom, throwOnError = false) {
312
+ const extensionsIdsP = extensions.map(async extensionEntry => {
313
+ // Core extension
314
+ if (!extensionEntry.extensionId) {
315
+ return extensionEntry.stringId;
316
+ }
317
+ const id = await this.workspace.resolveComponentId(extensionEntry.extensionId);
318
+ // return this.resolveComponentId(extensionEntry.extensionId);
319
+ return id.toString();
320
+ });
321
+ const extensionsIds = await Promise.all(extensionsIdsP);
322
+ const loadedExtensions = this.harmony.extensionsIds;
323
+ const extensionsToLoad = (0, _lodash().difference)(extensionsIds, loadedExtensions);
324
+ if (!extensionsToLoad.length) return;
325
+ await this.workspace.loadAspects(extensionsToLoad, throwOnError, originatedFrom === null || originatedFrom === void 0 ? void 0 : originatedFrom.toString());
326
+ }
327
+
328
+ /**
329
+ * This will mutate the entries with extensionId prop to have resolved legacy id
330
+ * This should be worked on the extension data list not the new aspect list
331
+ * @param extensionList
332
+ */
333
+ async resolveExtensionListIds(extensionList) {
334
+ const promises = extensionList.map(async entry => {
335
+ if (entry.extensionId) {
336
+ const id = await this.workspace.resolveComponentId(entry.extensionId);
337
+ entry.extensionId = id._legacy;
338
+ }
339
+ return entry;
340
+ });
341
+ await Promise.all(promises);
342
+ return extensionList;
343
+ }
344
+ }
345
+ exports.AspectsMerger = AspectsMerger;
346
+
347
+ //# sourceMappingURL=aspects-merger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["AspectsMerger","constructor","workspace","harmony","consumer","merge","componentId","componentFromScope","excludeOrigins","configFileExtensions","variantsExtensions","wsDefaultExtensions","mergeFromScope","errors","bitMapEntry","bitMap","getComponentIfExist","_legacy","bitMapExtensions","config","configMergeFile","getConfigMergeFile","err","MergeConfigConflict","logger","error","toString","push","adjustEnvsOnConfigMerge","conf","env","EnvsAspect","id","split","unmergedData","getUnmergedData","unmergedDataMergeConf","mergedConfig","getMergeConfigCombined","undefined","mergeWith","objValue","srcValue","Array","isArray","concat","mergeConfigCombined","configMergeExtensions","ExtensionDataList","fromConfigObject","scopeExtensions","extensions","specific","nonSpecific","partition","entry","AspectSpecificField","scopeExtensionsNonSpecific","scopeExtensionsSpecific","componentConfigFile","aspects","toLegacy","relativeComponentDir","componentDir","ignoreVersion","relative","variantConfig","variants","byRootDirAndName","fullName","clone","extensionsToMerge","envWasFoundPreviously","removedExtensionIds","addExtensionsToMerge","origin","extraData","length","filter","extData","isRemoved","map","stringId","extsWithoutRemoved","filterRemovedExtensions","selfInMergedExtensions","findExtension","toStringWithoutScopeAndVersion","extsWithoutSelf","extensionId","remove","extensionDataListFiltered","envIsCurrentlySet","filterEnvsFromExtensionsIfNeeded","warnAboutMisconfiguredEnv","setDataListAsSpecific","forEach","dataEntry","includes","fromArray","extensionDataList","continuePropagating","propagate","appliedRules","sortedMatches","pattern","specificity","isDefaultExtension","Promise","all","list","resolveExtensionListIds","afterMerge","mergeConfigs","ext","loadExtensions","withoutRemoved","beforeMerge","scope","legacyScope","objects","unmergedComponents","getEntry","name","hasId","envAspect","envFromEnvsAspect","envs","getCoreEnvsIds","warnedAboutMisconfiguredEnvs","envId","resolveComponentId","get","isUsingEnvEnv","consoleWarning","data","nonEnvs","e","toStringWithoutVersion","envAspectExt","find","ids","listIds","envAspectId","found","isEqualWithoutVersion","Boolean","configMergePath","getConfigMergeFilePath","fileContent","fs","readFile","code","JSON","parse","originatedFrom","throwOnError","extensionsIdsP","extensionEntry","extensionsIds","loadedExtensions","extensionsToLoad","difference","loadAspects","extensionList","promises"],"sources":["aspects-merger.ts"],"sourcesContent":["import { Harmony } from '@teambit/harmony';\nimport fs from 'fs-extra';\nimport { Component, ComponentID } from '@teambit/component';\nimport { UnmergedComponent } from '@teambit/legacy/dist/scope/lanes/unmerged-components';\nimport { EnvsAspect } from '@teambit/envs';\nimport { Consumer } from '@teambit/legacy/dist/consumer';\nimport { ExtensionDataList } from '@teambit/legacy/dist/consumer/config/extension-data';\nimport { partition, mergeWith, difference } from 'lodash';\nimport { MergeConfigConflict } from './exceptions/merge-config-conflict';\nimport { AspectSpecificField, ExtensionsOrigin, Workspace } from './workspace';\n\nexport class AspectsMerger {\n private consumer: Consumer;\n private warnedAboutMisconfiguredEnvs: string[] = []; // cache env-ids that have been errored about not having \"env\" type\n constructor(private workspace: Workspace, private harmony: Harmony) {\n this.consumer = workspace.consumer;\n }\n\n /**\n * Calculate the component config based on:\n * the config property in the .bitmap file\n * the component.json file in the component folder\n * matching pattern in the variants config\n * defaults extensions from workspace config\n * extensions from the model.\n */\n // eslint-disable-next-line complexity\n async merge(\n componentId: ComponentID,\n componentFromScope?: Component,\n excludeOrigins: ExtensionsOrigin[] = []\n ): Promise<{\n extensions: ExtensionDataList;\n beforeMerge: Array<{ extensions: ExtensionDataList; origin: ExtensionsOrigin; extraData: any }>; // useful for debugging\n errors?: Error[];\n }> {\n // TODO: consider caching this result\n let configFileExtensions: ExtensionDataList | undefined;\n let variantsExtensions: ExtensionDataList | undefined;\n let wsDefaultExtensions: ExtensionDataList | undefined;\n const mergeFromScope = true;\n const errors: Error[] = [];\n\n const bitMapEntry = this.consumer.bitMap.getComponentIfExist(componentId._legacy);\n const bitMapExtensions = bitMapEntry?.config;\n\n let configMergeFile: Record<string, any> | undefined;\n try {\n configMergeFile = await this.getConfigMergeFile(componentId);\n } catch (err) {\n if (!(err instanceof MergeConfigConflict)) {\n throw err;\n }\n this.workspace.logger.error(`unable to parse the config file for ${componentId.toString()} due to conflicts`);\n errors.push(err);\n }\n\n const adjustEnvsOnConfigMerge = (conf: Record<string, any>) => {\n const env = conf[EnvsAspect.id]?.env;\n if (!env) return;\n const [id] = env.split('@');\n conf[EnvsAspect.id] = { env: id };\n conf[env] = {};\n };\n const unmergedData = this.getUnmergedData(componentId);\n const unmergedDataMergeConf = unmergedData?.mergedConfig;\n const getMergeConfigCombined = () => {\n if (!configMergeFile && !unmergedDataMergeConf) return undefined;\n if (!configMergeFile) return unmergedDataMergeConf;\n if (!unmergedDataMergeConf) return configMergeFile;\n\n return mergeWith(configMergeFile, unmergedDataMergeConf, (objValue, srcValue) => {\n if (Array.isArray(objValue)) {\n // critical for dependencyResolver.policy.*dependencies. otherwise, it will override the array\n return objValue.concat(srcValue);\n }\n return undefined;\n });\n };\n const mergeConfigCombined = getMergeConfigCombined();\n adjustEnvsOnConfigMerge(mergeConfigCombined || {});\n const configMergeExtensions = mergeConfigCombined\n ? ExtensionDataList.fromConfigObject(mergeConfigCombined)\n : undefined;\n\n const scopeExtensions = componentFromScope?.config?.extensions || new ExtensionDataList();\n const [specific, nonSpecific] = partition(scopeExtensions, (entry) => entry.config[AspectSpecificField] === true);\n const scopeExtensionsNonSpecific = new ExtensionDataList(...nonSpecific);\n const scopeExtensionsSpecific = new ExtensionDataList(...specific);\n\n const componentConfigFile = await this.workspace.componentConfigFile(componentId);\n if (componentConfigFile) {\n configFileExtensions = componentConfigFile.aspects.toLegacy();\n }\n const relativeComponentDir = this.workspace.componentDir(componentId, { ignoreVersion: true }, { relative: true });\n const variantConfig = this.workspace.variants.byRootDirAndName(relativeComponentDir, componentId.fullName);\n if (variantConfig) {\n variantsExtensions = variantConfig.extensions.clone();\n // Do not merge from scope when there is specific variant (which is not *) that match the component\n // if (variantConfig.maxSpecificity > 0) {\n // mergeFromScope = false;\n // }\n }\n // We don't stop on each step because we want to merge the default scope even if propagate=false but the default scope is not defined\n // in the case the same extension pushed twice, the former takes precedence (opposite of Object.assign)\n const extensionsToMerge: Array<{ origin: ExtensionsOrigin; extensions: ExtensionDataList; extraData: any }> = [];\n let envWasFoundPreviously = false;\n const removedExtensionIds: string[] = [];\n\n const addExtensionsToMerge = async (extensions: ExtensionDataList, origin: ExtensionsOrigin, extraData?: any) => {\n if (!extensions.length) {\n return;\n }\n removedExtensionIds.push(...extensions.filter((extData) => extData.isRemoved).map((extData) => extData.stringId));\n const extsWithoutRemoved = extensions.filterRemovedExtensions();\n const selfInMergedExtensions = extsWithoutRemoved.findExtension(\n componentId._legacy.toStringWithoutScopeAndVersion(),\n true,\n true\n );\n const extsWithoutSelf = selfInMergedExtensions?.extensionId\n ? extsWithoutRemoved.remove(selfInMergedExtensions.extensionId)\n : extsWithoutRemoved;\n const { extensionDataListFiltered, envIsCurrentlySet } = await this.filterEnvsFromExtensionsIfNeeded(\n extsWithoutSelf,\n envWasFoundPreviously,\n origin\n );\n if (envIsCurrentlySet) {\n await this.warnAboutMisconfiguredEnv(componentId, extensions);\n envWasFoundPreviously = true;\n }\n\n extensionsToMerge.push({ origin, extensions: extensionDataListFiltered, extraData });\n };\n const setDataListAsSpecific = (extensions: ExtensionDataList) => {\n extensions.forEach((dataEntry) => (dataEntry.config[AspectSpecificField] = true));\n };\n if (configMergeExtensions && !excludeOrigins.includes('ConfigMerge')) {\n await addExtensionsToMerge(ExtensionDataList.fromArray(configMergeExtensions), 'ConfigMerge');\n }\n if (bitMapExtensions && !excludeOrigins.includes('BitmapFile')) {\n const extensionDataList = ExtensionDataList.fromConfigObject(bitMapExtensions);\n setDataListAsSpecific(extensionDataList);\n await addExtensionsToMerge(extensionDataList, 'BitmapFile');\n }\n if (configFileExtensions && !excludeOrigins.includes('ComponentJsonFile')) {\n setDataListAsSpecific(configFileExtensions);\n await addExtensionsToMerge(configFileExtensions, 'ComponentJsonFile');\n }\n if (!excludeOrigins.includes('ModelSpecific')) {\n await addExtensionsToMerge(ExtensionDataList.fromArray(scopeExtensionsSpecific), 'ModelSpecific');\n }\n let continuePropagating = componentConfigFile?.propagate ?? true;\n if (variantsExtensions && continuePropagating && !excludeOrigins.includes('WorkspaceVariants')) {\n const appliedRules = variantConfig?.sortedMatches.map(({ pattern, specificity }) => ({ pattern, specificity }));\n await addExtensionsToMerge(variantsExtensions, 'WorkspaceVariants', { appliedRules });\n }\n continuePropagating = continuePropagating && (variantConfig?.propagate ?? true);\n // Do not apply default extensions on the default extensions (it will create infinite loop when loading them)\n const isDefaultExtension = wsDefaultExtensions?.findExtension(componentId.toString(), true, true);\n if (\n wsDefaultExtensions &&\n continuePropagating &&\n !isDefaultExtension &&\n !excludeOrigins.includes('WorkspaceDefault')\n ) {\n await addExtensionsToMerge(wsDefaultExtensions, 'WorkspaceDefault');\n }\n if (mergeFromScope && continuePropagating && !excludeOrigins.includes('ModelNonSpecific')) {\n await addExtensionsToMerge(scopeExtensionsNonSpecific, 'ModelNonSpecific');\n }\n\n // It's important to do this resolution before the merge, otherwise we have issues with extensions\n // coming from scope with local scope name, as opposed to the same extension comes from the workspace with default scope name\n await Promise.all(extensionsToMerge.map((list) => this.resolveExtensionListIds(list.extensions)));\n const afterMerge = ExtensionDataList.mergeConfigs(extensionsToMerge.map((ext) => ext.extensions));\n await this.loadExtensions(afterMerge, componentId);\n const withoutRemoved = afterMerge.filter((extData) => !removedExtensionIds.includes(extData.stringId));\n const extensions = ExtensionDataList.fromArray(withoutRemoved);\n return {\n extensions,\n beforeMerge: extensionsToMerge,\n errors,\n };\n }\n\n private getUnmergedData(componentId: ComponentID): UnmergedComponent | undefined {\n return this.workspace.scope.legacyScope.objects.unmergedComponents.getEntry(componentId._legacy.name);\n }\n\n private async warnAboutMisconfiguredEnv(componentId: ComponentID, extensionDataList: ExtensionDataList) {\n if (!(await this.workspace.hasId(componentId))) {\n // if this is a dependency and not belong to the workspace, don't show the warning\n return;\n }\n const envAspect = extensionDataList.findExtension(EnvsAspect.id);\n const envFromEnvsAspect = envAspect?.config.env;\n if (!envFromEnvsAspect) return;\n if (this.workspace.envs.getCoreEnvsIds().includes(envFromEnvsAspect)) return;\n if (this.warnedAboutMisconfiguredEnvs.includes(envFromEnvsAspect)) return;\n let env: Component;\n try {\n const envId = await this.workspace.resolveComponentId(envFromEnvsAspect);\n env = await this.workspace.get(envId);\n } catch (err) {\n return; // unable to get the component for some reason. don't sweat it. forget about the warning\n }\n if (!this.workspace.envs.isUsingEnvEnv(env)) {\n this.warnedAboutMisconfiguredEnvs.push(envFromEnvsAspect);\n this.workspace.logger.consoleWarning(\n `env \"${envFromEnvsAspect}\" is not of type env. (correct the env's type, or component config with \"bit env set ${envFromEnvsAspect} teambit.envs/env\")`\n );\n }\n }\n\n private async filterEnvsFromExtensionsIfNeeded(\n extensionDataList: ExtensionDataList,\n envWasFoundPreviously: boolean,\n origin: ExtensionsOrigin\n ) {\n const envAspect = extensionDataList.findExtension(EnvsAspect.id);\n const envFromEnvsAspect: string | undefined = envAspect?.config.env || envAspect?.data.id;\n if (envWasFoundPreviously && envAspect) {\n const nonEnvs = extensionDataList.filter((e) => {\n // normally the env-id inside the envs aspect doesn't have a version, but the aspect itself has a version.\n if (e.stringId === envFromEnvsAspect || e.extensionId?.toStringWithoutVersion() === envFromEnvsAspect)\n return false;\n return true;\n });\n // still, aspect env may have other data other then config.env.\n delete envAspect.config.env;\n return { extensionDataListFiltered: new ExtensionDataList(...nonEnvs), envIsCurrentlySet: true };\n }\n if (envFromEnvsAspect && (origin === 'ModelNonSpecific' || origin === 'ModelSpecific')) {\n // if env was found, search for this env in the workspace and if found, replace the env-id with the one from the workspace\n const envAspectExt = extensionDataList.find((e) => e.extensionId?.toStringWithoutVersion() === envFromEnvsAspect);\n const ids = await this.workspace.listIds();\n const envAspectId = envAspectExt?.extensionId;\n const found = envAspectId && ids.find((id) => id._legacy.isEqualWithoutVersion(envAspectId));\n if (found) {\n envAspectExt.extensionId = found._legacy;\n }\n }\n return { extensionDataListFiltered: extensionDataList, envIsCurrentlySet: Boolean(envFromEnvsAspect) };\n }\n\n private async getConfigMergeFile(componentId: ComponentID): Promise<Record<string, any> | undefined> {\n const configMergePath = this.workspace.getConfigMergeFilePath(componentId);\n let fileContent: string;\n try {\n fileContent = await fs.readFile(configMergePath, 'utf-8');\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n return undefined;\n }\n throw err;\n }\n try {\n return JSON.parse(fileContent);\n } catch (err: any) {\n throw new MergeConfigConflict(configMergePath);\n }\n }\n\n /**\n * Load all unloaded extensions from a list\n * @param extensions list of extensions with config to load\n */\n private async loadExtensions(\n extensions: ExtensionDataList,\n originatedFrom?: ComponentID,\n throwOnError = false\n ): Promise<void> {\n const extensionsIdsP = extensions.map(async (extensionEntry) => {\n // Core extension\n if (!extensionEntry.extensionId) {\n return extensionEntry.stringId as string;\n }\n\n const id = await this.workspace.resolveComponentId(extensionEntry.extensionId);\n // return this.resolveComponentId(extensionEntry.extensionId);\n return id.toString();\n });\n const extensionsIds: string[] = await Promise.all(extensionsIdsP);\n const loadedExtensions = this.harmony.extensionsIds;\n const extensionsToLoad = difference(extensionsIds, loadedExtensions);\n if (!extensionsToLoad.length) return;\n await this.workspace.loadAspects(extensionsToLoad, throwOnError, originatedFrom?.toString());\n }\n\n /**\n * This will mutate the entries with extensionId prop to have resolved legacy id\n * This should be worked on the extension data list not the new aspect list\n * @param extensionList\n */\n private async resolveExtensionListIds(extensionList: ExtensionDataList): Promise<ExtensionDataList> {\n const promises = extensionList.map(async (entry) => {\n if (entry.extensionId) {\n const id = await this.workspace.resolveComponentId(entry.extensionId);\n entry.extensionId = id._legacy;\n }\n\n return entry;\n });\n await Promise.all(promises);\n return extensionList;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { Command } from '@teambit/cli';
2
+ import { Workspace } from '../workspace';
3
+ export declare class EnvsUpdateCmd implements Command {
4
+ private workspace;
5
+ name: string;
6
+ description: string;
7
+ arguments: {
8
+ name: string;
9
+ description: string;
10
+ }[];
11
+ examples: {
12
+ cmd: string;
13
+ description: string;
14
+ }[];
15
+ options: never[];
16
+ group: string;
17
+ constructor(workspace: Workspace);
18
+ report([aspectId, pattern]: [string, string]): Promise<string>;
19
+ }
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ require("core-js/modules/es.array.iterator.js");
5
+ require("core-js/modules/es.promise.js");
6
+ Object.defineProperty(exports, "__esModule", {
7
+ value: true
8
+ });
9
+ exports.EnvsUpdateCmd = void 0;
10
+ function _defineProperty2() {
11
+ const data = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
12
+ _defineProperty2 = function () {
13
+ return data;
14
+ };
15
+ return data;
16
+ }
17
+ function _chalk() {
18
+ const data = _interopRequireDefault(require("chalk"));
19
+ _chalk = function () {
20
+ return data;
21
+ };
22
+ return data;
23
+ }
24
+ class EnvsUpdateCmd {
25
+ constructor(workspace) {
26
+ this.workspace = workspace;
27
+ (0, _defineProperty2().default)(this, "name", 'update [env-id] [pattern]');
28
+ (0, _defineProperty2().default)(this, "description", 'update a version of an env for all components using that env');
29
+ (0, _defineProperty2().default)(this, "arguments", [{
30
+ name: 'env-id',
31
+ description: 'the environment id (defaults to all envs). optionally, add a version (id@version), otherwise, it finds the latest version on the remote.'
32
+ }, {
33
+ name: 'pattern',
34
+ description: 'the components to update (defaults to all components). use component name, component id, or component pattern. use component pattern to select multiple components. use comma to separate patterns and "!" to exclude. e.g. "ui/**, !ui/button". wrap the pattern with quotes'
35
+ }]);
36
+ (0, _defineProperty2().default)(this, "examples", [{
37
+ cmd: 'envs update',
38
+ description: 'update all envs in the workspace to their latest version'
39
+ }, {
40
+ cmd: "envs update scope.org/env '**/ui/**'",
41
+ description: 'update "ui" components that use scope.org/env to use its latest version'
42
+ }, {
43
+ cmd: 'envs update scope.org/env@2.0.0',
44
+ description: 'update all components that use scope.org/env to version 2.0.0 (of this env).'
45
+ }]);
46
+ (0, _defineProperty2().default)(this, "options", []);
47
+ (0, _defineProperty2().default)(this, "group", 'development');
48
+ }
49
+ async report([aspectId, pattern]) {
50
+ const {
51
+ updated,
52
+ alreadyUpToDate
53
+ } = await this.workspace.updateEnvForComponents(aspectId, pattern);
54
+ if (Object.keys(updated).length) {
55
+ const body = Object.keys(updated).map(envId => {
56
+ return `${_chalk().default.bold(envId)}:\n${updated[envId].map(compId => compId.toString()).join('\n')}`;
57
+ }).join('\n\n');
58
+ const title = _chalk().default.green(`the following component(s) have been successfully updated:\n`);
59
+ return title + body;
60
+ }
61
+ if (alreadyUpToDate.length) {
62
+ return _chalk().default.green(`all ${alreadyUpToDate.length} component(s) that use this env are already up to date. nothing to update`);
63
+ }
64
+ return _chalk().default.yellow(`unable to find any component that use ${_chalk().default.bold(aspectId)}`);
65
+ }
66
+ }
67
+ exports.EnvsUpdateCmd = EnvsUpdateCmd;
68
+
69
+ //# sourceMappingURL=envs-update.cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["EnvsUpdateCmd","constructor","workspace","name","description","cmd","report","aspectId","pattern","updated","alreadyUpToDate","updateEnvForComponents","Object","keys","length","body","map","envId","chalk","bold","compId","toString","join","title","green","yellow"],"sources":["envs-update.cmd.ts"],"sourcesContent":["import { Command } from '@teambit/cli';\nimport chalk from 'chalk';\nimport { Workspace } from '../workspace';\n\nexport class EnvsUpdateCmd implements Command {\n name = 'update [env-id] [pattern]';\n description = 'update a version of an env for all components using that env';\n arguments = [\n {\n name: 'env-id',\n description:\n 'the environment id (defaults to all envs). optionally, add a version (id@version), otherwise, it finds the latest version on the remote.',\n },\n {\n name: 'pattern',\n description:\n 'the components to update (defaults to all components). use component name, component id, or component pattern. use component pattern to select multiple components. use comma to separate patterns and \"!\" to exclude. e.g. \"ui/**, !ui/button\". wrap the pattern with quotes',\n },\n ];\n examples = [\n {\n cmd: 'envs update',\n description: 'update all envs in the workspace to their latest version',\n },\n {\n cmd: \"envs update scope.org/env '**/ui/**'\",\n description: 'update \"ui\" components that use scope.org/env to use its latest version',\n },\n {\n cmd: 'envs update scope.org/env@2.0.0',\n description: 'update all components that use scope.org/env to version 2.0.0 (of this env).',\n },\n ];\n options = [];\n group = 'development';\n\n constructor(private workspace: Workspace) {}\n\n async report([aspectId, pattern]: [string, string]) {\n const { updated, alreadyUpToDate } = await this.workspace.updateEnvForComponents(aspectId, pattern);\n if (Object.keys(updated).length) {\n const body = Object.keys(updated)\n .map((envId) => {\n return `${chalk.bold(envId)}:\\n${updated[envId].map((compId) => compId.toString()).join('\\n')}`;\n })\n .join('\\n\\n');\n const title = chalk.green(`the following component(s) have been successfully updated:\\n`);\n return title + body;\n }\n if (alreadyUpToDate.length) {\n return chalk.green(\n `all ${alreadyUpToDate.length} component(s) that use this env are already up to date. nothing to update`\n );\n }\n return chalk.yellow(`unable to find any component that use ${chalk.bold(aspectId)}`);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAGO,MAAMA,aAAa,CAAoB;EAgC5CC,WAAW,CAASC,SAAoB,EAAE;IAAA,KAAtBA,SAAoB,GAApBA,SAAoB;IAAA,8CA/BjC,2BAA2B;IAAA,qDACpB,8DAA8D;IAAA,mDAChE,CACV;MACEC,IAAI,EAAE,QAAQ;MACdC,WAAW,EACT;IACJ,CAAC,EACD;MACED,IAAI,EAAE,SAAS;MACfC,WAAW,EACT;IACJ,CAAC,CACF;IAAA,kDACU,CACT;MACEC,GAAG,EAAE,aAAa;MAClBD,WAAW,EAAE;IACf,CAAC,EACD;MACEC,GAAG,EAAE,sCAAsC;MAC3CD,WAAW,EAAE;IACf,CAAC,EACD;MACEC,GAAG,EAAE,iCAAiC;MACtCD,WAAW,EAAE;IACf,CAAC,CACF;IAAA,iDACS,EAAE;IAAA,+CACJ,aAAa;EAEsB;EAE3C,MAAME,MAAM,CAAC,CAACC,QAAQ,EAAEC,OAAO,CAAmB,EAAE;IAClD,MAAM;MAAEC,OAAO;MAAEC;IAAgB,CAAC,GAAG,MAAM,IAAI,CAACR,SAAS,CAACS,sBAAsB,CAACJ,QAAQ,EAAEC,OAAO,CAAC;IACnG,IAAII,MAAM,CAACC,IAAI,CAACJ,OAAO,CAAC,CAACK,MAAM,EAAE;MAC/B,MAAMC,IAAI,GAAGH,MAAM,CAACC,IAAI,CAACJ,OAAO,CAAC,CAC9BO,GAAG,CAAEC,KAAK,IAAK;QACd,OAAQ,GAAEC,gBAAK,CAACC,IAAI,CAACF,KAAK,CAAE,MAAKR,OAAO,CAACQ,KAAK,CAAC,CAACD,GAAG,CAAEI,MAAM,IAAKA,MAAM,CAACC,QAAQ,EAAE,CAAC,CAACC,IAAI,CAAC,IAAI,CAAE,EAAC;MACjG,CAAC,CAAC,CACDA,IAAI,CAAC,MAAM,CAAC;MACf,MAAMC,KAAK,GAAGL,gBAAK,CAACM,KAAK,CAAE,8DAA6D,CAAC;MACzF,OAAOD,KAAK,GAAGR,IAAI;IACrB;IACA,IAAIL,eAAe,CAACI,MAAM,EAAE;MAC1B,OAAOI,gBAAK,CAACM,KAAK,CACf,OAAMd,eAAe,CAACI,MAAO,2EAA0E,CACzG;IACH;IACA,OAAOI,gBAAK,CAACO,MAAM,CAAE,yCAAwCP,gBAAK,CAACC,IAAI,CAACZ,QAAQ,CAAE,EAAC,CAAC;EACtF;AACF;AAAC"}
@@ -1,5 +1,5 @@
1
- import * as compositions_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad3d35bfc38b9cd90c0e05b598a5a55af/teambit.workspace_workspace@0.0.956/dist/workspace.composition.js';
2
- import * as overview_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad3d35bfc38b9cd90c0e05b598a5a55af/teambit.workspace_workspace@0.0.956/dist/workspace.docs.mdx';
1
+ import * as compositions_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad3d35bfc38b9cd90c0e05b598a5a55af/teambit.workspace_workspace@0.0.957/dist/workspace.composition.js';
2
+ import * as overview_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad3d35bfc38b9cd90c0e05b598a5a55af/teambit.workspace_workspace@0.0.957/dist/workspace.docs.mdx';
3
3
 
4
4
  export const compositions = [compositions_0];
5
5
  export const overview = [overview_0];
@@ -83,9 +83,9 @@ export declare class Workspace implements ComponentFactory {
83
83
  */
84
84
  private componentAspect;
85
85
  private dependencyResolver;
86
- private variants;
86
+ readonly variants: VariantsMain;
87
87
  private aspectLoader;
88
- private logger;
88
+ readonly logger: Logger;
89
89
  private componentList;
90
90
  /**
91
91
  * private reference to the instance of Harmony.
@@ -99,7 +99,7 @@ export declare class Workspace implements ComponentFactory {
99
99
  * on component change slot.
100
100
  */
101
101
  private onComponentChangeSlot;
102
- private envs;
102
+ readonly envs: EnvsMain;
103
103
  /**
104
104
  * on component add slot.
105
105
  */
@@ -115,7 +115,7 @@ export declare class Workspace implements ComponentFactory {
115
115
  bitMap: BitMap;
116
116
  private _cachedListIds?;
117
117
  private componentLoadedSelfAsAspects;
118
- private warnedAboutMisconfiguredEnvs;
118
+ private aspectsMerger;
119
119
  constructor(
120
120
  /**
121
121
  * private pubsub.
@@ -374,12 +374,8 @@ export declare class Workspace implements ComponentFactory {
374
374
  }>;
375
375
  getConfigMergeFilePath(componentId: ComponentID): string;
376
376
  listComponentsDuringMerge(): Promise<ComponentID[]>;
377
- private getConfigMergeFile;
378
377
  getUnmergedComponent(componentId: ComponentID): Promise<Component | undefined>;
379
- private getUnmergedData;
380
- private warnAboutMisconfiguredEnv;
381
378
  isModified(component: Component): Promise<boolean>;
382
- private filterEnvsFromExtensionsIfNeeded;
383
379
  triggerOnPreWatch(componentIds: ComponentID[], watchOpts: WatchOptions): Promise<void>;
384
380
  /**
385
381
  * filter the given component-ids and set default-scope only to the new ones.
@@ -396,12 +392,6 @@ export declare class Workspace implements ComponentFactory {
396
392
  removeSpecificComponentConfig(id: ComponentID, aspectId: string, markWithMinusIfNotExist: boolean): Promise<void>;
397
393
  getAspectIdFromConfig(componentId: ComponentID, aspectIdStr: string, ignoreAspectVersion?: boolean): Promise<string | undefined>;
398
394
  getSpecificComponentConfig(id: ComponentID, aspectId: string): Promise<any>;
399
- /**
400
- * This will mutate the entries with extensionId prop to have resolved legacy id
401
- * This should be worked on the extension data list not the new aspect list
402
- * @param extensionList
403
- */
404
- private resolveExtensionListIds;
405
395
  private isVendorComponentByComponentDir;
406
396
  /**
407
397
  * return the component config from its folder (component.json)
@@ -427,11 +417,6 @@ export declare class Workspace implements ComponentFactory {
427
417
  resolveAspects(runtimeName?: string, componentIds?: ComponentID[], opts?: ResolveAspectsOptions): Promise<AspectDefinition[]>;
428
418
  private groupIdsByWorkspaceAndScope;
429
419
  private groupComponentsByWorkspaceAndScope;
430
- /**
431
- * Load all unloaded extensions from a list
432
- * @param extensions list of extensions with config to load
433
- */
434
- loadExtensions(extensions: ExtensionDataList, originatedFrom?: ComponentID, throwOnError?: boolean): Promise<void>;
435
420
  /**
436
421
  * Provides a cache folder, unique per key.
437
422
  * Return value may be undefined, if workspace folder is unconventional (bare-scope, no node_modules, etc)
@@ -498,5 +483,11 @@ export declare class Workspace implements ComponentFactory {
498
483
  changed: ComponentID[];
499
484
  unchanged: ComponentID[];
500
485
  }>;
486
+ updateEnvForComponents(envIdStr?: string, pattern?: string): Promise<{
487
+ updated: {
488
+ [envId: string]: ComponentID[];
489
+ };
490
+ alreadyUpToDate: ComponentID[];
491
+ }>;
501
492
  }
502
493
  export default Workspace;