@teambit/workspace 0.0.956 → 0.0.958
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/dist/aspects-merger.d.ts +44 -0
- package/dist/aspects-merger.js +333 -0
- package/dist/aspects-merger.js.map +1 -0
- package/dist/envs-subcommands/envs-update.cmd.d.ts +19 -0
- package/dist/envs-subcommands/envs-update.cmd.js +69 -0
- package/dist/envs-subcommands/envs-update.cmd.js.map +1 -0
- package/dist/exceptions/merge-config-conflict.js +1 -1
- package/dist/exceptions/merge-config-conflict.js.map +1 -1
- package/dist/merge-conflict-file.d.ts +22 -0
- package/dist/merge-conflict-file.js +150 -0
- package/dist/merge-conflict-file.js.map +1 -0
- package/dist/{preview-1673407641139.js → preview-1673580548831.js} +2 -2
- package/dist/workspace.d.ts +13 -20
- package/dist/workspace.js +82 -282
- package/dist/workspace.js.map +1 -1
- package/dist/workspace.provider.js +9 -1
- package/dist/workspace.provider.js.map +1 -1
- package/envs-subcommands/envs-update.cmd.ts +57 -0
- package/exceptions/merge-config-conflict.ts +1 -1
- package/package-tar/teambit-workspace-0.0.958.tgz +0 -0
- package/package.json +36 -36
- package/package-tar/teambit-workspace-0.0.956.tgz +0 -0
|
@@ -0,0 +1,44 @@
|
|
|
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
|
+
import { MergeConflictFile } from './merge-conflict-file';
|
|
6
|
+
export declare class AspectsMerger {
|
|
7
|
+
private workspace;
|
|
8
|
+
private harmony;
|
|
9
|
+
private consumer;
|
|
10
|
+
private warnedAboutMisconfiguredEnvs;
|
|
11
|
+
readonly mergeConflictFile: MergeConflictFile;
|
|
12
|
+
constructor(workspace: Workspace, harmony: Harmony);
|
|
13
|
+
/**
|
|
14
|
+
* Calculate the component config based on:
|
|
15
|
+
* the config property in the .bitmap file
|
|
16
|
+
* the component.json file in the component folder
|
|
17
|
+
* matching pattern in the variants config
|
|
18
|
+
* defaults extensions from workspace config
|
|
19
|
+
* extensions from the model.
|
|
20
|
+
*/
|
|
21
|
+
merge(componentId: ComponentID, componentFromScope?: Component, excludeOrigins?: ExtensionsOrigin[]): Promise<{
|
|
22
|
+
extensions: ExtensionDataList;
|
|
23
|
+
beforeMerge: Array<{
|
|
24
|
+
extensions: ExtensionDataList;
|
|
25
|
+
origin: ExtensionsOrigin;
|
|
26
|
+
extraData: any;
|
|
27
|
+
}>;
|
|
28
|
+
errors?: Error[];
|
|
29
|
+
}>;
|
|
30
|
+
private getUnmergedData;
|
|
31
|
+
private warnAboutMisconfiguredEnv;
|
|
32
|
+
private filterEnvsFromExtensionsIfNeeded;
|
|
33
|
+
/**
|
|
34
|
+
* Load all unloaded extensions from a list
|
|
35
|
+
* @param extensions list of extensions with config to load
|
|
36
|
+
*/
|
|
37
|
+
private loadExtensions;
|
|
38
|
+
/**
|
|
39
|
+
* This will mutate the entries with extensionId prop to have resolved legacy id
|
|
40
|
+
* This should be worked on the extension data list not the new aspect list
|
|
41
|
+
* @param extensionList
|
|
42
|
+
*/
|
|
43
|
+
private resolveExtensionListIds;
|
|
44
|
+
}
|
|
@@ -0,0 +1,333 @@
|
|
|
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 _envs() {
|
|
19
|
+
const data = require("@teambit/envs");
|
|
20
|
+
_envs = function () {
|
|
21
|
+
return data;
|
|
22
|
+
};
|
|
23
|
+
return data;
|
|
24
|
+
}
|
|
25
|
+
function _extensionData() {
|
|
26
|
+
const data = require("@teambit/legacy/dist/consumer/config/extension-data");
|
|
27
|
+
_extensionData = function () {
|
|
28
|
+
return data;
|
|
29
|
+
};
|
|
30
|
+
return data;
|
|
31
|
+
}
|
|
32
|
+
function _lodash() {
|
|
33
|
+
const data = require("lodash");
|
|
34
|
+
_lodash = function () {
|
|
35
|
+
return data;
|
|
36
|
+
};
|
|
37
|
+
return data;
|
|
38
|
+
}
|
|
39
|
+
function _mergeConfigConflict() {
|
|
40
|
+
const data = require("./exceptions/merge-config-conflict");
|
|
41
|
+
_mergeConfigConflict = function () {
|
|
42
|
+
return data;
|
|
43
|
+
};
|
|
44
|
+
return data;
|
|
45
|
+
}
|
|
46
|
+
function _workspace() {
|
|
47
|
+
const data = require("./workspace");
|
|
48
|
+
_workspace = function () {
|
|
49
|
+
return data;
|
|
50
|
+
};
|
|
51
|
+
return data;
|
|
52
|
+
}
|
|
53
|
+
function _mergeConflictFile() {
|
|
54
|
+
const data = require("./merge-conflict-file");
|
|
55
|
+
_mergeConflictFile = 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
|
+
|
|
63
|
+
constructor(workspace, harmony) {
|
|
64
|
+
this.workspace = workspace;
|
|
65
|
+
this.harmony = harmony;
|
|
66
|
+
(0, _defineProperty2().default)(this, "consumer", void 0);
|
|
67
|
+
(0, _defineProperty2().default)(this, "warnedAboutMisconfiguredEnvs", []);
|
|
68
|
+
(0, _defineProperty2().default)(this, "mergeConflictFile", void 0);
|
|
69
|
+
this.consumer = workspace.consumer;
|
|
70
|
+
this.mergeConflictFile = new (_mergeConflictFile().MergeConflictFile)(workspace.path);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Calculate the component config based on:
|
|
75
|
+
* the config property in the .bitmap file
|
|
76
|
+
* the component.json file in the component folder
|
|
77
|
+
* matching pattern in the variants config
|
|
78
|
+
* defaults extensions from workspace config
|
|
79
|
+
* extensions from the model.
|
|
80
|
+
*/
|
|
81
|
+
// eslint-disable-next-line complexity
|
|
82
|
+
async merge(componentId, componentFromScope, excludeOrigins = []) {
|
|
83
|
+
var _componentFromScope$c, _componentConfigFile$, _variantConfig$propag;
|
|
84
|
+
// TODO: consider caching this result
|
|
85
|
+
let configFileExtensions;
|
|
86
|
+
let variantsExtensions;
|
|
87
|
+
let wsDefaultExtensions;
|
|
88
|
+
const mergeFromScope = true;
|
|
89
|
+
const errors = [];
|
|
90
|
+
const bitMapEntry = this.consumer.bitMap.getComponentIfExist(componentId._legacy);
|
|
91
|
+
const bitMapExtensions = bitMapEntry === null || bitMapEntry === void 0 ? void 0 : bitMapEntry.config;
|
|
92
|
+
let configMerge;
|
|
93
|
+
try {
|
|
94
|
+
configMerge = await this.mergeConflictFile.getConflictParsed(componentId.toStringWithoutVersion());
|
|
95
|
+
} catch (err) {
|
|
96
|
+
if (!(err instanceof _mergeConfigConflict().MergeConfigConflict)) {
|
|
97
|
+
throw err;
|
|
98
|
+
}
|
|
99
|
+
this.workspace.logger.error(`unable to parse the config file for ${componentId.toString()} due to conflicts`);
|
|
100
|
+
errors.push(err);
|
|
101
|
+
}
|
|
102
|
+
const adjustEnvsOnConfigMerge = conf => {
|
|
103
|
+
var _conf$EnvsAspect$id;
|
|
104
|
+
const env = (_conf$EnvsAspect$id = conf[_envs().EnvsAspect.id]) === null || _conf$EnvsAspect$id === void 0 ? void 0 : _conf$EnvsAspect$id.env;
|
|
105
|
+
if (!env) return;
|
|
106
|
+
const [id] = env.split('@');
|
|
107
|
+
conf[_envs().EnvsAspect.id] = {
|
|
108
|
+
env: id
|
|
109
|
+
};
|
|
110
|
+
conf[env] = {};
|
|
111
|
+
};
|
|
112
|
+
const unmergedData = this.getUnmergedData(componentId);
|
|
113
|
+
const unmergedDataMergeConf = unmergedData === null || unmergedData === void 0 ? void 0 : unmergedData.mergedConfig;
|
|
114
|
+
const getMergeConfigCombined = () => {
|
|
115
|
+
if (!configMerge && !unmergedDataMergeConf) return undefined;
|
|
116
|
+
if (!configMerge) return unmergedDataMergeConf;
|
|
117
|
+
if (!unmergedDataMergeConf) return configMerge;
|
|
118
|
+
return (0, _lodash().mergeWith)(configMerge, unmergedDataMergeConf, (objValue, srcValue) => {
|
|
119
|
+
if (Array.isArray(objValue)) {
|
|
120
|
+
// critical for dependencyResolver.policy.*dependencies. otherwise, it will override the array
|
|
121
|
+
return objValue.concat(srcValue);
|
|
122
|
+
}
|
|
123
|
+
return undefined;
|
|
124
|
+
});
|
|
125
|
+
};
|
|
126
|
+
const mergeConfigCombined = getMergeConfigCombined();
|
|
127
|
+
adjustEnvsOnConfigMerge(mergeConfigCombined || {});
|
|
128
|
+
const configMergeExtensions = mergeConfigCombined ? _extensionData().ExtensionDataList.fromConfigObject(mergeConfigCombined) : undefined;
|
|
129
|
+
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)();
|
|
130
|
+
const [specific, nonSpecific] = (0, _lodash().partition)(scopeExtensions, entry => entry.config[_workspace().AspectSpecificField] === true);
|
|
131
|
+
const scopeExtensionsNonSpecific = new (_extensionData().ExtensionDataList)(...nonSpecific);
|
|
132
|
+
const scopeExtensionsSpecific = new (_extensionData().ExtensionDataList)(...specific);
|
|
133
|
+
const componentConfigFile = await this.workspace.componentConfigFile(componentId);
|
|
134
|
+
if (componentConfigFile) {
|
|
135
|
+
configFileExtensions = componentConfigFile.aspects.toLegacy();
|
|
136
|
+
}
|
|
137
|
+
const relativeComponentDir = this.workspace.componentDir(componentId, {
|
|
138
|
+
ignoreVersion: true
|
|
139
|
+
}, {
|
|
140
|
+
relative: true
|
|
141
|
+
});
|
|
142
|
+
const variantConfig = this.workspace.variants.byRootDirAndName(relativeComponentDir, componentId.fullName);
|
|
143
|
+
if (variantConfig) {
|
|
144
|
+
variantsExtensions = variantConfig.extensions.clone();
|
|
145
|
+
// Do not merge from scope when there is specific variant (which is not *) that match the component
|
|
146
|
+
// if (variantConfig.maxSpecificity > 0) {
|
|
147
|
+
// mergeFromScope = false;
|
|
148
|
+
// }
|
|
149
|
+
}
|
|
150
|
+
// 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
|
|
151
|
+
// in the case the same extension pushed twice, the former takes precedence (opposite of Object.assign)
|
|
152
|
+
const extensionsToMerge = [];
|
|
153
|
+
let envWasFoundPreviously = false;
|
|
154
|
+
const removedExtensionIds = [];
|
|
155
|
+
const addExtensionsToMerge = async (extensions, origin, extraData) => {
|
|
156
|
+
if (!extensions.length) {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
removedExtensionIds.push(...extensions.filter(extData => extData.isRemoved).map(extData => extData.stringId));
|
|
160
|
+
const extsWithoutRemoved = extensions.filterRemovedExtensions();
|
|
161
|
+
const selfInMergedExtensions = extsWithoutRemoved.findExtension(componentId._legacy.toStringWithoutScopeAndVersion(), true, true);
|
|
162
|
+
const extsWithoutSelf = selfInMergedExtensions !== null && selfInMergedExtensions !== void 0 && selfInMergedExtensions.extensionId ? extsWithoutRemoved.remove(selfInMergedExtensions.extensionId) : extsWithoutRemoved;
|
|
163
|
+
const {
|
|
164
|
+
extensionDataListFiltered,
|
|
165
|
+
envIsCurrentlySet
|
|
166
|
+
} = await this.filterEnvsFromExtensionsIfNeeded(extsWithoutSelf, envWasFoundPreviously, origin);
|
|
167
|
+
if (envIsCurrentlySet) {
|
|
168
|
+
await this.warnAboutMisconfiguredEnv(componentId, extensions);
|
|
169
|
+
envWasFoundPreviously = true;
|
|
170
|
+
}
|
|
171
|
+
extensionsToMerge.push({
|
|
172
|
+
origin,
|
|
173
|
+
extensions: extensionDataListFiltered,
|
|
174
|
+
extraData
|
|
175
|
+
});
|
|
176
|
+
};
|
|
177
|
+
const setDataListAsSpecific = extensions => {
|
|
178
|
+
extensions.forEach(dataEntry => dataEntry.config[_workspace().AspectSpecificField] = true);
|
|
179
|
+
};
|
|
180
|
+
if (configMergeExtensions && !excludeOrigins.includes('ConfigMerge')) {
|
|
181
|
+
await addExtensionsToMerge(_extensionData().ExtensionDataList.fromArray(configMergeExtensions), 'ConfigMerge');
|
|
182
|
+
}
|
|
183
|
+
if (bitMapExtensions && !excludeOrigins.includes('BitmapFile')) {
|
|
184
|
+
const extensionDataList = _extensionData().ExtensionDataList.fromConfigObject(bitMapExtensions);
|
|
185
|
+
setDataListAsSpecific(extensionDataList);
|
|
186
|
+
await addExtensionsToMerge(extensionDataList, 'BitmapFile');
|
|
187
|
+
}
|
|
188
|
+
if (configFileExtensions && !excludeOrigins.includes('ComponentJsonFile')) {
|
|
189
|
+
setDataListAsSpecific(configFileExtensions);
|
|
190
|
+
await addExtensionsToMerge(configFileExtensions, 'ComponentJsonFile');
|
|
191
|
+
}
|
|
192
|
+
if (!excludeOrigins.includes('ModelSpecific')) {
|
|
193
|
+
await addExtensionsToMerge(_extensionData().ExtensionDataList.fromArray(scopeExtensionsSpecific), 'ModelSpecific');
|
|
194
|
+
}
|
|
195
|
+
let continuePropagating = (_componentConfigFile$ = componentConfigFile === null || componentConfigFile === void 0 ? void 0 : componentConfigFile.propagate) !== null && _componentConfigFile$ !== void 0 ? _componentConfigFile$ : true;
|
|
196
|
+
if (variantsExtensions && continuePropagating && !excludeOrigins.includes('WorkspaceVariants')) {
|
|
197
|
+
const appliedRules = variantConfig === null || variantConfig === void 0 ? void 0 : variantConfig.sortedMatches.map(({
|
|
198
|
+
pattern,
|
|
199
|
+
specificity
|
|
200
|
+
}) => ({
|
|
201
|
+
pattern,
|
|
202
|
+
specificity
|
|
203
|
+
}));
|
|
204
|
+
await addExtensionsToMerge(variantsExtensions, 'WorkspaceVariants', {
|
|
205
|
+
appliedRules
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
continuePropagating = continuePropagating && ((_variantConfig$propag = variantConfig === null || variantConfig === void 0 ? void 0 : variantConfig.propagate) !== null && _variantConfig$propag !== void 0 ? _variantConfig$propag : true);
|
|
209
|
+
// Do not apply default extensions on the default extensions (it will create infinite loop when loading them)
|
|
210
|
+
const isDefaultExtension = wsDefaultExtensions === null || wsDefaultExtensions === void 0 ? void 0 : wsDefaultExtensions.findExtension(componentId.toString(), true, true);
|
|
211
|
+
if (wsDefaultExtensions && continuePropagating && !isDefaultExtension && !excludeOrigins.includes('WorkspaceDefault')) {
|
|
212
|
+
await addExtensionsToMerge(wsDefaultExtensions, 'WorkspaceDefault');
|
|
213
|
+
}
|
|
214
|
+
if (mergeFromScope && continuePropagating && !excludeOrigins.includes('ModelNonSpecific')) {
|
|
215
|
+
await addExtensionsToMerge(scopeExtensionsNonSpecific, 'ModelNonSpecific');
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// It's important to do this resolution before the merge, otherwise we have issues with extensions
|
|
219
|
+
// coming from scope with local scope name, as opposed to the same extension comes from the workspace with default scope name
|
|
220
|
+
await Promise.all(extensionsToMerge.map(list => this.resolveExtensionListIds(list.extensions)));
|
|
221
|
+
const afterMerge = _extensionData().ExtensionDataList.mergeConfigs(extensionsToMerge.map(ext => ext.extensions));
|
|
222
|
+
await this.loadExtensions(afterMerge, componentId);
|
|
223
|
+
const withoutRemoved = afterMerge.filter(extData => !removedExtensionIds.includes(extData.stringId));
|
|
224
|
+
const extensions = _extensionData().ExtensionDataList.fromArray(withoutRemoved);
|
|
225
|
+
return {
|
|
226
|
+
extensions,
|
|
227
|
+
beforeMerge: extensionsToMerge,
|
|
228
|
+
errors
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
getUnmergedData(componentId) {
|
|
232
|
+
return this.workspace.scope.legacyScope.objects.unmergedComponents.getEntry(componentId._legacy.name);
|
|
233
|
+
}
|
|
234
|
+
async warnAboutMisconfiguredEnv(componentId, extensionDataList) {
|
|
235
|
+
if (!(await this.workspace.hasId(componentId))) {
|
|
236
|
+
// if this is a dependency and not belong to the workspace, don't show the warning
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
const envAspect = extensionDataList.findExtension(_envs().EnvsAspect.id);
|
|
240
|
+
const envFromEnvsAspect = envAspect === null || envAspect === void 0 ? void 0 : envAspect.config.env;
|
|
241
|
+
if (!envFromEnvsAspect) return;
|
|
242
|
+
if (this.workspace.envs.getCoreEnvsIds().includes(envFromEnvsAspect)) return;
|
|
243
|
+
if (this.warnedAboutMisconfiguredEnvs.includes(envFromEnvsAspect)) return;
|
|
244
|
+
let env;
|
|
245
|
+
try {
|
|
246
|
+
const envId = await this.workspace.resolveComponentId(envFromEnvsAspect);
|
|
247
|
+
env = await this.workspace.get(envId);
|
|
248
|
+
} catch (err) {
|
|
249
|
+
return; // unable to get the component for some reason. don't sweat it. forget about the warning
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
if (!this.workspace.envs.isUsingEnvEnv(env)) {
|
|
253
|
+
this.warnedAboutMisconfiguredEnvs.push(envFromEnvsAspect);
|
|
254
|
+
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")`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
async filterEnvsFromExtensionsIfNeeded(extensionDataList, envWasFoundPreviously, origin) {
|
|
258
|
+
const envAspect = extensionDataList.findExtension(_envs().EnvsAspect.id);
|
|
259
|
+
const envFromEnvsAspect = (envAspect === null || envAspect === void 0 ? void 0 : envAspect.config.env) || (envAspect === null || envAspect === void 0 ? void 0 : envAspect.data.id);
|
|
260
|
+
if (envWasFoundPreviously && envAspect) {
|
|
261
|
+
const nonEnvs = extensionDataList.filter(e => {
|
|
262
|
+
var _e$extensionId;
|
|
263
|
+
// normally the env-id inside the envs aspect doesn't have a version, but the aspect itself has a version.
|
|
264
|
+
if (e.stringId === envFromEnvsAspect || ((_e$extensionId = e.extensionId) === null || _e$extensionId === void 0 ? void 0 : _e$extensionId.toStringWithoutVersion()) === envFromEnvsAspect) return false;
|
|
265
|
+
return true;
|
|
266
|
+
});
|
|
267
|
+
// still, aspect env may have other data other then config.env.
|
|
268
|
+
delete envAspect.config.env;
|
|
269
|
+
return {
|
|
270
|
+
extensionDataListFiltered: new (_extensionData().ExtensionDataList)(...nonEnvs),
|
|
271
|
+
envIsCurrentlySet: true
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
if (envFromEnvsAspect && (origin === 'ModelNonSpecific' || origin === 'ModelSpecific')) {
|
|
275
|
+
// if env was found, search for this env in the workspace and if found, replace the env-id with the one from the workspace
|
|
276
|
+
const envAspectExt = extensionDataList.find(e => {
|
|
277
|
+
var _e$extensionId2;
|
|
278
|
+
return ((_e$extensionId2 = e.extensionId) === null || _e$extensionId2 === void 0 ? void 0 : _e$extensionId2.toStringWithoutVersion()) === envFromEnvsAspect;
|
|
279
|
+
});
|
|
280
|
+
const ids = await this.workspace.listIds();
|
|
281
|
+
const envAspectId = envAspectExt === null || envAspectExt === void 0 ? void 0 : envAspectExt.extensionId;
|
|
282
|
+
const found = envAspectId && ids.find(id => id._legacy.isEqualWithoutVersion(envAspectId));
|
|
283
|
+
if (found) {
|
|
284
|
+
envAspectExt.extensionId = found._legacy;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return {
|
|
288
|
+
extensionDataListFiltered: extensionDataList,
|
|
289
|
+
envIsCurrentlySet: Boolean(envFromEnvsAspect)
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Load all unloaded extensions from a list
|
|
295
|
+
* @param extensions list of extensions with config to load
|
|
296
|
+
*/
|
|
297
|
+
async loadExtensions(extensions, originatedFrom, throwOnError = false) {
|
|
298
|
+
const extensionsIdsP = extensions.map(async extensionEntry => {
|
|
299
|
+
// Core extension
|
|
300
|
+
if (!extensionEntry.extensionId) {
|
|
301
|
+
return extensionEntry.stringId;
|
|
302
|
+
}
|
|
303
|
+
const id = await this.workspace.resolveComponentId(extensionEntry.extensionId);
|
|
304
|
+
// return this.resolveComponentId(extensionEntry.extensionId);
|
|
305
|
+
return id.toString();
|
|
306
|
+
});
|
|
307
|
+
const extensionsIds = await Promise.all(extensionsIdsP);
|
|
308
|
+
const loadedExtensions = this.harmony.extensionsIds;
|
|
309
|
+
const extensionsToLoad = (0, _lodash().difference)(extensionsIds, loadedExtensions);
|
|
310
|
+
if (!extensionsToLoad.length) return;
|
|
311
|
+
await this.workspace.loadAspects(extensionsToLoad, throwOnError, originatedFrom === null || originatedFrom === void 0 ? void 0 : originatedFrom.toString());
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* This will mutate the entries with extensionId prop to have resolved legacy id
|
|
316
|
+
* This should be worked on the extension data list not the new aspect list
|
|
317
|
+
* @param extensionList
|
|
318
|
+
*/
|
|
319
|
+
async resolveExtensionListIds(extensionList) {
|
|
320
|
+
const promises = extensionList.map(async entry => {
|
|
321
|
+
if (entry.extensionId) {
|
|
322
|
+
const id = await this.workspace.resolveComponentId(entry.extensionId);
|
|
323
|
+
entry.extensionId = id._legacy;
|
|
324
|
+
}
|
|
325
|
+
return entry;
|
|
326
|
+
});
|
|
327
|
+
await Promise.all(promises);
|
|
328
|
+
return extensionList;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
exports.AspectsMerger = AspectsMerger;
|
|
332
|
+
|
|
333
|
+
//# sourceMappingURL=aspects-merger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["AspectsMerger","constructor","workspace","harmony","consumer","mergeConflictFile","MergeConflictFile","path","merge","componentId","componentFromScope","excludeOrigins","configFileExtensions","variantsExtensions","wsDefaultExtensions","mergeFromScope","errors","bitMapEntry","bitMap","getComponentIfExist","_legacy","bitMapExtensions","config","configMerge","getConflictParsed","toStringWithoutVersion","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","envAspectExt","find","ids","listIds","envAspectId","found","isEqualWithoutVersion","Boolean","originatedFrom","throwOnError","extensionsIdsP","extensionEntry","extensionsIds","loadedExtensions","extensionsToLoad","difference","loadAspects","extensionList","promises"],"sources":["aspects-merger.ts"],"sourcesContent":["import { Harmony } from '@teambit/harmony';\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';\nimport { MergeConflictFile } from './merge-conflict-file';\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 readonly mergeConflictFile: MergeConflictFile;\n constructor(private workspace: Workspace, private harmony: Harmony) {\n this.consumer = workspace.consumer;\n this.mergeConflictFile = new MergeConflictFile(workspace.path);\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 configMerge: Record<string, any> | undefined;\n try {\n configMerge = await this.mergeConflictFile.getConflictParsed(componentId.toStringWithoutVersion());\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 (!configMerge && !unmergedDataMergeConf) return undefined;\n if (!configMerge) return unmergedDataMergeConf;\n if (!unmergedDataMergeConf) return configMerge;\n\n return mergeWith(configMerge, 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 /**\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"}
|
|
@@ -13,7 +13,7 @@ function _bitError() {
|
|
|
13
13
|
}
|
|
14
14
|
class MergeConfigConflict extends _bitError().BitError {
|
|
15
15
|
constructor(filePath) {
|
|
16
|
-
super(`unable to parse the merge-
|
|
16
|
+
super(`unable to parse the merge-conflict file ${filePath} as it has unresolved conflicts`);
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
exports.MergeConfigConflict = MergeConfigConflict;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["MergeConfigConflict","BitError","constructor","filePath"],"sources":["merge-config-conflict.ts"],"sourcesContent":["import { BitError } from '@teambit/bit-error';\n\nexport class MergeConfigConflict extends BitError {\n constructor(filePath: string) {\n super(`unable to parse the merge-
|
|
1
|
+
{"version":3,"names":["MergeConfigConflict","BitError","constructor","filePath"],"sources":["merge-config-conflict.ts"],"sourcesContent":["import { BitError } from '@teambit/bit-error';\n\nexport class MergeConfigConflict extends BitError {\n constructor(filePath: string) {\n super(`unable to parse the merge-conflict file ${filePath} as it has unresolved conflicts`);\n }\n}\n"],"mappings":";;;;;;AAAA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAEO,MAAMA,mBAAmB,SAASC,oBAAQ,CAAC;EAChDC,WAAW,CAACC,QAAgB,EAAE;IAC5B,KAAK,CAAE,2CAA0CA,QAAS,iCAAgC,CAAC;EAC7F;AACF;AAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
declare type ConflictPerId = {
|
|
2
|
+
[compIdWithoutVersion: string]: string;
|
|
3
|
+
};
|
|
4
|
+
export declare class MergeConflictFile {
|
|
5
|
+
private workspacePath;
|
|
6
|
+
conflictPerId: ConflictPerId | undefined;
|
|
7
|
+
constructor(workspacePath: string);
|
|
8
|
+
addConflict(id: string, conflict: string): void;
|
|
9
|
+
removeConflict(id: string): void;
|
|
10
|
+
getConflict(id: string): Promise<string | undefined>;
|
|
11
|
+
getConflictParsed(id: string): Promise<Record<string, any> | undefined>;
|
|
12
|
+
hasConflict(): boolean;
|
|
13
|
+
getPath(): string;
|
|
14
|
+
loadIfNeeded(): Promise<void>;
|
|
15
|
+
write(): Promise<void>;
|
|
16
|
+
delete(): Promise<void>;
|
|
17
|
+
private formatConflicts;
|
|
18
|
+
private stringHasConflictMarker;
|
|
19
|
+
private parseConflict;
|
|
20
|
+
private getFileContentIfExists;
|
|
21
|
+
}
|
|
22
|
+
export {};
|