@teambit/ci 1.0.533 → 1.0.534
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/ci.docs.mdx +12 -1
- package/dist/ci.docs.mdx +12 -1
- package/dist/ci.main.runtime.d.ts +0 -5
- package/dist/ci.main.runtime.js +56 -49
- package/dist/ci.main.runtime.js.map +1 -1
- package/dist/lane-archive-guard.d.ts +118 -0
- package/dist/lane-archive-guard.js +314 -0
- package/dist/lane-archive-guard.js.map +1 -0
- package/dist/lane-archive-guard.spec.d.ts +1 -0
- package/dist/lane-archive-guard.spec.js +439 -0
- package/dist/lane-archive-guard.spec.js.map +1 -0
- package/dist/lane-cleanup.d.ts +28 -0
- package/dist/lane-cleanup.js +124 -0
- package/dist/lane-cleanup.js.map +1 -0
- package/dist/lane-cleanup.spec.d.ts +1 -0
- package/dist/lane-cleanup.spec.js +167 -0
- package/dist/lane-cleanup.spec.js.map +1 -0
- package/dist/{preview-1787772816768.js → preview-1787776855233.js} +1 -1
- package/package.json +12 -11
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function _chai() {
|
|
4
|
+
const data = require("chai");
|
|
5
|
+
_chai = function () {
|
|
6
|
+
return data;
|
|
7
|
+
};
|
|
8
|
+
return data;
|
|
9
|
+
}
|
|
10
|
+
function _laneArchiveGuard() {
|
|
11
|
+
const data = require("./lane-archive-guard");
|
|
12
|
+
_laneArchiveGuard = function () {
|
|
13
|
+
return data;
|
|
14
|
+
};
|
|
15
|
+
return data;
|
|
16
|
+
}
|
|
17
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
18
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
19
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
20
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
21
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
22
|
+
describe('decideLaneArchive', () => {
|
|
23
|
+
const LANE = 'acme.cards/feature';
|
|
24
|
+
const SCOPE = 'acme.cards';
|
|
25
|
+
const foreign = (id, released, scope = 'acme.payments') => ({
|
|
26
|
+
id,
|
|
27
|
+
scope,
|
|
28
|
+
released
|
|
29
|
+
});
|
|
30
|
+
it('archives a lane that holds components of this scope only, silently', () => {
|
|
31
|
+
(0, _chai().expect)((0, _laneArchiveGuard().decideLaneArchive)(LANE, SCOPE, [])).to.deep.equal({
|
|
32
|
+
archive: true,
|
|
33
|
+
summary: ''
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
it('archives once every foreign component is on its main, and says so', () => {
|
|
37
|
+
const decision = (0, _laneArchiveGuard().decideLaneArchive)(LANE, SCOPE, [foreign('acme.payments/ui/table', true), foreign('acme.docs/ui/note', true, 'acme.docs')]);
|
|
38
|
+
(0, _chai().expect)(decision.archive).to.be.true;
|
|
39
|
+
(0, _chai().expect)(decision.summary).to.include('All 2 component(s) outside this release (scope(s) acme.docs, acme.payments)');
|
|
40
|
+
});
|
|
41
|
+
it('keeps the lane open while a foreign component is not on its main, naming it and the way out', () => {
|
|
42
|
+
const decision = (0, _laneArchiveGuard().decideLaneArchive)(LANE, SCOPE, [foreign('acme.payments/ui/table', true), foreign('acme.payments/ui/row', false)]);
|
|
43
|
+
(0, _chai().expect)(decision.archive).to.be.false;
|
|
44
|
+
(0, _chai().expect)(decision.summary).to.include(`Lane ${LANE} left open.`);
|
|
45
|
+
(0, _chai().expect)(decision.summary).to.include('1 component(s) from scope(s) acme.payments are not on their main yet: acme.payments/ui/row.');
|
|
46
|
+
(0, _chai().expect)(decision.summary).to.not.include('ui/table');
|
|
47
|
+
(0, _chai().expect)(decision.summary).to.include(`releases the ${SCOPE} slice only`);
|
|
48
|
+
(0, _chai().expect)(decision.summary).to.include(`bit lane remove --remote ${LANE}`);
|
|
49
|
+
});
|
|
50
|
+
it('keeps the lane open when a foreign state could not be read, rather than guessing', () => {
|
|
51
|
+
const decision = (0, _laneArchiveGuard().decideLaneArchive)(LANE, SCOPE, [foreign('acme.payments/ui/table', undefined)]);
|
|
52
|
+
(0, _chai().expect)(decision.archive).to.be.false;
|
|
53
|
+
(0, _chai().expect)(decision.summary).to.include('could not be read: acme.payments/ui/table.');
|
|
54
|
+
(0, _chai().expect)(decision.summary).to.not.include('not on their main yet');
|
|
55
|
+
});
|
|
56
|
+
it('names at most five components and counts the rest', () => {
|
|
57
|
+
const many = Array.from({
|
|
58
|
+
length: 7
|
|
59
|
+
}, (_, i) => foreign(`acme.payments/ui/comp${i}`, false));
|
|
60
|
+
const decision = (0, _laneArchiveGuard().decideLaneArchive)(LANE, SCOPE, many);
|
|
61
|
+
(0, _chai().expect)(decision.summary).to.include('acme.payments/ui/comp4 and 2 more.');
|
|
62
|
+
(0, _chai().expect)(decision.summary).to.not.include('comp5');
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe('laneArchiveDecision', () => {
|
|
66
|
+
const laneId = {
|
|
67
|
+
scope: 'acme.cards',
|
|
68
|
+
name: 'feature',
|
|
69
|
+
toString: () => 'acme.cards/feature'
|
|
70
|
+
};
|
|
71
|
+
const noop = async () => {};
|
|
72
|
+
const deps = overrides => _objectSpread({
|
|
73
|
+
readLane: async () => undefined,
|
|
74
|
+
importMainObjects: noop,
|
|
75
|
+
getModelComponent: async () => undefined,
|
|
76
|
+
importObjectsByHashes: noop,
|
|
77
|
+
releasedHeadByThisRun: () => undefined,
|
|
78
|
+
objects: {},
|
|
79
|
+
warn: () => {}
|
|
80
|
+
}, overrides);
|
|
81
|
+
const snapshot = (components, updateDependents = []) => ({
|
|
82
|
+
components,
|
|
83
|
+
updateDependents
|
|
84
|
+
});
|
|
85
|
+
const foreignEntry = {
|
|
86
|
+
id: {
|
|
87
|
+
scope: 'acme.payments',
|
|
88
|
+
changeVersion: () => ({}),
|
|
89
|
+
toStringWithoutVersion: () => 'acme.payments/ui/table'
|
|
90
|
+
},
|
|
91
|
+
head: 'abc'
|
|
92
|
+
};
|
|
93
|
+
it('archives, silently, a lane the remote no longer has', async () => {
|
|
94
|
+
const decision = await (0, _laneArchiveGuard().laneArchiveDecision)(laneId, 'acme.cards', deps({
|
|
95
|
+
readLane: async () => undefined
|
|
96
|
+
}));
|
|
97
|
+
(0, _chai().expect)(decision).to.deep.equal({
|
|
98
|
+
archive: true,
|
|
99
|
+
summary: ''
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
it('keeps the lane open on a read error that merely mentions "not found"', async () => {
|
|
103
|
+
// an object-fetch or decoding failure is not proof that the lane is gone
|
|
104
|
+
const decision = await (0, _laneArchiveGuard().laneArchiveDecision)(laneId, 'acme.cards', deps({
|
|
105
|
+
readLane: async () => Promise.reject(new Error('object abc123 not found'))
|
|
106
|
+
}));
|
|
107
|
+
(0, _chai().expect)(decision.archive).to.be.false;
|
|
108
|
+
(0, _chai().expect)(decision.summary).to.include('object abc123 not found');
|
|
109
|
+
});
|
|
110
|
+
it('keeps the lane open when the remote cannot be read for another reason', async () => {
|
|
111
|
+
const decision = await (0, _laneArchiveGuard().laneArchiveDecision)(laneId, 'acme.cards', deps({
|
|
112
|
+
readLane: async () => Promise.reject(new Error('ECONNRESET'))
|
|
113
|
+
}));
|
|
114
|
+
(0, _chai().expect)(decision.archive).to.be.false;
|
|
115
|
+
(0, _chai().expect)(decision.summary).to.include('Could not read lane acme.cards/feature');
|
|
116
|
+
(0, _chai().expect)(decision.summary).to.include('ECONNRESET');
|
|
117
|
+
(0, _chai().expect)(decision.summary).to.include('bit lane remove --remote acme.cards/feature');
|
|
118
|
+
});
|
|
119
|
+
it('keeps the lane open when the foreign main history cannot be fetched, and says whose', async () => {
|
|
120
|
+
const warnings = [];
|
|
121
|
+
const decision = await (0, _laneArchiveGuard().laneArchiveDecision)(laneId, 'acme.cards', deps({
|
|
122
|
+
readLane: async () => snapshot([foreignEntry]),
|
|
123
|
+
importMainObjects: async () => Promise.reject(new Error('no route to acme.payments')),
|
|
124
|
+
warn: m => warnings.push(m)
|
|
125
|
+
}));
|
|
126
|
+
(0, _chai().expect)(decision.archive).to.be.false;
|
|
127
|
+
(0, _chai().expect)(decision.summary).to.include('could not be read: acme.payments/ui/table.');
|
|
128
|
+
(0, _chai().expect)(warnings.join('\n')).to.include('no route to acme.payments');
|
|
129
|
+
});
|
|
130
|
+
it('does not count a component this run released if its lane head has moved since', async () => {
|
|
131
|
+
// another writer exported to the lane after this run tagged from it; the entry is no longer what
|
|
132
|
+
// this run released, so it goes through the on-main check like any other (here: no main → pending)
|
|
133
|
+
const decision = await (0, _laneArchiveGuard().laneArchiveDecision)(laneId, 'acme.cards', deps({
|
|
134
|
+
readLane: async () => snapshot([foreignEntry]),
|
|
135
|
+
releasedHeadByThisRun: () => 'an-older-head'
|
|
136
|
+
}));
|
|
137
|
+
(0, _chai().expect)(decision.archive).to.be.false;
|
|
138
|
+
});
|
|
139
|
+
it('counts a foreign component this run tagged and exported as released, and archives', async () => {
|
|
140
|
+
// the one-repository, many-scopes shape: the repo holds components of several scopes and this
|
|
141
|
+
// very run tagged and exported all of them — nothing else to wait for.
|
|
142
|
+
const decision = await (0, _laneArchiveGuard().laneArchiveDecision)(laneId, 'acme.cards', deps({
|
|
143
|
+
readLane: async () => snapshot([foreignEntry]),
|
|
144
|
+
releasedHeadByThisRun: () => foreignEntry.head
|
|
145
|
+
}));
|
|
146
|
+
(0, _chai().expect)(decision.archive).to.be.true;
|
|
147
|
+
(0, _chai().expect)(decision.summary).to.include('All 1 component(s) outside this release (scope(s) acme.payments)');
|
|
148
|
+
});
|
|
149
|
+
it('checks a hidden dependent of this scope too, since no .bitmap lists it', async () => {
|
|
150
|
+
const ownHidden = {
|
|
151
|
+
id: {
|
|
152
|
+
scope: 'acme.cards',
|
|
153
|
+
toStringWithoutVersion: () => 'acme.cards/ui/row',
|
|
154
|
+
changeVersion: () => ({})
|
|
155
|
+
},
|
|
156
|
+
head: 'h1'
|
|
157
|
+
};
|
|
158
|
+
const pending = await (0, _laneArchiveGuard().laneArchiveDecision)(laneId, 'acme.cards', deps({
|
|
159
|
+
readLane: async () => snapshot([], [ownHidden])
|
|
160
|
+
}));
|
|
161
|
+
(0, _chai().expect)(pending.archive).to.be.false;
|
|
162
|
+
(0, _chai().expect)(pending.summary).to.include('A hidden dependent of acme.cards is released only by a run');
|
|
163
|
+
const released = await (0, _laneArchiveGuard().laneArchiveDecision)(laneId, 'acme.cards', deps({
|
|
164
|
+
readLane: async () => snapshot([], [ownHidden]),
|
|
165
|
+
releasedHeadByThisRun: () => 'h1'
|
|
166
|
+
}));
|
|
167
|
+
(0, _chai().expect)(released.archive).to.be.true;
|
|
168
|
+
});
|
|
169
|
+
it('counts a foreign component hidden in updateDependents as lane work too', async () => {
|
|
170
|
+
const decision = await (0, _laneArchiveGuard().laneArchiveDecision)(laneId, 'acme.cards', deps({
|
|
171
|
+
readLane: async () => snapshot([], [foreignEntry])
|
|
172
|
+
}));
|
|
173
|
+
(0, _chai().expect)(decision.archive).to.be.false;
|
|
174
|
+
(0, _chai().expect)(decision.summary).to.include('not on their main yet: acme.payments/ui/table.');
|
|
175
|
+
});
|
|
176
|
+
it('counts a foreign component the lane deletes as pending until its main head is removed', async () => {
|
|
177
|
+
const deleted = _objectSpread(_objectSpread({}, foreignEntry), {}, {
|
|
178
|
+
isDeleted: true
|
|
179
|
+
});
|
|
180
|
+
const model = {
|
|
181
|
+
getHead: () => ({
|
|
182
|
+
toString: () => 'main-head'
|
|
183
|
+
}),
|
|
184
|
+
getHeadAsTagIfExist: () => '0.0.1'
|
|
185
|
+
};
|
|
186
|
+
const mainHeadRemoved = removed => ({
|
|
187
|
+
load: async () => ({
|
|
188
|
+
isRemoved: () => removed
|
|
189
|
+
})
|
|
190
|
+
});
|
|
191
|
+
const pending = await (0, _laneArchiveGuard().laneArchiveDecision)(laneId, 'acme.cards', deps({
|
|
192
|
+
readLane: async () => snapshot([deleted]),
|
|
193
|
+
getModelComponent: async () => model,
|
|
194
|
+
objects: mainHeadRemoved(false)
|
|
195
|
+
}));
|
|
196
|
+
(0, _chai().expect)(pending.archive).to.be.false;
|
|
197
|
+
const released = await (0, _laneArchiveGuard().laneArchiveDecision)(laneId, 'acme.cards', deps({
|
|
198
|
+
readLane: async () => snapshot([deleted]),
|
|
199
|
+
getModelComponent: async () => model,
|
|
200
|
+
objects: mainHeadRemoved(true)
|
|
201
|
+
}));
|
|
202
|
+
(0, _chai().expect)(released.archive).to.be.true;
|
|
203
|
+
});
|
|
204
|
+
it('treats a foreign component with no main yet as not released', async () => {
|
|
205
|
+
const decision = await (0, _laneArchiveGuard().laneArchiveDecision)(laneId, 'acme.cards', deps({
|
|
206
|
+
readLane: async () => snapshot([foreignEntry])
|
|
207
|
+
}));
|
|
208
|
+
(0, _chai().expect)(decision.archive).to.be.false;
|
|
209
|
+
(0, _chai().expect)(decision.summary).to.include('not on their main yet: acme.payments/ui/table.');
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
describe('sameReleasedState', () => {
|
|
213
|
+
const version = ({
|
|
214
|
+
files = [['a.ts', '1']],
|
|
215
|
+
mainFile = 'a.ts',
|
|
216
|
+
packages = {},
|
|
217
|
+
deps = [],
|
|
218
|
+
config = [],
|
|
219
|
+
data = []
|
|
220
|
+
}) => {
|
|
221
|
+
const componentId = id => {
|
|
222
|
+
const [name, ver] = id.split('@');
|
|
223
|
+
return {
|
|
224
|
+
toString: () => id,
|
|
225
|
+
toStringWithoutVersion: () => name,
|
|
226
|
+
version: ver
|
|
227
|
+
};
|
|
228
|
+
};
|
|
229
|
+
const extensions = config.map(([stringId, cfg], i) => ({
|
|
230
|
+
stringId,
|
|
231
|
+
extensionId: stringId.startsWith('@') ? undefined : {
|
|
232
|
+
toStringWithoutVersion: () => stringId.split('@')[0],
|
|
233
|
+
toString: () => stringId,
|
|
234
|
+
version: stringId.split('@')[1]
|
|
235
|
+
},
|
|
236
|
+
config: cfg,
|
|
237
|
+
data: data[i]?.[1] ?? {}
|
|
238
|
+
}));
|
|
239
|
+
return {
|
|
240
|
+
mainFile,
|
|
241
|
+
files: files.map(([relativePath, hash]) => ({
|
|
242
|
+
relativePath,
|
|
243
|
+
file: {
|
|
244
|
+
toString: () => hash
|
|
245
|
+
}
|
|
246
|
+
})),
|
|
247
|
+
packageDependencies: packages,
|
|
248
|
+
devPackageDependencies: {},
|
|
249
|
+
peerPackageDependencies: {},
|
|
250
|
+
dependencies: {
|
|
251
|
+
get: () => deps.map(d => ({
|
|
252
|
+
id: componentId(d)
|
|
253
|
+
}))
|
|
254
|
+
},
|
|
255
|
+
devDependencies: {
|
|
256
|
+
get: () => []
|
|
257
|
+
},
|
|
258
|
+
peerDependencies: {
|
|
259
|
+
get: () => []
|
|
260
|
+
},
|
|
261
|
+
extensions
|
|
262
|
+
};
|
|
263
|
+
};
|
|
264
|
+
it('is true for the same sources, packages, dependencies and config, in any order', () => {
|
|
265
|
+
const a = version({
|
|
266
|
+
files: [['a.ts', '1'], ['b.ts', '2']],
|
|
267
|
+
packages: {
|
|
268
|
+
lodash: '^4'
|
|
269
|
+
},
|
|
270
|
+
deps: ['acme.cards/x@0.0.1'],
|
|
271
|
+
config: [['teambit.envs/envs', {
|
|
272
|
+
env: 'node'
|
|
273
|
+
}]]
|
|
274
|
+
});
|
|
275
|
+
const b = version({
|
|
276
|
+
files: [['b.ts', '2'], ['a.ts', '1']],
|
|
277
|
+
packages: {
|
|
278
|
+
lodash: '^4'
|
|
279
|
+
},
|
|
280
|
+
deps: ['acme.cards/x@0.0.1'],
|
|
281
|
+
config: [['teambit.envs/envs', {
|
|
282
|
+
env: 'node'
|
|
283
|
+
}]]
|
|
284
|
+
});
|
|
285
|
+
(0, _chai().expect)((0, _laneArchiveGuard().sameReleasedState)(a, b, [], new Map())).to.be.true;
|
|
286
|
+
});
|
|
287
|
+
it('is false when a file differs, is missing, or is extra', () => {
|
|
288
|
+
(0, _chai().expect)((0, _laneArchiveGuard().sameReleasedState)(version({
|
|
289
|
+
files: [['a.ts', '1']]
|
|
290
|
+
}), version({
|
|
291
|
+
files: [['a.ts', '9']]
|
|
292
|
+
}), [], new Map())).to.be.false;
|
|
293
|
+
(0, _chai().expect)((0, _laneArchiveGuard().sameReleasedState)(version({
|
|
294
|
+
files: [['a.ts', '1'], ['b.ts', '2']]
|
|
295
|
+
}), version({
|
|
296
|
+
files: [['a.ts', '1']]
|
|
297
|
+
}), [], new Map())).to.be.false;
|
|
298
|
+
(0, _chai().expect)((0, _laneArchiveGuard().sameReleasedState)(version({
|
|
299
|
+
files: [['a.ts', '1']]
|
|
300
|
+
}), version({
|
|
301
|
+
files: [['a.ts', '1'], ['b.ts', '2']]
|
|
302
|
+
}), [], new Map())).to.be.false;
|
|
303
|
+
});
|
|
304
|
+
it('is false when only a package dependency, a component dependency version, or a config differs', () => {
|
|
305
|
+
(0, _chai().expect)((0, _laneArchiveGuard().sameReleasedState)(version({
|
|
306
|
+
packages: {
|
|
307
|
+
lodash: '^4'
|
|
308
|
+
}
|
|
309
|
+
}), version({
|
|
310
|
+
packages: {
|
|
311
|
+
lodash: '^5'
|
|
312
|
+
}
|
|
313
|
+
}), [], new Map())).to.be.false;
|
|
314
|
+
(0, _chai().expect)((0, _laneArchiveGuard().sameReleasedState)(version({
|
|
315
|
+
deps: ['acme.cards/x@0.0.1']
|
|
316
|
+
}), version({
|
|
317
|
+
deps: ['acme.cards/x@0.0.2']
|
|
318
|
+
}), [], new Map())).to.be.false;
|
|
319
|
+
(0, _chai().expect)((0, _laneArchiveGuard().sameReleasedState)(version({
|
|
320
|
+
config: [['teambit.envs/envs', {
|
|
321
|
+
env: 'node'
|
|
322
|
+
}]]
|
|
323
|
+
}), version({
|
|
324
|
+
config: [['teambit.envs/envs', {
|
|
325
|
+
env: 'react'
|
|
326
|
+
}]]
|
|
327
|
+
}), [], new Map())).to.be.false;
|
|
328
|
+
});
|
|
329
|
+
it('is false when only the overrides or package.json changes differ', () => {
|
|
330
|
+
const base = version({});
|
|
331
|
+
(0, _chai().expect)((0, _laneArchiveGuard().sameReleasedState)(base, _objectSpread(_objectSpread({}, base), {}, {
|
|
332
|
+
overrides: {
|
|
333
|
+
dependencies: {
|
|
334
|
+
x: '1'
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}), [], new Map())).to.be.false;
|
|
338
|
+
(0, _chai().expect)((0, _laneArchiveGuard().sameReleasedState)(base, _objectSpread(_objectSpread({}, base), {}, {
|
|
339
|
+
packageJsonChangedProps: {
|
|
340
|
+
sideEffects: false
|
|
341
|
+
}
|
|
342
|
+
}), [], new Map())).to.be.false;
|
|
343
|
+
});
|
|
344
|
+
it('keeps package-named extensions apart by their full name', () => {
|
|
345
|
+
const a = version({
|
|
346
|
+
config: [['@scope/a', {
|
|
347
|
+
x: 1
|
|
348
|
+
}]]
|
|
349
|
+
});
|
|
350
|
+
const b = version({
|
|
351
|
+
config: [['@scope/b', {
|
|
352
|
+
x: 1
|
|
353
|
+
}]]
|
|
354
|
+
});
|
|
355
|
+
(0, _chai().expect)((0, _laneArchiveGuard().sameReleasedState)(a, b, [], new Map())).to.be.false;
|
|
356
|
+
(0, _chai().expect)((0, _laneArchiveGuard().sameReleasedState)(a, version({
|
|
357
|
+
config: [['@scope/a', {
|
|
358
|
+
x: 1
|
|
359
|
+
}]]
|
|
360
|
+
}), [], new Map())).to.be.true;
|
|
361
|
+
});
|
|
362
|
+
it('is insensitive to key order in package dependencies and nested extension config', () => {
|
|
363
|
+
const a = version({
|
|
364
|
+
packages: {
|
|
365
|
+
lodash: '^4',
|
|
366
|
+
react: '^18'
|
|
367
|
+
},
|
|
368
|
+
config: [['teambit.envs/envs', {
|
|
369
|
+
env: 'node',
|
|
370
|
+
opts: {
|
|
371
|
+
a: 1,
|
|
372
|
+
b: 2
|
|
373
|
+
}
|
|
374
|
+
}]]
|
|
375
|
+
});
|
|
376
|
+
const b = version({
|
|
377
|
+
packages: {
|
|
378
|
+
react: '^18',
|
|
379
|
+
lodash: '^4'
|
|
380
|
+
},
|
|
381
|
+
config: [['teambit.envs/envs', {
|
|
382
|
+
opts: {
|
|
383
|
+
b: 2,
|
|
384
|
+
a: 1
|
|
385
|
+
},
|
|
386
|
+
env: 'node'
|
|
387
|
+
}]]
|
|
388
|
+
});
|
|
389
|
+
(0, _chai().expect)((0, _laneArchiveGuard().sameReleasedState)(a, b, [], new Map())).to.be.true;
|
|
390
|
+
});
|
|
391
|
+
it('accepts an on-lane extension only at its released head; an off-lane extension must match exactly', () => {
|
|
392
|
+
const lane = version({
|
|
393
|
+
config: [['teambit.react/react@0.0.0-abc123', {
|
|
394
|
+
compiler: 'swc'
|
|
395
|
+
}]]
|
|
396
|
+
});
|
|
397
|
+
const released = version({
|
|
398
|
+
config: [['teambit.react/react@1.2.3', {
|
|
399
|
+
compiler: 'swc'
|
|
400
|
+
}]]
|
|
401
|
+
});
|
|
402
|
+
const onLane = ['teambit.react/react'];
|
|
403
|
+
(0, _chai().expect)((0, _laneArchiveGuard().sameReleasedState)(lane, released, onLane, new Map([['teambit.react/react', '1.2.3']]))).to.be.true;
|
|
404
|
+
(0, _chai().expect)((0, _laneArchiveGuard().sameReleasedState)(lane, released, onLane, new Map([['teambit.react/react', '1.2.4']]))).to.be.false;
|
|
405
|
+
(0, _chai().expect)((0, _laneArchiveGuard().sameReleasedState)(lane, released, [], new Map())).to.be.false; // a lane-only env upgrade
|
|
406
|
+
(0, _chai().expect)((0, _laneArchiveGuard().sameReleasedState)(lane, version({
|
|
407
|
+
config: [['teambit.react/react@1.2.3', {
|
|
408
|
+
compiler: 'tsc'
|
|
409
|
+
}]]
|
|
410
|
+
}), onLane, new Map([['teambit.react/react', '1.2.3']]))).to.be.false;
|
|
411
|
+
});
|
|
412
|
+
it('accepts an on-lane dependency only at its released head, and ignores extension data', () => {
|
|
413
|
+
const lane = version({
|
|
414
|
+
deps: ['acme.cards/x@abc123'],
|
|
415
|
+
config: [['teambit.deps/resolver', {
|
|
416
|
+
policy: {}
|
|
417
|
+
}]],
|
|
418
|
+
data: [['teambit.deps/resolver', {
|
|
419
|
+
versions: 'lane'
|
|
420
|
+
}]]
|
|
421
|
+
});
|
|
422
|
+
const released = version({
|
|
423
|
+
deps: ['acme.cards/x@0.0.9'],
|
|
424
|
+
config: [['teambit.deps/resolver', {
|
|
425
|
+
policy: {}
|
|
426
|
+
}]],
|
|
427
|
+
data: [['teambit.deps/resolver', {
|
|
428
|
+
versions: 'main'
|
|
429
|
+
}]]
|
|
430
|
+
});
|
|
431
|
+
const headIs = v => new Map([['acme.cards/x', v]]);
|
|
432
|
+
(0, _chai().expect)((0, _laneArchiveGuard().sameReleasedState)(lane, released, ['acme.cards/x'], headIs('0.0.9'))).to.be.true;
|
|
433
|
+
// main still references an older tag of x: a stale main, not the release of this lane head
|
|
434
|
+
(0, _chai().expect)((0, _laneArchiveGuard().sameReleasedState)(lane, released, ['acme.cards/x'], headIs('0.0.10'))).to.be.false;
|
|
435
|
+
(0, _chai().expect)((0, _laneArchiveGuard().sameReleasedState)(lane, released, [], new Map())).to.be.false;
|
|
436
|
+
});
|
|
437
|
+
});
|
|
438
|
+
|
|
439
|
+
//# sourceMappingURL=lane-archive-guard.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_chai","data","require","_laneArchiveGuard","ownKeys","e","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_toPropertyKey","value","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","describe","LANE","SCOPE","foreign","id","released","scope","it","expect","decideLaneArchive","to","deep","equal","archive","summary","decision","be","true","include","false","not","undefined","many","Array","from","_","laneId","name","toString","noop","deps","overrides","readLane","importMainObjects","getModelComponent","importObjectsByHashes","releasedHeadByThisRun","objects","warn","snapshot","components","updateDependents","foreignEntry","changeVersion","toStringWithoutVersion","head","laneArchiveDecision","Promise","reject","Error","warnings","m","join","ownHidden","pending","deleted","isDeleted","model","getHead","getHeadAsTagIfExist","mainHeadRemoved","removed","load","isRemoved","version","files","mainFile","packages","config","componentId","ver","split","extensions","map","stringId","cfg","extensionId","startsWith","relativePath","hash","file","packageDependencies","devPackageDependencies","peerPackageDependencies","dependencies","get","d","devDependencies","peerDependencies","a","lodash","env","b","sameReleasedState","Map","base","x","packageJsonChangedProps","sideEffects","react","opts","lane","compiler","onLane","policy","versions","headIs","v"],"sources":["lane-archive-guard.spec.ts"],"sourcesContent":["import { expect } from 'chai';\nimport { decideLaneArchive, laneArchiveDecision, sameReleasedState } from './lane-archive-guard';\nimport type { ForeignLaneComponent } from './lane-archive-guard';\n\ndescribe('decideLaneArchive', () => {\n const LANE = 'acme.cards/feature';\n const SCOPE = 'acme.cards';\n const foreign = (id: string, released: boolean | undefined, scope = 'acme.payments'): ForeignLaneComponent => ({\n id,\n scope,\n released,\n });\n\n it('archives a lane that holds components of this scope only, silently', () => {\n expect(decideLaneArchive(LANE, SCOPE, [])).to.deep.equal({ archive: true, summary: '' });\n });\n\n it('archives once every foreign component is on its main, and says so', () => {\n const decision = decideLaneArchive(LANE, SCOPE, [\n foreign('acme.payments/ui/table', true),\n foreign('acme.docs/ui/note', true, 'acme.docs'),\n ]);\n expect(decision.archive).to.be.true;\n expect(decision.summary).to.include('All 2 component(s) outside this release (scope(s) acme.docs, acme.payments)');\n });\n\n it('keeps the lane open while a foreign component is not on its main, naming it and the way out', () => {\n const decision = decideLaneArchive(LANE, SCOPE, [\n foreign('acme.payments/ui/table', true),\n foreign('acme.payments/ui/row', false),\n ]);\n expect(decision.archive).to.be.false;\n expect(decision.summary).to.include(`Lane ${LANE} left open.`);\n expect(decision.summary).to.include(\n '1 component(s) from scope(s) acme.payments are not on their main yet: acme.payments/ui/row.'\n );\n expect(decision.summary).to.not.include('ui/table');\n expect(decision.summary).to.include(`releases the ${SCOPE} slice only`);\n expect(decision.summary).to.include(`bit lane remove --remote ${LANE}`);\n });\n\n it('keeps the lane open when a foreign state could not be read, rather than guessing', () => {\n const decision = decideLaneArchive(LANE, SCOPE, [foreign('acme.payments/ui/table', undefined)]);\n expect(decision.archive).to.be.false;\n expect(decision.summary).to.include('could not be read: acme.payments/ui/table.');\n expect(decision.summary).to.not.include('not on their main yet');\n });\n\n it('names at most five components and counts the rest', () => {\n const many = Array.from({ length: 7 }, (_, i) => foreign(`acme.payments/ui/comp${i}`, false));\n const decision = decideLaneArchive(LANE, SCOPE, many);\n expect(decision.summary).to.include('acme.payments/ui/comp4 and 2 more.');\n expect(decision.summary).to.not.include('comp5');\n });\n});\n\ndescribe('laneArchiveDecision', () => {\n const laneId = { scope: 'acme.cards', name: 'feature', toString: () => 'acme.cards/feature' } as any;\n const noop = async () => {};\n const deps = (overrides: Partial<Parameters<typeof laneArchiveDecision>[2]>) =>\n ({\n readLane: async () => undefined,\n importMainObjects: noop,\n getModelComponent: async () => undefined,\n importObjectsByHashes: noop,\n releasedHeadByThisRun: () => undefined,\n objects: {} as any,\n warn: () => {},\n ...overrides,\n }) as Parameters<typeof laneArchiveDecision>[2];\n const snapshot = (components: any[], updateDependents: any[] = []) => ({ components, updateDependents }) as any;\n const foreignEntry = {\n id: { scope: 'acme.payments', changeVersion: () => ({}), toStringWithoutVersion: () => 'acme.payments/ui/table' },\n head: 'abc',\n };\n\n it('archives, silently, a lane the remote no longer has', async () => {\n const decision = await laneArchiveDecision(laneId, 'acme.cards', deps({ readLane: async () => undefined }));\n expect(decision).to.deep.equal({ archive: true, summary: '' });\n });\n\n it('keeps the lane open on a read error that merely mentions \"not found\"', async () => {\n // an object-fetch or decoding failure is not proof that the lane is gone\n const decision = await laneArchiveDecision(\n laneId,\n 'acme.cards',\n deps({ readLane: async () => Promise.reject(new Error('object abc123 not found')) })\n );\n expect(decision.archive).to.be.false;\n expect(decision.summary).to.include('object abc123 not found');\n });\n\n it('keeps the lane open when the remote cannot be read for another reason', async () => {\n const decision = await laneArchiveDecision(\n laneId,\n 'acme.cards',\n deps({ readLane: async () => Promise.reject(new Error('ECONNRESET')) })\n );\n expect(decision.archive).to.be.false;\n expect(decision.summary).to.include('Could not read lane acme.cards/feature');\n expect(decision.summary).to.include('ECONNRESET');\n expect(decision.summary).to.include('bit lane remove --remote acme.cards/feature');\n });\n\n it('keeps the lane open when the foreign main history cannot be fetched, and says whose', async () => {\n const warnings: string[] = [];\n const decision = await laneArchiveDecision(\n laneId,\n 'acme.cards',\n deps({\n readLane: async () => snapshot([foreignEntry]),\n importMainObjects: async () => Promise.reject(new Error('no route to acme.payments')),\n warn: (m) => warnings.push(m),\n })\n );\n expect(decision.archive).to.be.false;\n expect(decision.summary).to.include('could not be read: acme.payments/ui/table.');\n expect(warnings.join('\\n')).to.include('no route to acme.payments');\n });\n\n it('does not count a component this run released if its lane head has moved since', async () => {\n // another writer exported to the lane after this run tagged from it; the entry is no longer what\n // this run released, so it goes through the on-main check like any other (here: no main → pending)\n const decision = await laneArchiveDecision(\n laneId,\n 'acme.cards',\n deps({ readLane: async () => snapshot([foreignEntry]), releasedHeadByThisRun: () => 'an-older-head' })\n );\n expect(decision.archive).to.be.false;\n });\n\n it('counts a foreign component this run tagged and exported as released, and archives', async () => {\n // the one-repository, many-scopes shape: the repo holds components of several scopes and this\n // very run tagged and exported all of them — nothing else to wait for.\n const decision = await laneArchiveDecision(\n laneId,\n 'acme.cards',\n deps({ readLane: async () => snapshot([foreignEntry]), releasedHeadByThisRun: () => foreignEntry.head })\n );\n expect(decision.archive).to.be.true;\n expect(decision.summary).to.include('All 1 component(s) outside this release (scope(s) acme.payments)');\n });\n\n it('checks a hidden dependent of this scope too, since no .bitmap lists it', async () => {\n const ownHidden = {\n id: { scope: 'acme.cards', toStringWithoutVersion: () => 'acme.cards/ui/row', changeVersion: () => ({}) },\n head: 'h1',\n };\n const pending = await laneArchiveDecision(\n laneId,\n 'acme.cards',\n deps({ readLane: async () => snapshot([], [ownHidden]) })\n );\n expect(pending.archive).to.be.false;\n expect(pending.summary).to.include('A hidden dependent of acme.cards is released only by a run');\n const released = await laneArchiveDecision(\n laneId,\n 'acme.cards',\n deps({ readLane: async () => snapshot([], [ownHidden]), releasedHeadByThisRun: () => 'h1' })\n );\n expect(released.archive).to.be.true;\n });\n\n it('counts a foreign component hidden in updateDependents as lane work too', async () => {\n const decision = await laneArchiveDecision(\n laneId,\n 'acme.cards',\n deps({ readLane: async () => snapshot([], [foreignEntry]) })\n );\n expect(decision.archive).to.be.false;\n expect(decision.summary).to.include('not on their main yet: acme.payments/ui/table.');\n });\n\n it('counts a foreign component the lane deletes as pending until its main head is removed', async () => {\n const deleted = { ...foreignEntry, isDeleted: true };\n const model = { getHead: () => ({ toString: () => 'main-head' }), getHeadAsTagIfExist: () => '0.0.1' } as any;\n const mainHeadRemoved = (removed: boolean) => ({ load: async () => ({ isRemoved: () => removed }) }) as any;\n const pending = await laneArchiveDecision(\n laneId,\n 'acme.cards',\n deps({\n readLane: async () => snapshot([deleted]),\n getModelComponent: async () => model,\n objects: mainHeadRemoved(false),\n })\n );\n expect(pending.archive).to.be.false;\n const released = await laneArchiveDecision(\n laneId,\n 'acme.cards',\n deps({\n readLane: async () => snapshot([deleted]),\n getModelComponent: async () => model,\n objects: mainHeadRemoved(true),\n })\n );\n expect(released.archive).to.be.true;\n });\n\n it('treats a foreign component with no main yet as not released', async () => {\n const decision = await laneArchiveDecision(\n laneId,\n 'acme.cards',\n deps({ readLane: async () => snapshot([foreignEntry]) })\n );\n expect(decision.archive).to.be.false;\n expect(decision.summary).to.include('not on their main yet: acme.payments/ui/table.');\n });\n});\n\ndescribe('sameReleasedState', () => {\n type Spec = {\n files?: Array<[string, string]>;\n mainFile?: string;\n packages?: Record<string, string>;\n deps?: string[];\n config?: Array<[string, Record<string, unknown>]>;\n data?: Array<[string, Record<string, unknown>]>;\n };\n const version = ({\n files = [['a.ts', '1']],\n mainFile = 'a.ts',\n packages = {},\n deps = [],\n config = [],\n data = [],\n }: Spec) => {\n const componentId = (id: string) => {\n const [name, ver] = id.split('@');\n return { toString: () => id, toStringWithoutVersion: () => name, version: ver };\n };\n const extensions = config.map(([stringId, cfg], i) => ({\n stringId,\n extensionId: stringId.startsWith('@')\n ? undefined\n : {\n toStringWithoutVersion: () => stringId.split('@')[0],\n toString: () => stringId,\n version: stringId.split('@')[1],\n },\n config: cfg,\n data: data[i]?.[1] ?? {},\n }));\n return {\n mainFile,\n files: files.map(([relativePath, hash]) => ({ relativePath, file: { toString: () => hash } })),\n packageDependencies: packages,\n devPackageDependencies: {},\n peerPackageDependencies: {},\n dependencies: { get: () => deps.map((d) => ({ id: componentId(d) })) },\n devDependencies: { get: () => [] },\n peerDependencies: { get: () => [] },\n extensions,\n } as any;\n };\n\n it('is true for the same sources, packages, dependencies and config, in any order', () => {\n const a = version({\n files: [\n ['a.ts', '1'],\n ['b.ts', '2'],\n ],\n packages: { lodash: '^4' },\n deps: ['acme.cards/x@0.0.1'],\n config: [['teambit.envs/envs', { env: 'node' }]],\n });\n const b = version({\n files: [\n ['b.ts', '2'],\n ['a.ts', '1'],\n ],\n packages: { lodash: '^4' },\n deps: ['acme.cards/x@0.0.1'],\n config: [['teambit.envs/envs', { env: 'node' }]],\n });\n expect(sameReleasedState(a, b, [], new Map())).to.be.true;\n });\n\n it('is false when a file differs, is missing, or is extra', () => {\n expect(sameReleasedState(version({ files: [['a.ts', '1']] }), version({ files: [['a.ts', '9']] }), [], new Map()))\n .to.be.false;\n expect(\n sameReleasedState(\n version({\n files: [\n ['a.ts', '1'],\n ['b.ts', '2'],\n ],\n }),\n version({ files: [['a.ts', '1']] }),\n [],\n new Map()\n )\n ).to.be.false;\n expect(\n sameReleasedState(\n version({ files: [['a.ts', '1']] }),\n version({\n files: [\n ['a.ts', '1'],\n ['b.ts', '2'],\n ],\n }),\n [],\n new Map()\n )\n ).to.be.false;\n });\n\n it('is false when only a package dependency, a component dependency version, or a config differs', () => {\n expect(\n sameReleasedState(version({ packages: { lodash: '^4' } }), version({ packages: { lodash: '^5' } }), [], new Map())\n ).to.be.false;\n expect(\n sameReleasedState(\n version({ deps: ['acme.cards/x@0.0.1'] }),\n version({ deps: ['acme.cards/x@0.0.2'] }),\n [],\n new Map()\n )\n ).to.be.false;\n expect(\n sameReleasedState(\n version({ config: [['teambit.envs/envs', { env: 'node' }]] }),\n version({ config: [['teambit.envs/envs', { env: 'react' }]] }),\n [],\n new Map()\n )\n ).to.be.false;\n });\n\n it('is false when only the overrides or package.json changes differ', () => {\n const base = version({});\n expect(sameReleasedState(base, { ...base, overrides: { dependencies: { x: '1' } } }, [], new Map())).to.be.false;\n expect(sameReleasedState(base, { ...base, packageJsonChangedProps: { sideEffects: false } }, [], new Map())).to.be\n .false;\n });\n\n it('keeps package-named extensions apart by their full name', () => {\n const a = version({ config: [['@scope/a', { x: 1 }]] });\n const b = version({ config: [['@scope/b', { x: 1 }]] });\n expect(sameReleasedState(a, b, [], new Map())).to.be.false;\n expect(sameReleasedState(a, version({ config: [['@scope/a', { x: 1 }]] }), [], new Map())).to.be.true;\n });\n\n it('is insensitive to key order in package dependencies and nested extension config', () => {\n const a = version({\n packages: { lodash: '^4', react: '^18' },\n config: [['teambit.envs/envs', { env: 'node', opts: { a: 1, b: 2 } }]],\n });\n const b = version({\n packages: { react: '^18', lodash: '^4' },\n config: [['teambit.envs/envs', { opts: { b: 2, a: 1 }, env: 'node' }]],\n });\n expect(sameReleasedState(a, b, [], new Map())).to.be.true;\n });\n\n it('accepts an on-lane extension only at its released head; an off-lane extension must match exactly', () => {\n const lane = version({ config: [['teambit.react/react@0.0.0-abc123', { compiler: 'swc' }]] });\n const released = version({ config: [['teambit.react/react@1.2.3', { compiler: 'swc' }]] });\n const onLane = ['teambit.react/react'];\n expect(sameReleasedState(lane, released, onLane, new Map([['teambit.react/react', '1.2.3']]))).to.be.true;\n expect(sameReleasedState(lane, released, onLane, new Map([['teambit.react/react', '1.2.4']]))).to.be.false;\n expect(sameReleasedState(lane, released, [], new Map())).to.be.false; // a lane-only env upgrade\n expect(\n sameReleasedState(\n lane,\n version({ config: [['teambit.react/react@1.2.3', { compiler: 'tsc' }]] }),\n onLane,\n new Map([['teambit.react/react', '1.2.3']])\n )\n ).to.be.false;\n });\n\n it('accepts an on-lane dependency only at its released head, and ignores extension data', () => {\n const lane = version({\n deps: ['acme.cards/x@abc123'],\n config: [['teambit.deps/resolver', { policy: {} }]],\n data: [['teambit.deps/resolver', { versions: 'lane' }]],\n });\n const released = version({\n deps: ['acme.cards/x@0.0.9'],\n config: [['teambit.deps/resolver', { policy: {} }]],\n data: [['teambit.deps/resolver', { versions: 'main' }]],\n });\n const headIs = (v: string) => new Map([['acme.cards/x', v]]);\n expect(sameReleasedState(lane, released, ['acme.cards/x'], headIs('0.0.9'))).to.be.true;\n // main still references an older tag of x: a stale main, not the release of this lane head\n expect(sameReleasedState(lane, released, ['acme.cards/x'], headIs('0.0.10'))).to.be.false;\n expect(sameReleasedState(lane, released, [], new Map())).to.be.false;\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Logger } from '@teambit/logger';
|
|
2
|
+
import type { LaneId } from '@teambit/lane-id';
|
|
3
|
+
import type { Lane } from '@teambit/objects';
|
|
4
|
+
import type { LaneArchiveDeps } from './lane-archive-guard';
|
|
5
|
+
export type LaneCleanupDeps = LaneArchiveDeps & {
|
|
6
|
+
logger: Logger;
|
|
7
|
+
defaultScope: string;
|
|
8
|
+
parseLaneId(idStr: string): Promise<LaneId>;
|
|
9
|
+
/** `{defaultScope}/{sanitized branch}` — the lane a branch maps to when nothing else says */
|
|
10
|
+
convertBranchToLaneId(branchName: string): string;
|
|
11
|
+
archiveLane(laneId: string): Promise<'deleted' | 'not-found' | 'error'>;
|
|
12
|
+
};
|
|
13
|
+
export declare class LaneCleanup {
|
|
14
|
+
private deps;
|
|
15
|
+
constructor(deps: LaneCleanupDeps);
|
|
16
|
+
/**
|
|
17
|
+
* Performs lane cleanup by attempting to detect and archive the source lane after a successful
|
|
18
|
+
* merge, even when running on the main branch.
|
|
19
|
+
*/
|
|
20
|
+
run(currentLane: Lane | undefined, explicitLaneName?: string, initialCommitSha?: string): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Archives the lane unless it still carries components of other scopes whose lane heads are not
|
|
23
|
+
* on their own main yet. Each scope's repository releases its own slice, so the last release is
|
|
24
|
+
* the one that archives; an earlier archive would strand the other slices on an unreadable lane
|
|
25
|
+
* and make every other repository's `bit ci sync` close its mirror pull request.
|
|
26
|
+
*/
|
|
27
|
+
private archiveIfFullyReleased;
|
|
28
|
+
}
|