@knkcs/contenthub-ui 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/README.md +2 -2
- package/dist/{branch-content-fields-SshLLDRV.js → branch-content-fields-LyF6sD2e.js} +2 -2
- package/dist/{branch-content-fields-SshLLDRV.js.map → branch-content-fields-LyF6sD2e.js.map} +1 -1
- package/dist/{content-library-B6Y9Bxph.js → content-library-v0mjVD4J.js} +344 -341
- package/dist/content-library-v0mjVD4J.js.map +1 -0
- package/dist/{heads-Brd2Gtjm.js → heads-dBmqNcOB.js} +12 -12
- package/dist/heads-dBmqNcOB.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +1984 -1978
- package/dist/index.js.map +1 -1
- package/dist/testing.d.ts +14 -3
- package/dist/testing.js +442 -432
- package/dist/testing.js.map +1 -1
- package/package.json +1 -1
- package/dist/content-library-B6Y9Bxph.js.map +0 -1
- package/dist/heads-Brd2Gtjm.js.map +0 -1
package/dist/testing.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { A as e, C as t,
|
|
2
|
-
import { Code as
|
|
3
|
-
import { createHostMembers as
|
|
1
|
+
import { A as e, C as t, D as n, M as r, N as i, S as a, T as o, _ as s, b as c, f as l, g as u, h as d, i as f, j as p, n as m, o as ee, r as h, s as te, t as ne, u as re, v as ie, w as g, x as ae, y as _ } from "./heads-dBmqNcOB.js";
|
|
2
|
+
import { Code as v, ConnectError as y } from "@connectrpc/connect";
|
|
3
|
+
import { createHostMembers as b } from "@knkcs/anker/host";
|
|
4
4
|
//#region src/testing/fixtures.ts
|
|
5
|
-
var
|
|
6
|
-
function
|
|
5
|
+
var x = "ws_stub", S = "user_stub", C = "user_ben", w = "2026-10-01T09:00:00.000Z";
|
|
6
|
+
function T() {
|
|
7
7
|
return {
|
|
8
|
-
userId:
|
|
9
|
-
workspaceId:
|
|
10
|
-
members:
|
|
11
|
-
userId:
|
|
8
|
+
userId: S,
|
|
9
|
+
workspaceId: x,
|
|
10
|
+
members: b([{
|
|
11
|
+
userId: S,
|
|
12
12
|
displayName: "Ada Editor",
|
|
13
13
|
email: "ada@example.com"
|
|
14
14
|
}, {
|
|
15
|
-
userId:
|
|
15
|
+
userId: C,
|
|
16
16
|
displayName: "Ben Reviewer",
|
|
17
17
|
email: "ben@example.com"
|
|
18
18
|
}])
|
|
@@ -22,16 +22,16 @@ function oe() {
|
|
|
22
22
|
return [{
|
|
23
23
|
id: "br_author",
|
|
24
24
|
name: "Being revised by the author",
|
|
25
|
-
createTime:
|
|
26
|
-
updateTime:
|
|
25
|
+
createTime: w,
|
|
26
|
+
updateTime: w
|
|
27
27
|
}, {
|
|
28
28
|
id: "br_embargo",
|
|
29
29
|
name: "Embargoed until publication",
|
|
30
|
-
createTime:
|
|
31
|
-
updateTime:
|
|
30
|
+
createTime: w,
|
|
31
|
+
updateTime: w
|
|
32
32
|
}];
|
|
33
33
|
}
|
|
34
|
-
function
|
|
34
|
+
function E() {
|
|
35
35
|
return [
|
|
36
36
|
{
|
|
37
37
|
slug: "in_progress",
|
|
@@ -55,7 +55,7 @@ function se() {
|
|
|
55
55
|
}
|
|
56
56
|
];
|
|
57
57
|
}
|
|
58
|
-
function
|
|
58
|
+
function se() {
|
|
59
59
|
return {
|
|
60
60
|
in_progress: ["in_review", "on_hold"],
|
|
61
61
|
in_review: [
|
|
@@ -67,7 +67,7 @@ function ce() {
|
|
|
67
67
|
on_hold: ["in_progress"]
|
|
68
68
|
};
|
|
69
69
|
}
|
|
70
|
-
function
|
|
70
|
+
function ce() {
|
|
71
71
|
return [
|
|
72
72
|
{
|
|
73
73
|
id: "cs_bgbl_270",
|
|
@@ -77,7 +77,7 @@ function le() {
|
|
|
77
77
|
reference: "BGBl. 2026 I Nr. 270"
|
|
78
78
|
},
|
|
79
79
|
state: "open",
|
|
80
|
-
createdBy:
|
|
80
|
+
createdBy: S,
|
|
81
81
|
createTime: "2026-09-30T08:00:00.000Z",
|
|
82
82
|
chains: [{
|
|
83
83
|
id: "chain_para_1",
|
|
@@ -110,7 +110,7 @@ function le() {
|
|
|
110
110
|
}],
|
|
111
111
|
dependsOnChangeSetIds: [],
|
|
112
112
|
status: "in_progress",
|
|
113
|
-
assigneeIds: [
|
|
113
|
+
assigneeIds: [S],
|
|
114
114
|
plannedReleases: [
|
|
115
115
|
{
|
|
116
116
|
id: "rls_p1_2",
|
|
@@ -170,19 +170,19 @@ function le() {
|
|
|
170
170
|
reference: "BGBl. 2026 I Nr. 255"
|
|
171
171
|
},
|
|
172
172
|
state: "open",
|
|
173
|
-
createdBy:
|
|
173
|
+
createdBy: C,
|
|
174
174
|
createTime: "2026-09-25T08:00:00.000Z",
|
|
175
175
|
chains: [],
|
|
176
176
|
dependsOnChangeSetIds: [],
|
|
177
177
|
status: "",
|
|
178
|
-
assigneeIds: [
|
|
178
|
+
assigneeIds: [C],
|
|
179
179
|
plannedReleases: []
|
|
180
180
|
},
|
|
181
181
|
{
|
|
182
182
|
id: "cs_correction_3",
|
|
183
183
|
name: "Correction of § 3",
|
|
184
184
|
state: "published",
|
|
185
|
-
createdBy:
|
|
185
|
+
createdBy: S,
|
|
186
186
|
createTime: "2026-09-01T08:00:00.000Z",
|
|
187
187
|
closeTime: "2026-09-02T08:00:00.000Z",
|
|
188
188
|
chains: [],
|
|
@@ -193,7 +193,7 @@ function le() {
|
|
|
193
193
|
}
|
|
194
194
|
];
|
|
195
195
|
}
|
|
196
|
-
function
|
|
196
|
+
function le() {
|
|
197
197
|
return [{
|
|
198
198
|
id: "rc_print",
|
|
199
199
|
name: "Druckprobe",
|
|
@@ -208,7 +208,7 @@ function ue() {
|
|
|
208
208
|
independent: !0
|
|
209
209
|
}];
|
|
210
210
|
}
|
|
211
|
-
function
|
|
211
|
+
function ue() {
|
|
212
212
|
return [
|
|
213
213
|
{
|
|
214
214
|
id: "col_bgb",
|
|
@@ -236,7 +236,7 @@ function de() {
|
|
|
236
236
|
}
|
|
237
237
|
];
|
|
238
238
|
}
|
|
239
|
-
function
|
|
239
|
+
function de() {
|
|
240
240
|
return [
|
|
241
241
|
{
|
|
242
242
|
id: "bp_commentary",
|
|
@@ -252,7 +252,7 @@ function fe() {
|
|
|
252
252
|
}
|
|
253
253
|
];
|
|
254
254
|
}
|
|
255
|
-
function
|
|
255
|
+
function fe() {
|
|
256
256
|
return [
|
|
257
257
|
{
|
|
258
258
|
id: "bpr_paragraph_2",
|
|
@@ -274,7 +274,7 @@ function pe() {
|
|
|
274
274
|
}
|
|
275
275
|
];
|
|
276
276
|
}
|
|
277
|
-
function
|
|
277
|
+
function pe() {
|
|
278
278
|
let e = (e, t) => ({
|
|
279
279
|
field_type: "text",
|
|
280
280
|
config: {
|
|
@@ -301,7 +301,7 @@ function me() {
|
|
|
301
301
|
}
|
|
302
302
|
};
|
|
303
303
|
}
|
|
304
|
-
function
|
|
304
|
+
function D() {
|
|
305
305
|
let e = "2001-11-01T08:00:00.000Z";
|
|
306
306
|
return {
|
|
307
307
|
id: "content_para_3",
|
|
@@ -332,7 +332,7 @@ function T() {
|
|
|
332
332
|
}]
|
|
333
333
|
};
|
|
334
334
|
}
|
|
335
|
-
function
|
|
335
|
+
function me() {
|
|
336
336
|
let e = "2026-09-01T08:00:00.000Z";
|
|
337
337
|
return [
|
|
338
338
|
{
|
|
@@ -365,7 +365,7 @@ function he() {
|
|
|
365
365
|
blueprintId: "bp_paragraph",
|
|
366
366
|
blueprintReleaseId: "bpr_paragraph_1",
|
|
367
367
|
collectionIds: ["col_bgb"],
|
|
368
|
-
assigneeIds: [
|
|
368
|
+
assigneeIds: [S, C],
|
|
369
369
|
main: {
|
|
370
370
|
revisionId: "rev_p1_main",
|
|
371
371
|
data: {
|
|
@@ -432,7 +432,7 @@ function he() {
|
|
|
432
432
|
secondParentId: "",
|
|
433
433
|
blueprintReleaseId: "bpr_paragraph_1",
|
|
434
434
|
createTime: "2026-09-30T09:00:00.000Z",
|
|
435
|
-
author:
|
|
435
|
+
author: S,
|
|
436
436
|
cause: "save",
|
|
437
437
|
branchId: "br_para_1_b",
|
|
438
438
|
changeSetId: "cs_bgbl_270",
|
|
@@ -448,7 +448,7 @@ function he() {
|
|
|
448
448
|
secondParentId: "",
|
|
449
449
|
blueprintReleaseId: "bpr_paragraph_1",
|
|
450
450
|
createTime: "2026-09-30T08:30:00.000Z",
|
|
451
|
-
author:
|
|
451
|
+
author: C,
|
|
452
452
|
cause: "save",
|
|
453
453
|
branchId: "br_para_1_a",
|
|
454
454
|
changeSetId: "cs_bgbl_270",
|
|
@@ -464,7 +464,7 @@ function he() {
|
|
|
464
464
|
secondParentId: "",
|
|
465
465
|
blueprintReleaseId: "bpr_paragraph_1",
|
|
466
466
|
createTime: e,
|
|
467
|
-
author:
|
|
467
|
+
author: S,
|
|
468
468
|
cause: "create",
|
|
469
469
|
branchId: "br_para_1_main",
|
|
470
470
|
changeSetId: "cs_correction_3"
|
|
@@ -548,7 +548,7 @@ function he() {
|
|
|
548
548
|
blueprintId: "bp_paragraph",
|
|
549
549
|
blueprintReleaseId: "bpr_paragraph_1",
|
|
550
550
|
collectionIds: ["col_stgb"],
|
|
551
|
-
assigneeIds: [
|
|
551
|
+
assigneeIds: [C],
|
|
552
552
|
main: {
|
|
553
553
|
revisionId: "rev_s211_main",
|
|
554
554
|
data: {
|
|
@@ -585,7 +585,7 @@ function he() {
|
|
|
585
585
|
}
|
|
586
586
|
//#endregion
|
|
587
587
|
//#region src/testing/stub-blueprint-source.ts
|
|
588
|
-
function
|
|
588
|
+
function he(e = de(), t = fe()) {
|
|
589
589
|
return {
|
|
590
590
|
async searchBlueprints({ query: t }) {
|
|
591
591
|
let n = t.trim().toLocaleLowerCase();
|
|
@@ -604,37 +604,37 @@ function ge(e = fe(), t = pe()) {
|
|
|
604
604
|
}
|
|
605
605
|
//#endregion
|
|
606
606
|
//#region src/testing/stub-client.ts
|
|
607
|
-
function
|
|
607
|
+
function ge(e, t) {
|
|
608
608
|
let n = /* @__PURE__ */ new Date(`${e}T00:00:00Z`);
|
|
609
609
|
return n.setUTCDate(n.getUTCDate() + t), n.toISOString().slice(0, 10);
|
|
610
610
|
}
|
|
611
|
-
function
|
|
611
|
+
function O(e, t, n) {
|
|
612
612
|
let r = e.trim();
|
|
613
|
-
if (r === "") throw new
|
|
614
|
-
if ([...r].length > n) throw new
|
|
615
|
-
if (/[\u0000-\u001f\u007f]/.test(r)) throw new
|
|
613
|
+
if (r === "") throw new a(`${t} is required`);
|
|
614
|
+
if ([...r].length > n) throw new a(`${t} is at most ${n} characters`);
|
|
615
|
+
if (/[\u0000-\u001f\u007f]/.test(r)) throw new a(`${t} is one line of text`);
|
|
616
616
|
return r;
|
|
617
617
|
}
|
|
618
|
-
function
|
|
619
|
-
if (!/^\d{4}-\d{2}-\d{2}$/.test(e.date.trim())) throw new
|
|
618
|
+
function _e(e) {
|
|
619
|
+
if (!/^\d{4}-\d{2}-\d{2}$/.test(e.date.trim())) throw new a(`source.date "${e.date}" is not a day as YYYY-MM-DD`);
|
|
620
620
|
return {
|
|
621
621
|
date: e.date.trim(),
|
|
622
|
-
reference:
|
|
622
|
+
reference: O(e.reference, "source.reference", 500)
|
|
623
623
|
};
|
|
624
624
|
}
|
|
625
|
-
function
|
|
625
|
+
function ve(e) {
|
|
626
626
|
let t = e.trim();
|
|
627
|
-
if (t === "") throw new
|
|
628
|
-
if ([...t].length > 200) throw new
|
|
629
|
-
if (/[\u0000-\u001f\u007f]/.test(t)) throw new
|
|
627
|
+
if (t === "") throw new a("a Block Reason needs a name");
|
|
628
|
+
if ([...t].length > 200) throw new a("a Block Reason's name is at most 200 characters");
|
|
629
|
+
if (/[\u0000-\u001f\u007f]/.test(t)) throw new a("a Block Reason's name is one line of text");
|
|
630
630
|
return t;
|
|
631
631
|
}
|
|
632
|
-
function
|
|
633
|
-
let t =
|
|
634
|
-
if (e.scope !== "branch" && e.scope !== "change_set") throw new
|
|
632
|
+
function ye(e) {
|
|
633
|
+
let t = O(e.name, "a Required Check's name", 200);
|
|
634
|
+
if (e.scope !== "branch" && e.scope !== "change_set") throw new a("a Required Check's scope is Branch or Change Set");
|
|
635
635
|
let n = e.blueprintAccessors.map((e) => {
|
|
636
636
|
let t = e.trim();
|
|
637
|
-
if (t === "" || [...t].length > 200 || /[\u0000-\u001f\u007f]/.test(t)) throw new
|
|
637
|
+
if (t === "" || [...t].length > 200 || /[\u0000-\u001f\u007f]/.test(t)) throw new a(`"${t}" is not a Blueprint accessor`);
|
|
638
638
|
return t;
|
|
639
639
|
});
|
|
640
640
|
return {
|
|
@@ -644,12 +644,12 @@ function be(e) {
|
|
|
644
644
|
independent: e.independent
|
|
645
645
|
};
|
|
646
646
|
}
|
|
647
|
-
var
|
|
648
|
-
function
|
|
649
|
-
return new
|
|
647
|
+
var be = "who records a Required Check can be narrowed only in authz.mode guardian: in workspace mode every member records every check (ADR 0017)", xe = "this Change Set holds work you can't see: publishing, discarding or updating all of it needs you to see every Content in it", Se = "Restricted Collections need authz.mode guardian: in workspace mode a restriction could not be enforced (ADR 0017)";
|
|
648
|
+
function k(e, t) {
|
|
649
|
+
return new y(`${e} ${t}: not found`, v.NotFound);
|
|
650
650
|
}
|
|
651
|
-
var
|
|
652
|
-
function
|
|
651
|
+
var A = (e) => structuredClone(e);
|
|
652
|
+
function j(e, t = {}) {
|
|
653
653
|
return {
|
|
654
654
|
code: e,
|
|
655
655
|
contentId: "",
|
|
@@ -669,34 +669,34 @@ function A(e, t = {}) {
|
|
|
669
669
|
...t
|
|
670
670
|
};
|
|
671
671
|
}
|
|
672
|
-
function
|
|
673
|
-
let
|
|
674
|
-
if (Ce.has(e)) throw new
|
|
675
|
-
},
|
|
672
|
+
function M(v = {}) {
|
|
673
|
+
let y = v.now ?? (() => "2026-10-01T09:00:00.000Z"), b = v.userId ?? "user_stub", x = v.statuses ?? E(), S = v.statusTransitions ?? se(), C = (v.blockReasons ?? oe()).map((e) => ({ ...e })), w = (v.changeSets ?? ce()).map(A), T = (v.collections ?? ue()).map((e) => ({ ...e })), D = structuredClone(v.contents ?? me()), he = v.blueprints ?? de(), M = v.blueprintReleases ?? fe(), P = v.resolvedReleases ?? pe(), F = structuredClone(v.requiredChecks ?? le()), I = v.authzMode ?? "guardian", Ce = new Set(v.withheld ?? []), L = (e) => {
|
|
674
|
+
if (Ce.has(e)) throw new i(xe);
|
|
675
|
+
}, R = new Map(Object.entries(structuredClone(v.collectionGrants ?? {}))), z = new Map(Object.entries(structuredClone(v.recorders ?? {}))), we = (e) => z.get(e) ?? {
|
|
676
676
|
everyMember: !0,
|
|
677
677
|
userIds: []
|
|
678
|
-
}, Te =
|
|
678
|
+
}, Te = v.memberIds ?? ["user_stub", "user_ben"], Ee = v.admin ?? !0, De = structuredClone(v.checkResults ?? []), Oe = v.publishBlockers ?? {}, ke = v.pendingMerges ?? {}, Ae = structuredClone(v.conflicts ?? {}), B = /* @__PURE__ */ new Map(), je = /* @__PURE__ */ new Map(), V = async (e, t, n) => {
|
|
679
679
|
if (!e) return n();
|
|
680
|
-
let r = JSON.stringify(t),
|
|
681
|
-
if (
|
|
682
|
-
if (
|
|
683
|
-
return structuredClone(
|
|
680
|
+
let r = JSON.stringify(t), i = je.get(e);
|
|
681
|
+
if (i) {
|
|
682
|
+
if (i.asked !== r) throw new a(`idempotency key ${e} names another request`);
|
|
683
|
+
return structuredClone(i.answer);
|
|
684
684
|
}
|
|
685
685
|
let o = await n();
|
|
686
|
-
return
|
|
686
|
+
return je.set(e, {
|
|
687
687
|
asked: r,
|
|
688
688
|
answer: structuredClone(o)
|
|
689
689
|
}), o;
|
|
690
|
-
},
|
|
691
|
-
let t =
|
|
692
|
-
if (!t) throw
|
|
690
|
+
}, Me = /* @__PURE__ */ new Map(), Ne = /* @__PURE__ */ new Map(), H = 1, U = (e) => {
|
|
691
|
+
let t = D.find((t) => t.id === e);
|
|
692
|
+
if (!t) throw k("Content", e);
|
|
693
693
|
return t;
|
|
694
694
|
}, W = (e) => structuredClone({
|
|
695
695
|
collectionIds: [...e.collectionIds].sort(),
|
|
696
696
|
assigneeIds: e.assigneeIds ?? [],
|
|
697
697
|
block: e.block,
|
|
698
698
|
archiveTime: e.archiveTime
|
|
699
|
-
}),
|
|
699
|
+
}), Pe = () => y().slice(0, 10), G = (e) => P[e.blueprintReleaseId]?.dated ?? !1, K = (e) => {
|
|
700
700
|
let t = [...e.revisions ?? []], n = [...Object.entries(e.branches).map(([e, t]) => ({
|
|
701
701
|
...t,
|
|
702
702
|
changeSetId: e
|
|
@@ -712,7 +712,7 @@ function j(_ = {}) {
|
|
|
712
712
|
secondParentId: "",
|
|
713
713
|
blueprintReleaseId: e.blueprintReleaseId,
|
|
714
714
|
createTime: r.revisionCreateTime,
|
|
715
|
-
author:
|
|
715
|
+
author: b,
|
|
716
716
|
cause: "create",
|
|
717
717
|
branchId: r.branchId,
|
|
718
718
|
changeSetId: r.changeSetId,
|
|
@@ -723,59 +723,59 @@ function j(_ = {}) {
|
|
|
723
723
|
e.main,
|
|
724
724
|
e.inForce,
|
|
725
725
|
...Object.values(e.branches)
|
|
726
|
-
].find((e) => e?.revisionId === t)?.data ?? e.revisions?.find((e) => e.id === t)?.data,
|
|
726
|
+
].find((e) => e?.revisionId === t)?.data ?? e.revisions?.find((e) => e.id === t)?.data, Fe = (e, t) => {
|
|
727
727
|
let n = (e) => e == null || e === "" || Array.isArray(e) && e.length === 0;
|
|
728
728
|
return (e ?? []).filter((e) => e.config.required === !0 && n(t[e.config.api_accessor])).map((e) => e.config.api_accessor);
|
|
729
729
|
}, J = (e) => {
|
|
730
|
-
if (e.archiveTime) throw new
|
|
731
|
-
if (e.block && !e.block.allowedUserIds.includes(
|
|
732
|
-
},
|
|
730
|
+
if (e.archiveTime) throw new s(e.id);
|
|
731
|
+
if (e.block && !e.block.allowedUserIds.includes(b)) throw new ie(e.id, e.block.blockReasonId);
|
|
732
|
+
}, Ie = (e) => D.flatMap((t) => (t.edges ?? []).filter((n) => n.targetContentId === e && n.pinReleaseId === "" && t.inForce?.revisionId === n.sourceRevisionId).map((e) => ({
|
|
733
733
|
edge: { ...e },
|
|
734
734
|
releaseId: t.inForce?.releaseId ?? ""
|
|
735
|
-
}))),
|
|
736
|
-
let t =
|
|
737
|
-
if (!t) throw
|
|
735
|
+
}))), Le = (e, t) => e.name < t.name ? -1 : e.name > t.name ? 1 : e.id < t.id ? -1 : +(e.id > t.id), Re = (e, t) => C.some((n) => n.name === e && n.id !== t), ze = (e, t) => e.name < t.name ? -1 : e.name > t.name ? 1 : e.id < t.id ? -1 : +(e.id > t.id), Y = (e) => {
|
|
736
|
+
let t = T.find((t) => t.id === e);
|
|
737
|
+
if (!t) throw k("Collection", e);
|
|
738
738
|
return t;
|
|
739
|
-
},
|
|
740
|
-
if (
|
|
741
|
-
if (!Y(e).restricted) throw new
|
|
742
|
-
let t = (
|
|
743
|
-
if (!Ee && !t) throw new
|
|
744
|
-
},
|
|
745
|
-
if (
|
|
746
|
-
if (!Ee) throw new
|
|
747
|
-
if (e === "") throw new
|
|
748
|
-
if (!
|
|
739
|
+
}, Be = (e, t, n) => T.some((r) => r.parentId === e && r.name === t && r.id !== n), Ve = (e) => {
|
|
740
|
+
if (I === "workspace") throw new n(Se);
|
|
741
|
+
if (!Y(e).restricted) throw new a(`Collection ${e} is open: only a Restricted Collection takes grants`);
|
|
742
|
+
let t = (R.get(e) ?? []).some((e) => e.userId === b && e.level === "owner");
|
|
743
|
+
if (!Ee && !t) throw new te("only its owner or a workspace admin manages its grants");
|
|
744
|
+
}, He = (e) => {
|
|
745
|
+
if (I === "workspace") throw new ae("required_check_recorders", be);
|
|
746
|
+
if (!Ee) throw new te("permission denied");
|
|
747
|
+
if (e === "") throw new a("required_check_id is required");
|
|
748
|
+
if (!F.some((t) => t.id === e)) throw k("Required Check", e);
|
|
749
749
|
return we(e);
|
|
750
|
-
},
|
|
751
|
-
let
|
|
752
|
-
if (!
|
|
753
|
-
let
|
|
754
|
-
if (J(
|
|
755
|
-
if (
|
|
756
|
-
if (
|
|
757
|
-
contentId:
|
|
758
|
-
branchId:
|
|
759
|
-
expectedHeadId:
|
|
760
|
-
currentHeadId:
|
|
750
|
+
}, Ue = async ({ changeSetId: t, branchId: n, expectedHeadId: r, data: i, fieldMask: o }) => {
|
|
751
|
+
let s = Z(t).chains.find((e) => e.branches.some((e) => e.id === n)), c = s?.branches.find((e) => e.id === n);
|
|
752
|
+
if (!s || !c) throw k("Branch", n);
|
|
753
|
+
let l = U(s.contentId);
|
|
754
|
+
if (J(l), B.has(n)) throw new a("a Pending Merge waits on this Branch: resolve or abort it first");
|
|
755
|
+
if (r === "") throw new a("expected_head_id is required");
|
|
756
|
+
if (c.headRevisionId !== r) throw new e({
|
|
757
|
+
contentId: l.id,
|
|
758
|
+
branchId: n,
|
|
759
|
+
expectedHeadId: r,
|
|
760
|
+
currentHeadId: c.headRevisionId
|
|
761
761
|
});
|
|
762
|
-
let
|
|
763
|
-
if (
|
|
764
|
-
let e = Object.keys(
|
|
765
|
-
if (e.length > 0) throw new
|
|
766
|
-
|
|
767
|
-
for (let e of
|
|
768
|
-
} else
|
|
769
|
-
return
|
|
770
|
-
changeSetId:
|
|
771
|
-
chain:
|
|
772
|
-
branch:
|
|
773
|
-
c,
|
|
774
|
-
data:
|
|
762
|
+
let u = q(l, c.headRevisionId) ?? {}, d = JSON.parse(JSON.stringify(i)), f;
|
|
763
|
+
if (o) {
|
|
764
|
+
let e = Object.keys(d).filter((e) => !o.includes(e));
|
|
765
|
+
if (e.length > 0) throw new a(`data holds ${e.join(", ")}, which the mask doesn't name`);
|
|
766
|
+
f = structuredClone(u);
|
|
767
|
+
for (let e of o) e in d ? f[e] = d[e] : delete f[e];
|
|
768
|
+
} else f = d;
|
|
769
|
+
return We({
|
|
770
|
+
changeSetId: t,
|
|
771
|
+
chain: s,
|
|
772
|
+
branch: c,
|
|
773
|
+
c: l,
|
|
774
|
+
data: f,
|
|
775
775
|
cause: "save"
|
|
776
776
|
});
|
|
777
|
-
},
|
|
778
|
-
let s = n.id, c = `rev_stub_${H++}`, l =
|
|
777
|
+
}, We = ({ changeSetId: e, chain: t, branch: n, c: r, data: i, cause: a, secondParentId: o = "" }) => {
|
|
778
|
+
let s = n.id, c = `rev_stub_${H++}`, l = y();
|
|
779
779
|
return r.revisions = [{
|
|
780
780
|
id: c,
|
|
781
781
|
contentId: r.id,
|
|
@@ -783,7 +783,7 @@ function j(_ = {}) {
|
|
|
783
783
|
secondParentId: o,
|
|
784
784
|
blueprintReleaseId: r.blueprintReleaseId,
|
|
785
785
|
createTime: l,
|
|
786
|
-
author:
|
|
786
|
+
author: b,
|
|
787
787
|
cause: a,
|
|
788
788
|
branchId: s,
|
|
789
789
|
changeSetId: e,
|
|
@@ -804,17 +804,17 @@ function j(_ = {}) {
|
|
|
804
804
|
revisionCreateTime: l,
|
|
805
805
|
releaseId: ""
|
|
806
806
|
};
|
|
807
|
-
},
|
|
807
|
+
}, Ge = (e, t) => {
|
|
808
808
|
let n = Z(e), r = n.chains.find((e) => e.branches.some((e) => e.id === t)), i = r?.branches.find((e) => e.id === t);
|
|
809
|
-
if (!r || !i) throw
|
|
809
|
+
if (!r || !i) throw k("Branch", t);
|
|
810
810
|
return {
|
|
811
811
|
cs: n,
|
|
812
812
|
chain: r,
|
|
813
813
|
branch: i,
|
|
814
814
|
c: U(r.contentId)
|
|
815
815
|
};
|
|
816
|
-
},
|
|
817
|
-
for (let n of
|
|
816
|
+
}, Ke = (e, t) => {
|
|
817
|
+
for (let n of w) for (let r of n.chains) {
|
|
818
818
|
let n = r.branches.find((t) => t.id === e);
|
|
819
819
|
if (!n) continue;
|
|
820
820
|
let i = {
|
|
@@ -827,33 +827,33 @@ function j(_ = {}) {
|
|
|
827
827
|
fields: structuredClone(t.fields),
|
|
828
828
|
merged: structuredClone(t.merged)
|
|
829
829
|
};
|
|
830
|
-
B.set(e, i), n.hasPendingMerge = !0, delete
|
|
830
|
+
B.set(e, i), n.hasPendingMerge = !0, delete Ae[e];
|
|
831
831
|
return;
|
|
832
832
|
}
|
|
833
|
-
throw
|
|
834
|
-
},
|
|
833
|
+
throw k("Branch", e);
|
|
834
|
+
}, qe = (e) => {
|
|
835
835
|
B.delete(e);
|
|
836
|
-
for (let t of
|
|
836
|
+
for (let t of w) for (let n of t.chains) {
|
|
837
837
|
let t = n.branches.find((t) => t.id === e);
|
|
838
838
|
t && (t.hasPendingMerge = !1);
|
|
839
839
|
}
|
|
840
|
-
},
|
|
840
|
+
}, Je = (e, t) => {
|
|
841
841
|
let n = t.validityPeriod;
|
|
842
842
|
if (G(e)) {
|
|
843
|
-
if (!n || !h.test(n.firstDay)) throw new
|
|
844
|
-
if (n.lastDay !== "" && (!h.test(n.lastDay) || n.lastDay < n.firstDay)) throw new
|
|
845
|
-
} else if (n) throw new
|
|
846
|
-
let r =
|
|
843
|
+
if (!n || !h.test(n.firstDay)) throw new a("validity_period.first_day is required for Dated Content");
|
|
844
|
+
if (n.lastDay !== "" && (!h.test(n.lastDay) || n.lastDay < n.firstDay)) throw new a("validity_period.last_day is a day on or after first_day");
|
|
845
|
+
} else if (n) throw new a("validity_period is refused for undated Content");
|
|
846
|
+
let r = Fe(P[e.blueprintReleaseId]?.releaseSpec, t.releaseSpec ?? {}).map((e) => ({
|
|
847
847
|
source: "fieldkit",
|
|
848
848
|
code: "required",
|
|
849
849
|
path: `/${e}`
|
|
850
850
|
}));
|
|
851
|
-
if (r.length > 0) throw new
|
|
851
|
+
if (r.length > 0) throw new _("the Release Spec values break the Blueprint Release", r);
|
|
852
852
|
if (n && n.lastDay !== "") {
|
|
853
853
|
let r = (e.timeline ?? []).filter((e) => e.validityPeriod && e.validityPeriod.lastDay !== "" && n.firstDay <= e.validityPeriod.firstDay && e.validityPeriod.lastDay <= n.lastDay && !t.supersedesReleaseIds.includes(e.releaseId)).map((e) => e.releaseId);
|
|
854
|
-
if (r.length > 0) throw new
|
|
854
|
+
if (r.length > 0) throw new c(e.id, r);
|
|
855
855
|
}
|
|
856
|
-
},
|
|
856
|
+
}, Ye = (e, t) => {
|
|
857
857
|
let n = e.plannedReleases.filter((e) => e.contentId === t.id && e.proposed), r = e.plannedReleases.filter((e) => !(e.contentId === t.id && e.proposed)), i = [], a = (e, r, a) => {
|
|
858
858
|
let o = n.find((t) => t.proposedForReleaseId === e.releaseId && t.splitFromReleaseId === a);
|
|
859
859
|
i.push({
|
|
@@ -876,23 +876,23 @@ function j(_ = {}) {
|
|
|
876
876
|
let t = r.validityPeriod;
|
|
877
877
|
t && !e.supersedesReleaseIds.includes(r.releaseId) && t.firstDay < n.firstDay && (t.lastDay === "" || t.lastDay >= n.firstDay) && (a(r, {
|
|
878
878
|
firstDay: t.firstDay,
|
|
879
|
-
lastDay:
|
|
879
|
+
lastDay: ge(n.firstDay, -1)
|
|
880
880
|
}, ""), n.lastDay !== "" && (t.lastDay === "" || t.lastDay > n.lastDay) && a(r, {
|
|
881
|
-
firstDay:
|
|
881
|
+
firstDay: ge(n.lastDay, 1),
|
|
882
882
|
lastDay: t.lastDay
|
|
883
883
|
}, r.releaseId));
|
|
884
884
|
}
|
|
885
885
|
}
|
|
886
886
|
e.plannedReleases = [...r, ...i];
|
|
887
887
|
}, X = (e) => {
|
|
888
|
-
let t =
|
|
889
|
-
if (!t) throw
|
|
888
|
+
let t = w.find((t) => t.id === e);
|
|
889
|
+
if (!t) throw k("Change Set", e);
|
|
890
890
|
return t;
|
|
891
891
|
}, Z = (e) => {
|
|
892
892
|
let t = X(e);
|
|
893
|
-
if (t.state !== "open") throw new
|
|
893
|
+
if (t.state !== "open") throw new d(t.state);
|
|
894
894
|
return t;
|
|
895
|
-
},
|
|
895
|
+
}, Xe = (e) => x.find((t) => t.slug === e)?.name ?? e, Ze = (e, t, n = /* @__PURE__ */ new Set()) => e === t || !n.has(e) && (n.add(e), (w.find((t) => t.id === e)?.dependsOnChangeSetIds ?? []).some((e) => Ze(e, t, n))), Qe = (e) => [...e.chains.flatMap((e) => e.branches.map((t) => ({
|
|
896
896
|
key: t.id,
|
|
897
897
|
branchless: !1,
|
|
898
898
|
contentId: e.contentId,
|
|
@@ -902,9 +902,9 @@ function j(_ = {}) {
|
|
|
902
902
|
branchless: !0,
|
|
903
903
|
contentId: e.contentId,
|
|
904
904
|
revision: e.revisionId
|
|
905
|
-
}))],
|
|
906
|
-
let t =
|
|
907
|
-
let r = n[0], i = r ? !
|
|
905
|
+
}))], $e = (e) => D.find((t) => t.id === e)?.blueprintId, et = (e, t) => e.blueprintAccessors.length === 0 || e.blueprintAccessors.includes($e(t) ?? ""), tt = (e) => {
|
|
906
|
+
let t = Qe(e), n = (t, n) => De.filter((n) => n.changeSetId === e.id && n.requiredCheckId === t.id).filter((e) => (t.scope === "change_set" ? "" : Object.keys(e.heads)[0]) === n).reverse().map(({ changeSetId: e, ...t }) => structuredClone(t)), r = (e, t, n) => {
|
|
907
|
+
let r = n[0], i = r ? !m(r.heads, t.heads) : !1;
|
|
908
908
|
return {
|
|
909
909
|
check: structuredClone(e),
|
|
910
910
|
...t,
|
|
@@ -913,8 +913,8 @@ function j(_ = {}) {
|
|
|
913
913
|
cleared: !!r && !i && r.outcome !== "failed"
|
|
914
914
|
};
|
|
915
915
|
}, i = [], a = (e, t) => e.name < t.name ? -1 : e.name > t.name ? 1 : e.id < t.id ? -1 : +(e.id > t.id);
|
|
916
|
-
for (let e of [...
|
|
917
|
-
let a = t.filter((t) =>
|
|
916
|
+
for (let e of [...F].sort(a)) {
|
|
917
|
+
let a = t.filter((t) => et(e, t.contentId));
|
|
918
918
|
if (e.scope === "change_set") {
|
|
919
919
|
if (a.length === 0) continue;
|
|
920
920
|
let o = Object.fromEntries(t.map((e) => [e.key, e.revision]));
|
|
@@ -934,33 +934,33 @@ function j(_ = {}) {
|
|
|
934
934
|
}, n(e, t.key)));
|
|
935
935
|
}
|
|
936
936
|
return i;
|
|
937
|
-
},
|
|
938
|
-
let n = [], r =
|
|
939
|
-
for (let r of e.chains) for (let e of r.branches) t[e.id] !== e.headRevisionId && n.push(
|
|
937
|
+
}, nt = (e, t) => {
|
|
938
|
+
let n = [], r = ne(e);
|
|
939
|
+
for (let r of e.chains) for (let e of r.branches) t[e.id] !== e.headRevisionId && n.push(j("moved_head", {
|
|
940
940
|
contentId: r.contentId,
|
|
941
941
|
branchId: e.id,
|
|
942
942
|
expectedHeadId: t[e.id] ?? "",
|
|
943
943
|
currentHeadId: e.headRevisionId
|
|
944
944
|
}));
|
|
945
|
-
for (let [e, i] of Object.entries(t)) e in r || n.push(
|
|
945
|
+
for (let [e, i] of Object.entries(t)) e in r || n.push(j("moved_head", {
|
|
946
946
|
branchId: e,
|
|
947
947
|
expectedHeadId: i
|
|
948
948
|
}));
|
|
949
949
|
for (let t of e.dependsOnChangeSetIds) {
|
|
950
|
-
let e =
|
|
951
|
-
e === "open" ? n.push(
|
|
950
|
+
let e = w.find((e) => e.id === t)?.state;
|
|
951
|
+
e === "open" ? n.push(j("unpublished_dependency", { dependencyChangeSetId: t })) : e === "discarded" && n.push(j("discarded_dependency", { dependencyChangeSetId: t }));
|
|
952
952
|
}
|
|
953
|
-
for (let t of
|
|
953
|
+
for (let t of tt(e)) t.cleared || n.push(j("outstanding_check", {
|
|
954
954
|
requiredCheckId: t.check.id,
|
|
955
955
|
contentId: t.contentId,
|
|
956
956
|
branchId: t.branchId,
|
|
957
957
|
releaseId: t.releaseId
|
|
958
958
|
}));
|
|
959
959
|
for (let t of e.chains) {
|
|
960
|
-
let e =
|
|
960
|
+
let e = D.find((e) => e.id === t.contentId);
|
|
961
961
|
for (let r of t.branches) {
|
|
962
962
|
let t = e && q(e, r.headRevisionId);
|
|
963
|
-
if (e && t) for (let i of
|
|
963
|
+
if (e && t) for (let i of Fe(P[e.blueprintReleaseId]?.fields, t)) n.push(j("missing_required_field", {
|
|
964
964
|
contentId: e.id,
|
|
965
965
|
revisionId: r.headRevisionId,
|
|
966
966
|
path: `/${i}`
|
|
@@ -969,7 +969,7 @@ function j(_ = {}) {
|
|
|
969
969
|
}
|
|
970
970
|
return [...n, ...structuredClone(Oe[e.id] ?? [])];
|
|
971
971
|
}, Q = (e) => {
|
|
972
|
-
let t =
|
|
972
|
+
let t = ne(e);
|
|
973
973
|
return e.plannedReleases.filter((e) => !e.withheld).map((n) => ({
|
|
974
974
|
id: n.id,
|
|
975
975
|
contentId: n.contentId,
|
|
@@ -981,37 +981,37 @@ function j(_ = {}) {
|
|
|
981
981
|
validityPeriod: n.validityPeriod ? { ...n.validityPeriod } : void 0
|
|
982
982
|
}));
|
|
983
983
|
};
|
|
984
|
-
for (let [e, t] of Object.entries(
|
|
984
|
+
for (let [e, t] of Object.entries(Ae)) t.pending && Ke(e, t);
|
|
985
985
|
return {
|
|
986
986
|
async listBlockReasons() {
|
|
987
|
-
return [...
|
|
987
|
+
return [...C].sort(Le).map((e) => ({ ...e }));
|
|
988
988
|
},
|
|
989
989
|
async createBlockReason({ name: e }) {
|
|
990
|
-
let t =
|
|
991
|
-
if (
|
|
990
|
+
let t = ve(e);
|
|
991
|
+
if (Re(t)) throw new re(t);
|
|
992
992
|
let n = {
|
|
993
993
|
id: `br_stub_${H++}`,
|
|
994
994
|
name: t,
|
|
995
|
-
createTime:
|
|
996
|
-
updateTime:
|
|
995
|
+
createTime: y(),
|
|
996
|
+
updateTime: y()
|
|
997
997
|
};
|
|
998
|
-
return
|
|
998
|
+
return C.push(n), { ...n };
|
|
999
999
|
},
|
|
1000
1000
|
async renameBlockReason({ id: e, name: t }) {
|
|
1001
|
-
let n =
|
|
1002
|
-
if (!r) throw
|
|
1003
|
-
if (
|
|
1004
|
-
return r.name = n, r.updateTime =
|
|
1001
|
+
let n = ve(t), r = C.find((t) => t.id === e);
|
|
1002
|
+
if (!r) throw k("Block Reason", e);
|
|
1003
|
+
if (Re(n, e)) throw new re(n);
|
|
1004
|
+
return r.name = n, r.updateTime = y(), { ...r };
|
|
1005
1005
|
},
|
|
1006
1006
|
async deleteBlockReason({ id: e }) {
|
|
1007
|
-
if (!
|
|
1008
|
-
|
|
1007
|
+
if (!C.some((t) => t.id === e)) throw k("Block Reason", e);
|
|
1008
|
+
C = C.filter((t) => t.id !== e);
|
|
1009
1009
|
},
|
|
1010
1010
|
async listChangeSets(e = {}) {
|
|
1011
|
-
let t =
|
|
1011
|
+
let t = w.filter((t) => (!e.state || t.state === e.state) && (!e.assigneeId || t.assigneeIds.includes(e.assigneeId)) && (!e.contentId || t.chains.some((t) => t.contentId === e.contentId))), n = Math.min(e.pageSize || 50, 200), r = e.pageToken ? Number(e.pageToken) : 0;
|
|
1012
1012
|
return {
|
|
1013
1013
|
changeSets: t.slice(r, r + n).map((e) => ({
|
|
1014
|
-
...
|
|
1014
|
+
...A(e),
|
|
1015
1015
|
chains: [],
|
|
1016
1016
|
dependsOnChangeSetIds: [],
|
|
1017
1017
|
plannedReleases: []
|
|
@@ -1020,91 +1020,91 @@ function j(_ = {}) {
|
|
|
1020
1020
|
};
|
|
1021
1021
|
},
|
|
1022
1022
|
async createChangeSet({ name: e, source: t }) {
|
|
1023
|
-
let n =
|
|
1023
|
+
let n = O(e, "name", 200), r = t ? _e(t) : void 0, i = {
|
|
1024
1024
|
id: `cs_stub_${H++}`,
|
|
1025
1025
|
name: n,
|
|
1026
1026
|
source: r,
|
|
1027
1027
|
state: "open",
|
|
1028
|
-
createdBy:
|
|
1029
|
-
createTime:
|
|
1028
|
+
createdBy: b,
|
|
1029
|
+
createTime: y(),
|
|
1030
1030
|
chains: [],
|
|
1031
1031
|
dependsOnChangeSetIds: [],
|
|
1032
1032
|
status: "",
|
|
1033
1033
|
assigneeIds: [],
|
|
1034
1034
|
plannedReleases: []
|
|
1035
1035
|
};
|
|
1036
|
-
return
|
|
1036
|
+
return w.unshift(i), A(i);
|
|
1037
1037
|
},
|
|
1038
1038
|
async getChangeSet(e) {
|
|
1039
|
-
return
|
|
1039
|
+
return A(X(e));
|
|
1040
1040
|
},
|
|
1041
1041
|
async updateChangeSet({ id: e, updateMask: t, name: n, source: r }) {
|
|
1042
|
-
let
|
|
1043
|
-
if (t.length === 0) throw new
|
|
1044
|
-
let o = t.includes("name") ?
|
|
1045
|
-
return t.includes("source") && (s = r ?
|
|
1046
|
-
},
|
|
1047
|
-
async setChangeSetStatus({ id:
|
|
1048
|
-
let
|
|
1049
|
-
if (
|
|
1050
|
-
if (
|
|
1051
|
-
if (!
|
|
1052
|
-
if (
|
|
1053
|
-
fromStatus:
|
|
1054
|
-
toStatus:
|
|
1055
|
-
reason: `There is no transition from ${
|
|
1042
|
+
let i = Z(e);
|
|
1043
|
+
if (t.length === 0) throw new a("update_mask is required");
|
|
1044
|
+
let o = t.includes("name") ? O(n ?? "", "name", 200) : i.name, s = i.source;
|
|
1045
|
+
return t.includes("source") && (s = r ? _e(r) : void 0), i.name = o, i.source = s, A(i);
|
|
1046
|
+
},
|
|
1047
|
+
async setChangeSetStatus({ id: e, expectedStatus: t, status: n }) {
|
|
1048
|
+
let i = Z(e);
|
|
1049
|
+
if (i.status !== t) throw new p(i.status);
|
|
1050
|
+
if (i.status === n) return A(i);
|
|
1051
|
+
if (!x.some((e) => e.slug === n)) throw new a(`status "${n}" is not in the workspace's catalogue`);
|
|
1052
|
+
if (x.some((e) => e.slug === i.status) && !(S[i.status] ?? []).includes(n)) throw new r({
|
|
1053
|
+
fromStatus: i.status,
|
|
1054
|
+
toStatus: n,
|
|
1055
|
+
reason: `There is no transition from ${Xe(i.status)} to ${Xe(n)}.`,
|
|
1056
1056
|
requiresPermission: !1
|
|
1057
1057
|
});
|
|
1058
|
-
return
|
|
1058
|
+
return i.status = n, A(i);
|
|
1059
1059
|
},
|
|
1060
1060
|
async setChangeSetAssignees({ id: e, assigneeIds: t }) {
|
|
1061
1061
|
let n = X(e);
|
|
1062
|
-
if (new Set(t).size !== t.length) throw new
|
|
1063
|
-
if (t.length > 50) throw new
|
|
1064
|
-
return n.assigneeIds = [...t],
|
|
1062
|
+
if (new Set(t).size !== t.length) throw new a("each assignee is given once");
|
|
1063
|
+
if (t.length > 50) throw new a("at most 50 assignees");
|
|
1064
|
+
return n.assigneeIds = [...t], A(n);
|
|
1065
1065
|
},
|
|
1066
1066
|
async addDependency({ id: e, dependsOnId: t }) {
|
|
1067
1067
|
let n = Z(e), r = X(t);
|
|
1068
|
-
if (r.state !== "open") throw new
|
|
1069
|
-
if (
|
|
1070
|
-
return n.dependsOnChangeSetIds.includes(t) || n.dependsOnChangeSetIds.push(t),
|
|
1068
|
+
if (r.state !== "open") throw new a(`Change Set ${t} is ${r.state}`);
|
|
1069
|
+
if (Ze(t, e)) throw new a("the dependency would close a cycle");
|
|
1070
|
+
return n.dependsOnChangeSetIds.includes(t) || n.dependsOnChangeSetIds.push(t), A(n);
|
|
1071
1071
|
},
|
|
1072
1072
|
async removeDependency({ id: e, dependsOnId: t }) {
|
|
1073
1073
|
let n = Z(e);
|
|
1074
|
-
if (!n.dependsOnChangeSetIds.includes(t)) throw
|
|
1075
|
-
return n.dependsOnChangeSetIds = n.dependsOnChangeSetIds.filter((e) => e !== t),
|
|
1074
|
+
if (!n.dependsOnChangeSetIds.includes(t)) throw k(`dependency of Change Set ${e} on`, t);
|
|
1075
|
+
return n.dependsOnChangeSetIds = n.dependsOnChangeSetIds.filter((e) => e !== t), A(n);
|
|
1076
1076
|
},
|
|
1077
1077
|
async validatePublish({ id: e, reviewedHeads: t }) {
|
|
1078
1078
|
let n = X(e);
|
|
1079
|
-
|
|
1080
|
-
let r =
|
|
1081
|
-
if (r &&
|
|
1079
|
+
L(e);
|
|
1080
|
+
let r = Me.get(e);
|
|
1081
|
+
if (r && m(r, t)) return {
|
|
1082
1082
|
blockers: [],
|
|
1083
1083
|
releases: Q(n),
|
|
1084
1084
|
published: !0
|
|
1085
1085
|
};
|
|
1086
|
-
if (n.state !== "open") throw new
|
|
1086
|
+
if (n.state !== "open") throw new d(n.state);
|
|
1087
1087
|
return {
|
|
1088
|
-
blockers:
|
|
1088
|
+
blockers: nt(n, t),
|
|
1089
1089
|
releases: Q(n),
|
|
1090
1090
|
published: !1
|
|
1091
1091
|
};
|
|
1092
1092
|
},
|
|
1093
1093
|
async publish({ id: e, reviewedHeads: t }) {
|
|
1094
1094
|
let n = X(e);
|
|
1095
|
-
|
|
1096
|
-
let r =
|
|
1097
|
-
if (r &&
|
|
1098
|
-
changeSet:
|
|
1099
|
-
publishTime: n.closeTime ??
|
|
1095
|
+
L(e);
|
|
1096
|
+
let r = Me.get(e);
|
|
1097
|
+
if (r && m(r, t)) return {
|
|
1098
|
+
changeSet: A(n),
|
|
1099
|
+
publishTime: n.closeTime ?? y(),
|
|
1100
1100
|
releases: Q(n)
|
|
1101
1101
|
};
|
|
1102
|
-
if (n.state !== "open") throw new
|
|
1103
|
-
let i =
|
|
1104
|
-
if (i.length > 0) throw new
|
|
1102
|
+
if (n.state !== "open") throw new d(n.state);
|
|
1103
|
+
let i = nt(n, t);
|
|
1104
|
+
if (i.length > 0) throw new o(i);
|
|
1105
1105
|
let a = Q(n);
|
|
1106
|
-
return n.state = "published", n.closeTime =
|
|
1107
|
-
changeSet:
|
|
1106
|
+
return n.state = "published", n.closeTime = y(), Me.set(e, { ...t }), {
|
|
1107
|
+
changeSet: A(n),
|
|
1108
1108
|
publishTime: n.closeTime,
|
|
1109
1109
|
releases: a
|
|
1110
1110
|
};
|
|
@@ -1116,19 +1116,19 @@ function j(_ = {}) {
|
|
|
1116
1116
|
t
|
|
1117
1117
|
], async () => {
|
|
1118
1118
|
let n = Z(e);
|
|
1119
|
-
t ||
|
|
1119
|
+
t || L(e);
|
|
1120
1120
|
let r = t ? n.chains.filter((e) => e.id === t) : n.chains;
|
|
1121
|
-
if (t && r.length === 0) throw
|
|
1121
|
+
if (t && r.length === 0) throw k("Chain", t);
|
|
1122
1122
|
let i = structuredClone(ke[e] ?? []), a = [];
|
|
1123
1123
|
for (let e of r) for (let t of e.branches) {
|
|
1124
1124
|
let n = {
|
|
1125
1125
|
branchId: t.id,
|
|
1126
1126
|
contentId: e.contentId
|
|
1127
|
-
}, r =
|
|
1128
|
-
B.has(t.id) ? a.push(n) : r && (
|
|
1127
|
+
}, r = Ae[t.id];
|
|
1128
|
+
B.has(t.id) ? a.push(n) : r && (Ke(t.id, r), i.push(n));
|
|
1129
1129
|
}
|
|
1130
1130
|
return {
|
|
1131
|
-
changeSet:
|
|
1131
|
+
changeSet: A(n),
|
|
1132
1132
|
mergedBranchIds: [],
|
|
1133
1133
|
conflicted: i,
|
|
1134
1134
|
pending: a,
|
|
@@ -1138,90 +1138,90 @@ function j(_ = {}) {
|
|
|
1138
1138
|
},
|
|
1139
1139
|
async discardChangeSet(e) {
|
|
1140
1140
|
let t = Z(e);
|
|
1141
|
-
return
|
|
1141
|
+
return L(e), t.state = "discarded", t.closeTime = y(), t.chains = [], A(t);
|
|
1142
1142
|
},
|
|
1143
1143
|
async listCheckResults(e) {
|
|
1144
|
-
return
|
|
1145
|
-
},
|
|
1146
|
-
async recordCheckResult({ changeSetId:
|
|
1147
|
-
let
|
|
1148
|
-
if (
|
|
1149
|
-
if ([...
|
|
1150
|
-
let
|
|
1151
|
-
if (!
|
|
1152
|
-
let
|
|
1153
|
-
if (
|
|
1154
|
-
let
|
|
1155
|
-
if (
|
|
1156
|
-
if (
|
|
1157
|
-
for (let
|
|
1158
|
-
let
|
|
1159
|
-
if (!
|
|
1160
|
-
if (
|
|
1161
|
-
contentId:
|
|
1162
|
-
branchId:
|
|
1163
|
-
expectedHeadId:
|
|
1164
|
-
currentHeadId:
|
|
1144
|
+
return tt(X(e));
|
|
1145
|
+
},
|
|
1146
|
+
async recordCheckResult({ changeSetId: t, requiredCheckId: n, heads: r, outcome: i, note: o }) {
|
|
1147
|
+
let s = Z(t);
|
|
1148
|
+
if (i === "waived" && o.trim() === "") throw new a("a waived result needs a note saying why");
|
|
1149
|
+
if ([...o].length > 2e3) throw new a(`a note is at most ${l} characters`);
|
|
1150
|
+
let c = F.find((e) => e.id === n);
|
|
1151
|
+
if (!c) throw k("Required Check", n);
|
|
1152
|
+
let d = we(n);
|
|
1153
|
+
if (I === "guardian" && !d.everyMember && !d.userIds.includes(b)) throw new u(`recording results of Required Check ${n} needs its recorder relation`);
|
|
1154
|
+
let f = Qe(s), p = Object.keys(r);
|
|
1155
|
+
if (c.scope === "branch" && p.length !== 1) throw new a("a Branch-scope result names one head");
|
|
1156
|
+
if (c.scope === "change_set" && p.length !== f.length) throw new a("a Change Set-scope result names every head of the Change Set");
|
|
1157
|
+
for (let t of p) {
|
|
1158
|
+
let n = f.find((e) => e.key === t);
|
|
1159
|
+
if (!n) throw new a(`heads name ${t}, which this Change Set doesn't hold`);
|
|
1160
|
+
if (n.revision !== r[t]) throw new e({
|
|
1161
|
+
contentId: n.contentId,
|
|
1162
|
+
branchId: n.branchless ? "" : n.key,
|
|
1163
|
+
expectedHeadId: r[t],
|
|
1164
|
+
currentHeadId: n.revision
|
|
1165
1165
|
});
|
|
1166
1166
|
}
|
|
1167
1167
|
let m = {
|
|
1168
1168
|
id: `cr_stub_${H++}`,
|
|
1169
|
-
requiredCheckId:
|
|
1170
|
-
heads: { ...
|
|
1171
|
-
outcome:
|
|
1172
|
-
note:
|
|
1173
|
-
recordedBy:
|
|
1174
|
-
recordTime:
|
|
1169
|
+
requiredCheckId: n,
|
|
1170
|
+
heads: { ...r },
|
|
1171
|
+
outcome: i,
|
|
1172
|
+
note: o,
|
|
1173
|
+
recordedBy: b,
|
|
1174
|
+
recordTime: y()
|
|
1175
1175
|
};
|
|
1176
1176
|
return De.push({
|
|
1177
1177
|
...m,
|
|
1178
|
-
changeSetId:
|
|
1178
|
+
changeSetId: t
|
|
1179
1179
|
}), structuredClone(m);
|
|
1180
1180
|
},
|
|
1181
1181
|
async listRequiredChecks() {
|
|
1182
1182
|
let e = (e, t) => e.name < t.name ? -1 : e.name > t.name ? 1 : e.id < t.id ? -1 : +(e.id > t.id);
|
|
1183
|
-
return structuredClone([...
|
|
1183
|
+
return structuredClone([...F].sort(e));
|
|
1184
1184
|
},
|
|
1185
1185
|
async createRequiredCheck(e) {
|
|
1186
|
-
let
|
|
1187
|
-
if (
|
|
1188
|
-
let
|
|
1186
|
+
let t = ye(e);
|
|
1187
|
+
if (F.some((e) => e.name === t.name)) throw new g(t.name);
|
|
1188
|
+
let n = {
|
|
1189
1189
|
id: `rc_stub_${H++}`,
|
|
1190
|
-
...
|
|
1190
|
+
...t
|
|
1191
1191
|
};
|
|
1192
|
-
return
|
|
1192
|
+
return F.push(n), structuredClone(n);
|
|
1193
1193
|
},
|
|
1194
|
-
async updateRequiredCheck({ id: e, ...
|
|
1195
|
-
let
|
|
1196
|
-
if (!
|
|
1197
|
-
if (
|
|
1198
|
-
return Object.assign(
|
|
1194
|
+
async updateRequiredCheck({ id: e, ...t }) {
|
|
1195
|
+
let n = ye(t), r = F.find((t) => t.id === e);
|
|
1196
|
+
if (!r) throw k("Required Check", e);
|
|
1197
|
+
if (F.some((t) => t.name === n.name && t.id !== e)) throw new g(n.name);
|
|
1198
|
+
return Object.assign(r, n), structuredClone(r);
|
|
1199
1199
|
},
|
|
1200
1200
|
async deleteRequiredCheck({ id: e }) {
|
|
1201
|
-
if (!
|
|
1202
|
-
|
|
1201
|
+
if (!F.some((t) => t.id === e)) throw k("Required Check", e);
|
|
1202
|
+
F = F.filter((t) => t.id !== e), z.delete(e);
|
|
1203
1203
|
},
|
|
1204
1204
|
async listRequiredCheckRecorders(e) {
|
|
1205
|
-
return structuredClone(
|
|
1205
|
+
return structuredClone(He(e));
|
|
1206
1206
|
},
|
|
1207
1207
|
async grantRequiredCheckRecorder({ requiredCheckId: e, recorder: t }) {
|
|
1208
|
-
let n =
|
|
1208
|
+
let n = He(e);
|
|
1209
1209
|
if ("everyMember" in t) {
|
|
1210
|
-
|
|
1210
|
+
z.set(e, {
|
|
1211
1211
|
...n,
|
|
1212
1212
|
everyMember: !0
|
|
1213
1213
|
});
|
|
1214
1214
|
return;
|
|
1215
1215
|
}
|
|
1216
|
-
if (!Te.includes(t.userId)) throw new
|
|
1217
|
-
|
|
1216
|
+
if (!Te.includes(t.userId)) throw new a(`user ${t.userId} is not a member of the workspace`);
|
|
1217
|
+
z.set(e, {
|
|
1218
1218
|
...n,
|
|
1219
1219
|
userIds: [.../* @__PURE__ */ new Set([...n.userIds, t.userId])].sort()
|
|
1220
1220
|
});
|
|
1221
1221
|
},
|
|
1222
1222
|
async revokeRequiredCheckRecorder({ requiredCheckId: e, recorder: t }) {
|
|
1223
|
-
let n =
|
|
1224
|
-
|
|
1223
|
+
let n = He(e);
|
|
1224
|
+
z.set(e, "everyMember" in t ? {
|
|
1225
1225
|
...n,
|
|
1226
1226
|
everyMember: !1
|
|
1227
1227
|
} : {
|
|
@@ -1232,12 +1232,22 @@ function j(_ = {}) {
|
|
|
1232
1232
|
async searchBlueprints({ query: e }) {
|
|
1233
1233
|
let t = e.trim().toLocaleLowerCase();
|
|
1234
1234
|
return {
|
|
1235
|
-
blueprints:
|
|
1235
|
+
blueprints: he.filter((e) => !e.archived).filter((e) => e.name.toLocaleLowerCase().includes(t)).filter((e) => M.some((t) => t.blueprintId === e.id)).map((e) => ({
|
|
1236
|
+
id: e.id,
|
|
1237
|
+
name: e.name
|
|
1238
|
+
})),
|
|
1236
1239
|
nextPageToken: ""
|
|
1237
1240
|
};
|
|
1238
1241
|
},
|
|
1242
|
+
async getBlueprints(e) {
|
|
1243
|
+
if (e.length > 1e3) throw new a(`at most ${t} Blueprint ids`);
|
|
1244
|
+
return he.filter((t) => e.includes(t.id)).map((e) => ({
|
|
1245
|
+
id: e.id,
|
|
1246
|
+
name: e.name
|
|
1247
|
+
}));
|
|
1248
|
+
},
|
|
1239
1249
|
async listBlueprintReleases(e) {
|
|
1240
|
-
return
|
|
1250
|
+
return M.filter((t) => t.blueprintId === e).map((e) => ({
|
|
1241
1251
|
id: e.id,
|
|
1242
1252
|
blueprintId: e.blueprintId,
|
|
1243
1253
|
name: e.name ?? e.id,
|
|
@@ -1246,94 +1256,94 @@ function j(_ = {}) {
|
|
|
1246
1256
|
}));
|
|
1247
1257
|
},
|
|
1248
1258
|
async listCollections() {
|
|
1249
|
-
return [...
|
|
1259
|
+
return [...T].sort(ze).map((e) => ({ ...e }));
|
|
1250
1260
|
},
|
|
1251
|
-
async createCollection({ name: e, parentId:
|
|
1252
|
-
let
|
|
1253
|
-
if (
|
|
1254
|
-
if (
|
|
1255
|
-
let
|
|
1261
|
+
async createCollection({ name: e, parentId: t = "", restricted: r = !1 }) {
|
|
1262
|
+
let i = O(e, "a Collection's name", 200);
|
|
1263
|
+
if (t !== "" && Y(t), r && I === "workspace") throw new n(Se);
|
|
1264
|
+
if (Be(t, i)) throw new g(i);
|
|
1265
|
+
let a = {
|
|
1256
1266
|
id: `col_stub_${H++}`,
|
|
1257
|
-
name:
|
|
1258
|
-
parentId:
|
|
1259
|
-
restricted:
|
|
1267
|
+
name: i,
|
|
1268
|
+
parentId: t,
|
|
1269
|
+
restricted: r
|
|
1260
1270
|
};
|
|
1261
|
-
return
|
|
1262
|
-
userId:
|
|
1271
|
+
return T.push(a), r && R.set(a.id, [{
|
|
1272
|
+
userId: b,
|
|
1263
1273
|
level: "owner"
|
|
1264
|
-
}]), { ...
|
|
1274
|
+
}]), { ...a };
|
|
1265
1275
|
},
|
|
1266
|
-
async renameCollection({ id: e, name:
|
|
1267
|
-
let
|
|
1268
|
-
if (
|
|
1269
|
-
return
|
|
1276
|
+
async renameCollection({ id: e, name: t }) {
|
|
1277
|
+
let n = O(t, "a Collection's name", 200), r = Y(e);
|
|
1278
|
+
if (Be(r.parentId, n, e)) throw new g(n);
|
|
1279
|
+
return r.name = n, { ...r };
|
|
1270
1280
|
},
|
|
1271
|
-
async moveCollection({ id: e, parentId:
|
|
1272
|
-
let
|
|
1273
|
-
for (let
|
|
1274
|
-
if (
|
|
1275
|
-
return
|
|
1281
|
+
async moveCollection({ id: e, parentId: t }) {
|
|
1282
|
+
let n = Y(e);
|
|
1283
|
+
for (let n = t; n !== ""; n = Y(n).parentId) if (n === e) throw new a(`Collection ${e} can't move under itself or a Collection under it`);
|
|
1284
|
+
if (Be(t, n.name, e)) throw new g("");
|
|
1285
|
+
return n.parentId = t, { ...n };
|
|
1276
1286
|
},
|
|
1277
1287
|
async removeCollection({ id: e }) {
|
|
1278
|
-
if (Y(e),
|
|
1279
|
-
|
|
1288
|
+
if (Y(e), T.some((t) => t.parentId === e)) throw new a(`Collection ${e} has Collections under it: remove or move those first`);
|
|
1289
|
+
T.splice(T.findIndex((t) => t.id === e), 1), R.delete(e);
|
|
1280
1290
|
let t = [];
|
|
1281
|
-
for (let n of
|
|
1291
|
+
for (let n of D) n.collectionIds.includes(e) && (n.collectionIds = n.collectionIds.filter((t) => t !== e), t.push(n.id));
|
|
1282
1292
|
return t;
|
|
1283
1293
|
},
|
|
1284
1294
|
async setCollectionRestricted({ id: e, restricted: t, acknowledgeDisclosure: r = !1 }) {
|
|
1285
|
-
if (t &&
|
|
1286
|
-
let
|
|
1287
|
-
if (
|
|
1288
|
-
if (!t && !r) throw new
|
|
1289
|
-
return
|
|
1290
|
-
userId:
|
|
1295
|
+
if (t && I === "workspace") throw new n(Se);
|
|
1296
|
+
let i = Y(e);
|
|
1297
|
+
if (i.restricted === t) return { ...i };
|
|
1298
|
+
if (!t && !r) throw new a(`unrestricting Collection ${e} discloses its Content to every viewer: confirm it with acknowledge_disclosure`);
|
|
1299
|
+
return i.restricted = t, t ? R.set(e, [{
|
|
1300
|
+
userId: b,
|
|
1291
1301
|
level: "owner"
|
|
1292
|
-
}]) :
|
|
1302
|
+
}]) : R.delete(e), { ...i };
|
|
1293
1303
|
},
|
|
1294
1304
|
async listCollectionGrants(e) {
|
|
1295
|
-
return
|
|
1305
|
+
return Ve(e), structuredClone(R.get(e) ?? []).sort((e, t) => e.userId < t.userId ? -1 : +(e.userId > t.userId));
|
|
1296
1306
|
},
|
|
1297
1307
|
async grantCollectionAccess({ collectionId: e, userId: t, level: n }) {
|
|
1298
|
-
if (
|
|
1299
|
-
if (!Te.includes(t)) throw new
|
|
1300
|
-
let r =
|
|
1301
|
-
r.some((e) => e.level === "owner" && e.userId === t) ||
|
|
1308
|
+
if (Ve(e), n !== "viewer" && n !== "editor") throw new a("a grant is viewer or editor");
|
|
1309
|
+
if (!Te.includes(t)) throw new a(`${t} is not a member of the workspace`);
|
|
1310
|
+
let r = R.get(e) ?? [];
|
|
1311
|
+
r.some((e) => e.level === "owner" && e.userId === t) || R.set(e, [...r.filter((e) => e.userId !== t), {
|
|
1302
1312
|
userId: t,
|
|
1303
1313
|
level: n
|
|
1304
1314
|
}]);
|
|
1305
1315
|
},
|
|
1306
1316
|
async revokeCollectionAccess({ collectionId: e, userId: t }) {
|
|
1307
|
-
|
|
1317
|
+
Ve(e), R.set(e, (R.get(e) ?? []).filter((e) => e.userId !== t || e.level === "owner"));
|
|
1308
1318
|
},
|
|
1309
1319
|
async listContents(e = {}) {
|
|
1310
1320
|
let t = e.view ?? { kind: "main" }, n = (e.search ?? "").trim();
|
|
1311
|
-
if (n !== "" && t.kind === "in_force") throw new
|
|
1312
|
-
if ([...n].length > 200) throw new
|
|
1313
|
-
if (e.collectionId && !
|
|
1321
|
+
if (n !== "" && t.kind === "in_force") throw new a("filter.search: Editor Search covers Main and open Branch heads, never Releases");
|
|
1322
|
+
if ([...n].length > 200) throw new a("filter.search is at most 200 characters");
|
|
1323
|
+
if (e.collectionId && !T.some((t) => t.id === e.collectionId)) throw k("Collection", e.collectionId);
|
|
1314
1324
|
t.kind === "change_set" && X(t.changeSetId);
|
|
1315
|
-
let r =
|
|
1325
|
+
let r = D.filter((e) => !e.archiveTime).filter((t) => !e.collectionId || t.collectionIds.includes(e.collectionId)).filter((t) => !e.blueprintIds?.length || e.blueprintIds.includes(t.blueprintId)).filter((t) => !e.assigneeId || (t.assigneeIds ?? []).includes(e.assigneeId)).sort((e, t) => e.id < t.id ? -1 : +(e.id > t.id)).flatMap((e) => $(e, t, n)), i = Math.min(e.pageSize || 50, 200), o = e.pageToken ? Number(e.pageToken) : 0;
|
|
1316
1326
|
return {
|
|
1317
|
-
contents: r.slice(o, o +
|
|
1318
|
-
nextPageToken: o +
|
|
1327
|
+
contents: r.slice(o, o + i),
|
|
1328
|
+
nextPageToken: o + i < r.length ? String(o + i) : ""
|
|
1319
1329
|
};
|
|
1320
1330
|
},
|
|
1321
1331
|
async createContent({ changeSetId: e, blueprintReleaseId: t, copyFrom: n }) {
|
|
1322
1332
|
let r = Z(e), i = {}, a = t;
|
|
1323
1333
|
if (n) {
|
|
1324
|
-
let e = "revisionId" in n ? n.revisionId :
|
|
1325
|
-
if (!r || !e) throw
|
|
1334
|
+
let e = "revisionId" in n ? n.revisionId : D.find((e) => e.inForce?.releaseId === n.releaseId)?.inForce?.revisionId, r = D.find((t) => e && q(t, e));
|
|
1335
|
+
if (!r || !e) throw k("copy source", JSON.stringify(n));
|
|
1326
1336
|
i = structuredClone(q(r, e) ?? {}), a = t || r.blueprintReleaseId;
|
|
1327
1337
|
}
|
|
1328
|
-
let o =
|
|
1329
|
-
if (!o) throw new
|
|
1338
|
+
let o = M.find((e) => e.id === a);
|
|
1339
|
+
if (!o) throw new _(`Blueprint Release ${a} can't be loaded`, [{
|
|
1330
1340
|
source: "contenthub",
|
|
1331
1341
|
code: "release_not_found",
|
|
1332
1342
|
path: ""
|
|
1333
1343
|
}]);
|
|
1334
|
-
if (o.refusals?.length) throw new
|
|
1344
|
+
if (o.refusals?.length) throw new _(`Blueprint Release ${a} can't be loaded`, o.refusals.map((e) => ({ ...e })));
|
|
1335
1345
|
let s = H++, c = `content_stub_${s}`, l = `br_stub_${s}`, u = `rev_stub_${s}`;
|
|
1336
|
-
return
|
|
1346
|
+
return D.push({
|
|
1337
1347
|
id: c,
|
|
1338
1348
|
blueprintId: o.blueprintId,
|
|
1339
1349
|
blueprintReleaseId: a,
|
|
@@ -1342,7 +1352,7 @@ function j(_ = {}) {
|
|
|
1342
1352
|
branchId: l,
|
|
1343
1353
|
revisionId: u,
|
|
1344
1354
|
data: i,
|
|
1345
|
-
revisionCreateTime:
|
|
1355
|
+
revisionCreateTime: y()
|
|
1346
1356
|
} }
|
|
1347
1357
|
}), r.chains.push({
|
|
1348
1358
|
id: `chain_stub_${s}`,
|
|
@@ -1362,30 +1372,30 @@ function j(_ = {}) {
|
|
|
1362
1372
|
data: structuredClone(i),
|
|
1363
1373
|
changeSetId: e,
|
|
1364
1374
|
branchId: l,
|
|
1365
|
-
revisionCreateTime:
|
|
1375
|
+
revisionCreateTime: y(),
|
|
1366
1376
|
releaseId: ""
|
|
1367
1377
|
};
|
|
1368
1378
|
},
|
|
1369
1379
|
async saveRevision({ idempotencyKey: e, ...t }) {
|
|
1370
|
-
if (!e) return
|
|
1371
|
-
let n = JSON.stringify(t), r =
|
|
1380
|
+
if (!e) return Ue(t);
|
|
1381
|
+
let n = JSON.stringify(t), r = Ne.get(e);
|
|
1372
1382
|
if (r) {
|
|
1373
|
-
if (r.asked !== n) throw new
|
|
1383
|
+
if (r.asked !== n) throw new a(`idempotency key ${e} names another save`);
|
|
1374
1384
|
return structuredClone(r.content);
|
|
1375
1385
|
}
|
|
1376
|
-
let
|
|
1377
|
-
return
|
|
1386
|
+
let i = await Ue(t);
|
|
1387
|
+
return Ne.set(e, {
|
|
1378
1388
|
asked: n,
|
|
1379
|
-
content: structuredClone(
|
|
1380
|
-
}),
|
|
1389
|
+
content: structuredClone(i)
|
|
1390
|
+
}), i;
|
|
1381
1391
|
},
|
|
1382
1392
|
async getContent({ id: e, changeSetId: t }) {
|
|
1383
1393
|
let n = U(e), [r] = $(n, t ? {
|
|
1384
1394
|
kind: "change_set",
|
|
1385
1395
|
changeSetId: t
|
|
1386
1396
|
} : { kind: "main" }, "");
|
|
1387
|
-
if (!r) throw
|
|
1388
|
-
let i =
|
|
1397
|
+
if (!r) throw k("Content", e);
|
|
1398
|
+
let i = P[n.blueprintReleaseId];
|
|
1389
1399
|
return {
|
|
1390
1400
|
content: r,
|
|
1391
1401
|
blueprintRelease: i ? structuredClone(i) : void 0,
|
|
@@ -1393,7 +1403,7 @@ function j(_ = {}) {
|
|
|
1393
1403
|
};
|
|
1394
1404
|
},
|
|
1395
1405
|
async getTimeline(e) {
|
|
1396
|
-
let t = U(e), n = (e) =>
|
|
1406
|
+
let t = U(e), n = (e) => w.find((t) => t.id === e)?.state === "open";
|
|
1397
1407
|
return structuredClone({
|
|
1398
1408
|
entries: t.timeline ?? [],
|
|
1399
1409
|
plannedReleases: (t.plannedReleases ?? []).filter((e) => n(e.changeSetId))
|
|
@@ -1403,11 +1413,11 @@ function j(_ = {}) {
|
|
|
1403
1413
|
let r;
|
|
1404
1414
|
if ("contentId" in e) {
|
|
1405
1415
|
let t = U(e.contentId);
|
|
1406
|
-
if (!t.main) throw
|
|
1416
|
+
if (!t.main) throw k("Content", e.contentId);
|
|
1407
1417
|
r = K(t);
|
|
1408
1418
|
} else {
|
|
1409
|
-
let t =
|
|
1410
|
-
if (!t) throw
|
|
1419
|
+
let t = D.find((t) => K(t).some((t) => t.branchId === e.branchId));
|
|
1420
|
+
if (!t) throw k("Branch", e.branchId);
|
|
1411
1421
|
r = K(t).filter((t) => t.branchId === e.branchId);
|
|
1412
1422
|
}
|
|
1413
1423
|
let i = Math.min(t || 50, 200), a = n ? Number(n) : 0;
|
|
@@ -1417,17 +1427,17 @@ function j(_ = {}) {
|
|
|
1417
1427
|
};
|
|
1418
1428
|
},
|
|
1419
1429
|
async compare({ revisionId: e, base: t }) {
|
|
1420
|
-
let n =
|
|
1421
|
-
if (!n) throw
|
|
1422
|
-
let r = K(n),
|
|
1430
|
+
let n = D.find((t) => K(t).some((t) => t.id === e));
|
|
1431
|
+
if (!n) throw k("Revision", e);
|
|
1432
|
+
let r = K(n), i = r.find((t) => t.id === e), o;
|
|
1423
1433
|
if (t.kind === "revision") o = t.revisionId;
|
|
1424
1434
|
else if (t.kind === "main_head") {
|
|
1425
|
-
if (!n.main) throw new
|
|
1435
|
+
if (!n.main) throw new a("the Content is not published: it has no Main Branch");
|
|
1426
1436
|
o = n.main.revisionId;
|
|
1427
1437
|
} else o = r.find((e) => e.branchId === t.branchId)?.parentId ?? "";
|
|
1428
1438
|
let s = r.find((e) => e.id === o);
|
|
1429
|
-
if (!s) throw
|
|
1430
|
-
let c = q(n,
|
|
1439
|
+
if (!s) throw k("Revision", o);
|
|
1440
|
+
let c = q(n, i.id) ?? {}, l = q(n, s.id) ?? {}, u = [];
|
|
1431
1441
|
for (let e of [.../* @__PURE__ */ new Set([...Object.keys(c), ...Object.keys(l)])]) e in l ? e in c ? JSON.stringify(c[e]) !== JSON.stringify(l[e]) && u.push({
|
|
1432
1442
|
path: `/${e}`,
|
|
1433
1443
|
kind: "changed",
|
|
@@ -1445,7 +1455,7 @@ function j(_ = {}) {
|
|
|
1445
1455
|
let d = ({ data: e, ...t }) => t;
|
|
1446
1456
|
return {
|
|
1447
1457
|
base: d(s),
|
|
1448
|
-
revision: d(
|
|
1458
|
+
revision: d(i),
|
|
1449
1459
|
changes: u
|
|
1450
1460
|
};
|
|
1451
1461
|
},
|
|
@@ -1460,14 +1470,14 @@ function j(_ = {}) {
|
|
|
1460
1470
|
referrers: e.slice(i, i + t),
|
|
1461
1471
|
nextPageToken: i + t < e.length ? String(i + t) : ""
|
|
1462
1472
|
};
|
|
1463
|
-
}, a =
|
|
1473
|
+
}, a = D.flatMap((t) => (t.edges ?? []).filter((n) => n.targetContentId === e && t.inForce?.revisionId === n.sourceRevisionId).map((e) => ({
|
|
1464
1474
|
edge: { ...e },
|
|
1465
1475
|
releaseId: t.inForce?.releaseId ?? "",
|
|
1466
1476
|
changeSetId: "",
|
|
1467
1477
|
branchId: ""
|
|
1468
1478
|
})));
|
|
1469
1479
|
if (!t) return i(a);
|
|
1470
|
-
let o =
|
|
1480
|
+
let o = D.flatMap((t) => Object.entries(t.branches).flatMap(([n, r]) => w.find((e) => e.id === n)?.state === "open" ? (t.edges ?? []).filter((t) => t.targetContentId === e && t.sourceRevisionId === r.revisionId).map((e) => ({
|
|
1471
1481
|
edge: { ...e },
|
|
1472
1482
|
releaseId: "",
|
|
1473
1483
|
changeSetId: n,
|
|
@@ -1479,14 +1489,14 @@ function j(_ = {}) {
|
|
|
1479
1489
|
let t;
|
|
1480
1490
|
if ("revisionId" in e) t = e.revisionId;
|
|
1481
1491
|
else {
|
|
1482
|
-
for (let n of
|
|
1492
|
+
for (let n of D) {
|
|
1483
1493
|
let r = Object.values(n.branches).find((t) => t.branchId === e.branchId);
|
|
1484
1494
|
r && (t = r.revisionId);
|
|
1485
1495
|
}
|
|
1486
|
-
if (!t) throw
|
|
1496
|
+
if (!t) throw k("Branch", e.branchId);
|
|
1487
1497
|
}
|
|
1488
|
-
return
|
|
1489
|
-
let t =
|
|
1498
|
+
return D.flatMap((e) => (e.edges ?? []).filter((e) => e.sourceRevisionId === t)).filter((e) => e.pinReleaseId !== "").flatMap((e) => {
|
|
1499
|
+
let t = D.find((t) => t.id === e.targetContentId)?.inForce?.releaseId ?? "";
|
|
1490
1500
|
return t === e.pinReleaseId ? [] : [{
|
|
1491
1501
|
edge: { ...e },
|
|
1492
1502
|
supersededByReleaseId: t,
|
|
@@ -1496,25 +1506,25 @@ function j(_ = {}) {
|
|
|
1496
1506
|
},
|
|
1497
1507
|
async setContentCollections({ contentId: e, collectionIds: t }) {
|
|
1498
1508
|
let n = U(e), r = [...new Set(t)];
|
|
1499
|
-
if (r.length > 100) throw new
|
|
1500
|
-
for (let e of r) if (!
|
|
1509
|
+
if (r.length > 100) throw new a("at most 100 Collections");
|
|
1510
|
+
for (let e of r) if (!T.some((t) => t.id === e)) throw k("Collection", e);
|
|
1501
1511
|
return n.collectionIds = r.sort(), [...n.collectionIds];
|
|
1502
1512
|
},
|
|
1503
1513
|
async setContentAssignees({ contentId: e, assigneeIds: t }) {
|
|
1504
1514
|
let n = U(e);
|
|
1505
|
-
if (new Set(t).size !== t.length) throw new
|
|
1506
|
-
if (t.length > 50) throw new
|
|
1515
|
+
if (new Set(t).size !== t.length) throw new a("each assignee is given once");
|
|
1516
|
+
if (t.length > 50) throw new a("at most 50 assignees");
|
|
1507
1517
|
return n.assigneeIds = [...t], W(n);
|
|
1508
1518
|
},
|
|
1509
1519
|
async blockContent({ contentId: e, blockReasonId: t, allowedUserIds: n }) {
|
|
1510
1520
|
let r = U(e);
|
|
1511
|
-
if (!
|
|
1512
|
-
if (new Set(n).size !== n.length) throw new
|
|
1521
|
+
if (!C.some((e) => e.id === t)) throw k("Block Reason", t);
|
|
1522
|
+
if (new Set(n).size !== n.length) throw new a("each allowed user is given once");
|
|
1513
1523
|
return r.block = {
|
|
1514
1524
|
blockReasonId: t,
|
|
1515
1525
|
allowedUserIds: [...n],
|
|
1516
|
-
blockedBy:
|
|
1517
|
-
blockTime:
|
|
1526
|
+
blockedBy: b,
|
|
1527
|
+
blockTime: y()
|
|
1518
1528
|
}, W(r);
|
|
1519
1529
|
},
|
|
1520
1530
|
async unblockContent(e) {
|
|
@@ -1524,42 +1534,42 @@ function j(_ = {}) {
|
|
|
1524
1534
|
async archiveContent(e) {
|
|
1525
1535
|
let t = U(e);
|
|
1526
1536
|
if (t.archiveTime) return W(t);
|
|
1527
|
-
if (!t.main) throw new
|
|
1528
|
-
if (
|
|
1529
|
-
return t.archiveTime =
|
|
1537
|
+
if (!t.main) throw new a(`Content ${e} is not published: discard its Change Set instead of archiving it`);
|
|
1538
|
+
if (f(t.timeline ?? [], Pe())) throw new a(`Content ${e} has a Release In Force today or later: end its force first`);
|
|
1539
|
+
return t.archiveTime = y(), W(t);
|
|
1530
1540
|
},
|
|
1531
1541
|
async unarchiveContent(e) {
|
|
1532
1542
|
let t = U(e);
|
|
1533
1543
|
return t.archiveTime = void 0, W(t);
|
|
1534
1544
|
},
|
|
1535
1545
|
async startEditing({ contentId: e, changeSetId: t, effectiveOn: n = "", changeSetName: r = "" }) {
|
|
1536
|
-
let
|
|
1537
|
-
if (!
|
|
1538
|
-
if (J(
|
|
1539
|
-
if (!G(
|
|
1546
|
+
let i = U(e);
|
|
1547
|
+
if (!i.main) throw new a(`Content ${e} is not published`);
|
|
1548
|
+
if (J(i), G(i) && !h.test(n)) throw new a("effective_on is required for Dated Content, as YYYY-MM-DD");
|
|
1549
|
+
if (!G(i) && n !== "") throw new a("effective_on is refused for undated Content");
|
|
1540
1550
|
let o;
|
|
1541
1551
|
if (t) {
|
|
1542
|
-
if (o = Z(t), o.chains.some((t) => t.contentId === e)) throw new
|
|
1552
|
+
if (o = Z(t), o.chains.some((t) => t.contentId === e)) throw new a(`Content ${e} already has a Chain in this Change Set`);
|
|
1543
1553
|
} else {
|
|
1544
|
-
let t = Object.values(
|
|
1554
|
+
let t = Object.values(i.main.data).filter((e) => typeof e == "string").slice(0, 2).join(" ");
|
|
1545
1555
|
o = {
|
|
1546
1556
|
id: `cs_stub_${H++}`,
|
|
1547
|
-
name: r.trim() ?
|
|
1557
|
+
name: r.trim() ? O(r, "change_set_name", 200) : t || e,
|
|
1548
1558
|
state: "open",
|
|
1549
|
-
createdBy:
|
|
1550
|
-
createTime:
|
|
1559
|
+
createdBy: b,
|
|
1560
|
+
createTime: y(),
|
|
1551
1561
|
chains: [],
|
|
1552
1562
|
dependsOnChangeSetIds: [],
|
|
1553
1563
|
status: "",
|
|
1554
1564
|
assigneeIds: [],
|
|
1555
1565
|
plannedReleases: []
|
|
1556
|
-
},
|
|
1566
|
+
}, w.unshift(o);
|
|
1557
1567
|
}
|
|
1558
1568
|
let s = H++, c = `br_stub_${s}`, l = {
|
|
1559
|
-
...structuredClone(
|
|
1569
|
+
...structuredClone(i.main),
|
|
1560
1570
|
branchId: c
|
|
1561
1571
|
};
|
|
1562
|
-
|
|
1572
|
+
i.branches[o.id] = l, o.chains.push({
|
|
1563
1573
|
id: `chain_stub_${s}`,
|
|
1564
1574
|
contentId: e,
|
|
1565
1575
|
born: !1,
|
|
@@ -1570,22 +1580,22 @@ function j(_ = {}) {
|
|
|
1570
1580
|
headRevisionId: l.revisionId
|
|
1571
1581
|
}]
|
|
1572
1582
|
});
|
|
1573
|
-
let [u] = $(
|
|
1583
|
+
let [u] = $(i, {
|
|
1574
1584
|
kind: "change_set",
|
|
1575
1585
|
changeSetId: o.id
|
|
1576
1586
|
}, "");
|
|
1577
1587
|
return {
|
|
1578
|
-
changeSet:
|
|
1588
|
+
changeSet: A(o),
|
|
1579
1589
|
content: u
|
|
1580
1590
|
};
|
|
1581
1591
|
},
|
|
1582
1592
|
async previewChain({ changeSetId: e, contentId: t, effectiveOn: n, validityPeriod: r }) {
|
|
1583
1593
|
Z(e);
|
|
1584
|
-
let
|
|
1585
|
-
if (!
|
|
1586
|
-
if (!G(
|
|
1587
|
-
if (!h.test(n)) throw new
|
|
1588
|
-
let o =
|
|
1594
|
+
let i = U(t);
|
|
1595
|
+
if (!i.main) throw new a(`Content ${t} is not published`);
|
|
1596
|
+
if (!G(i)) throw new a("undated Content's Chain takes no date");
|
|
1597
|
+
if (!h.test(n)) throw new a("effective_on is YYYY-MM-DD");
|
|
1598
|
+
let o = i.timeline ?? [], s = o.find((e) => e.validityPeriod && e.validityPeriod.firstDay <= n && (e.validityPeriod.lastDay === "" || n <= e.validityPeriod.lastDay));
|
|
1589
1599
|
return {
|
|
1590
1600
|
forkReleaseId: s?.releaseId ?? "",
|
|
1591
1601
|
carryForwardReleaseIds: o.filter((e) => e.validityPeriod && e.validityPeriod.firstDay > n).map((e) => e.releaseId),
|
|
@@ -1597,12 +1607,12 @@ function j(_ = {}) {
|
|
|
1597
1607
|
async planRepeal({ changeSetId: e, contentId: t, lastDay: n }) {
|
|
1598
1608
|
Z(e);
|
|
1599
1609
|
let r = U(t);
|
|
1600
|
-
if (J(r), !G(r)) throw new
|
|
1601
|
-
if (!h.test(n)) throw new
|
|
1602
|
-
return
|
|
1610
|
+
if (J(r), !G(r)) throw new a("a Repeal is for Dated Content");
|
|
1611
|
+
if (!h.test(n)) throw new a("last_day is YYYY-MM-DD");
|
|
1612
|
+
return rt(r, e, {
|
|
1603
1613
|
kind: "repeal",
|
|
1604
1614
|
validityPeriod: {
|
|
1605
|
-
firstDay:
|
|
1615
|
+
firstDay: ee(r.timeline ?? [], n)?.validityPeriod?.firstDay ?? n,
|
|
1606
1616
|
lastDay: n
|
|
1607
1617
|
}
|
|
1608
1618
|
});
|
|
@@ -1610,14 +1620,14 @@ function j(_ = {}) {
|
|
|
1610
1620
|
async planWithdrawal({ changeSetId: e, contentId: t }) {
|
|
1611
1621
|
Z(e);
|
|
1612
1622
|
let n = U(t);
|
|
1613
|
-
if (J(n), G(n)) throw new
|
|
1614
|
-
return
|
|
1623
|
+
if (J(n), G(n)) throw new a("a Withdrawal is for undated Content");
|
|
1624
|
+
return rt(n, e, { kind: "withdrawal" });
|
|
1615
1625
|
},
|
|
1616
1626
|
async planRelease({ idempotencyKey: e, ...t }) {
|
|
1617
1627
|
return V(e, ["planRelease", t], async () => {
|
|
1618
|
-
let { changeSetId: e, branchId: n, validityPeriod: r, releaseSpec:
|
|
1619
|
-
if (J(u), l.kind !== "editorial") throw new
|
|
1620
|
-
if (s.plannedReleases.some((e) => e.branchId === n)) throw new
|
|
1628
|
+
let { changeSetId: e, branchId: n, validityPeriod: r, releaseSpec: i, supersedesReleaseIds: o } = t, { cs: s, chain: c, branch: l, c: u } = Ge(e, n);
|
|
1629
|
+
if (J(u), l.kind !== "editorial") throw new a("only an editorial Branch's head is released");
|
|
1630
|
+
if (s.plannedReleases.some((e) => e.branchId === n)) throw new a(`Branch ${n} is planned already`);
|
|
1621
1631
|
let d = {
|
|
1622
1632
|
id: `rls_stub_${H++}`,
|
|
1623
1633
|
contentId: c.contentId,
|
|
@@ -1625,41 +1635,41 @@ function j(_ = {}) {
|
|
|
1625
1635
|
branchId: n,
|
|
1626
1636
|
revisionId: "",
|
|
1627
1637
|
validityPeriod: r ? { ...r } : void 0,
|
|
1628
|
-
releaseSpec: structuredClone(
|
|
1638
|
+
releaseSpec: structuredClone(i ?? {}),
|
|
1629
1639
|
supersedesReleaseIds: [...o ?? []],
|
|
1630
1640
|
proposed: !1,
|
|
1631
1641
|
proposedForReleaseId: "",
|
|
1632
1642
|
splitFromReleaseId: "",
|
|
1633
1643
|
withheld: !1
|
|
1634
1644
|
};
|
|
1635
|
-
return
|
|
1645
|
+
return Je(u, d), s.plannedReleases.push(d), Ye(s, u), structuredClone(d);
|
|
1636
1646
|
});
|
|
1637
1647
|
},
|
|
1638
1648
|
async updatePlannedRelease({ idempotencyKey: e, ...t }) {
|
|
1639
1649
|
return V(e, ["updatePlannedRelease", t], async () => {
|
|
1640
|
-
let { changeSetId: e, plannedReleaseId: n, validityPeriod: r, releaseSpec:
|
|
1641
|
-
if (c < 0) throw
|
|
1650
|
+
let { changeSetId: e, plannedReleaseId: n, validityPeriod: r, releaseSpec: i, supersedesReleaseIds: o } = t, s = Z(e), c = s.plannedReleases.findIndex((e) => e.id === n);
|
|
1651
|
+
if (c < 0) throw k("Planned Release", n);
|
|
1642
1652
|
let l = s.plannedReleases[c];
|
|
1643
|
-
if (l.proposed) throw new
|
|
1653
|
+
if (l.proposed) throw new a("a proposal is derived from the plans and can't be set");
|
|
1644
1654
|
let u = U(l.contentId);
|
|
1645
1655
|
J(u);
|
|
1646
1656
|
let d = {
|
|
1647
1657
|
...structuredClone(l),
|
|
1648
1658
|
...r ? { validityPeriod: { ...r } } : {},
|
|
1649
|
-
...
|
|
1659
|
+
...i ? { releaseSpec: structuredClone(i) } : {},
|
|
1650
1660
|
...o ? { supersedesReleaseIds: [...o] } : {}
|
|
1651
1661
|
};
|
|
1652
|
-
return
|
|
1662
|
+
return Je(u, d), s.plannedReleases[c] = d, Ye(s, u), structuredClone(d);
|
|
1653
1663
|
});
|
|
1654
1664
|
},
|
|
1655
1665
|
async appendBranch({ idempotencyKey: e, ...t }) {
|
|
1656
1666
|
return V(e, ["appendBranch", t], async () => {
|
|
1657
|
-
let { changeSetId: e, chainId: n, effectiveOn: r } = t,
|
|
1658
|
-
if (!o) throw
|
|
1667
|
+
let { changeSetId: e, chainId: n, effectiveOn: r } = t, i = Z(e), o = i.chains.find((e) => e.id === n);
|
|
1668
|
+
if (!o) throw k("Chain", n);
|
|
1659
1669
|
let s = U(o.contentId);
|
|
1660
|
-
if (o.born || !G(s)) throw new
|
|
1670
|
+
if (o.born || !G(s)) throw new a("only a Chain on published Dated Content takes dates");
|
|
1661
1671
|
let c = o.branches.filter((e) => e.kind === "editorial").at(-1);
|
|
1662
|
-
if (!h.test(r) || c?.effectiveOn && r <= c.effectiveOn) throw new
|
|
1672
|
+
if (!h.test(r) || c?.effectiveOn && r <= c.effectiveOn) throw new a("effective_on is a day after the Chain's last editorial Branch's");
|
|
1663
1673
|
let l = o.branches.at(-1), u = `br_stub_${H++}`;
|
|
1664
1674
|
o.branches.push({
|
|
1665
1675
|
id: u,
|
|
@@ -1673,61 +1683,61 @@ function j(_ = {}) {
|
|
|
1673
1683
|
...d,
|
|
1674
1684
|
branchId: u
|
|
1675
1685
|
}), {
|
|
1676
|
-
changeSet:
|
|
1686
|
+
changeSet: A(i),
|
|
1677
1687
|
branchId: u
|
|
1678
1688
|
};
|
|
1679
1689
|
});
|
|
1680
1690
|
},
|
|
1681
1691
|
async dropChain({ idempotencyKey: e, ...t }) {
|
|
1682
1692
|
return V(e, ["dropChain", t], async () => {
|
|
1683
|
-
let { changeSetId: e, chainId: n } = t, r = Z(e),
|
|
1684
|
-
if (!
|
|
1685
|
-
if (
|
|
1686
|
-
for (let e of
|
|
1687
|
-
return r.chains = r.chains.filter((e) => e.id !== n), r.plannedReleases = r.plannedReleases.filter((e) => e.contentId !==
|
|
1693
|
+
let { changeSetId: e, chainId: n } = t, r = Z(e), i = r.chains.find((e) => e.id === n);
|
|
1694
|
+
if (!i) throw k("Chain", n);
|
|
1695
|
+
if (i.born) throw new a("the Chain of Content born in the Change Set can't be dropped: discard the Change Set");
|
|
1696
|
+
for (let e of i.branches) qe(e.id);
|
|
1697
|
+
return r.chains = r.chains.filter((e) => e.id !== n), r.plannedReleases = r.plannedReleases.filter((e) => e.contentId !== i.contentId), delete U(i.contentId).branches[e], A(r);
|
|
1688
1698
|
});
|
|
1689
1699
|
},
|
|
1690
1700
|
async getPendingMerge(e) {
|
|
1691
1701
|
let t = B.get(e);
|
|
1692
1702
|
return t ? structuredClone(t) : null;
|
|
1693
1703
|
},
|
|
1694
|
-
async resolveMerge({ idempotencyKey:
|
|
1695
|
-
return V(
|
|
1696
|
-
let { changeSetId:
|
|
1697
|
-
if (!
|
|
1698
|
-
if (
|
|
1699
|
-
contentId:
|
|
1700
|
-
branchId:
|
|
1701
|
-
expectedHeadId:
|
|
1702
|
-
currentHeadId:
|
|
1704
|
+
async resolveMerge({ idempotencyKey: t, ...n }) {
|
|
1705
|
+
return V(t, ["resolveMerge", n], async () => {
|
|
1706
|
+
let { changeSetId: t, branchId: r, expectedHeadId: i, resolutions: o } = n, { chain: s, branch: c, c: l } = Ge(t, r), u = B.get(r);
|
|
1707
|
+
if (!u) throw new a(`Branch ${r} has no Pending Merge`);
|
|
1708
|
+
if (c.headRevisionId !== i) throw new e({
|
|
1709
|
+
contentId: l.id,
|
|
1710
|
+
branchId: r,
|
|
1711
|
+
expectedHeadId: i,
|
|
1712
|
+
currentHeadId: c.headRevisionId
|
|
1703
1713
|
});
|
|
1704
|
-
let
|
|
1705
|
-
if (new Set(
|
|
1706
|
-
let p = structuredClone(
|
|
1707
|
-
for (let e of
|
|
1708
|
-
let t =
|
|
1714
|
+
let d = o.map((e) => e.path), f = u.fields.map((e) => e.path);
|
|
1715
|
+
if (new Set(d).size !== d.length || d.some((e) => !f.includes(e)) || f.some((e) => !d.includes(e))) throw new a("decide every field the Pending Merge lists, once");
|
|
1716
|
+
let p = structuredClone(u.merged);
|
|
1717
|
+
for (let e of o) {
|
|
1718
|
+
let t = u.fields.find((t) => t.path === e.path), n = "side" in e ? e.side === "ours" ? t.ours : t.theirs : e.value, r = e.path.replace(/^\//, "");
|
|
1709
1719
|
n === void 0 ? delete p[r] : p[r] = structuredClone(n);
|
|
1710
1720
|
}
|
|
1711
|
-
let m =
|
|
1712
|
-
changeSetId:
|
|
1713
|
-
chain:
|
|
1714
|
-
branch:
|
|
1715
|
-
c,
|
|
1721
|
+
let m = We({
|
|
1722
|
+
changeSetId: t,
|
|
1723
|
+
chain: s,
|
|
1724
|
+
branch: c,
|
|
1725
|
+
c: l,
|
|
1716
1726
|
data: p,
|
|
1717
1727
|
cause: "resolve",
|
|
1718
|
-
secondParentId:
|
|
1728
|
+
secondParentId: u.theirsRevisionId
|
|
1719
1729
|
});
|
|
1720
|
-
return
|
|
1730
|
+
return qe(r), m;
|
|
1721
1731
|
});
|
|
1722
1732
|
},
|
|
1723
1733
|
async abortMerge({ idempotencyKey: e, ...t }) {
|
|
1724
1734
|
return V(e, ["abortMerge", t], async () => {
|
|
1725
|
-
if (
|
|
1726
|
-
|
|
1735
|
+
if (Ge(t.changeSetId, t.branchId), !B.has(t.branchId)) throw new a(`Branch ${t.branchId} has no Pending Merge`);
|
|
1736
|
+
qe(t.branchId);
|
|
1727
1737
|
});
|
|
1728
1738
|
},
|
|
1729
1739
|
async previewInForce({ contentId: e, changeSetId: t, validOn: n }) {
|
|
1730
|
-
let r = Z(t), i = U(e), a = n ||
|
|
1740
|
+
let r = Z(t), i = U(e), a = n || Pe(), o = r.chains.find((t) => t.contentId === e), s = (e) => !e.validityPeriod || e.validityPeriod.firstDay <= a && (e.validityPeriod.lastDay === "" || a <= e.validityPeriod.lastDay), c = r.plannedReleases.find((t) => t.contentId === e && t.kind !== "repeal" && s(t));
|
|
1731
1741
|
if (c) {
|
|
1732
1742
|
let e = c.branchId ? o?.branches.find((e) => e.id === c.branchId)?.headRevisionId ?? "" : c.revisionId;
|
|
1733
1743
|
return {
|
|
@@ -1739,7 +1749,7 @@ function j(_ = {}) {
|
|
|
1739
1749
|
data: structuredClone(q(i, e) ?? {})
|
|
1740
1750
|
};
|
|
1741
1751
|
}
|
|
1742
|
-
let l =
|
|
1752
|
+
let l = ee(i.timeline ?? [], a);
|
|
1743
1753
|
return l ? {
|
|
1744
1754
|
releaseId: l.releaseId,
|
|
1745
1755
|
revisionId: l.revisionId,
|
|
@@ -1750,7 +1760,7 @@ function j(_ = {}) {
|
|
|
1750
1760
|
} : null;
|
|
1751
1761
|
}
|
|
1752
1762
|
};
|
|
1753
|
-
function
|
|
1763
|
+
function rt(e, t, n) {
|
|
1754
1764
|
let r = {
|
|
1755
1765
|
id: `rls_stub_${H++}`,
|
|
1756
1766
|
contentId: e.id,
|
|
@@ -1768,7 +1778,7 @@ function j(_ = {}) {
|
|
|
1768
1778
|
plannedRelease: r
|
|
1769
1779
|
}], structuredClone({
|
|
1770
1780
|
plannedRelease: r,
|
|
1771
|
-
gapReferrers:
|
|
1781
|
+
gapReferrers: Ie(e.id)
|
|
1772
1782
|
});
|
|
1773
1783
|
}
|
|
1774
1784
|
function $(e, t, n) {
|
|
@@ -1786,33 +1796,33 @@ function j(_ = {}) {
|
|
|
1786
1796
|
if (t.kind === "in_force") return e.inForce ? [r(e.inForce, { releaseId: e.inForce.releaseId })] : [];
|
|
1787
1797
|
if (t.kind === "change_set") {
|
|
1788
1798
|
let i = e.branches[t.changeSetId];
|
|
1789
|
-
return !i || n && !
|
|
1799
|
+
return !i || n && !N(i.data, n) ? [] : [r(i, {
|
|
1790
1800
|
changeSetId: t.changeSetId,
|
|
1791
1801
|
branchId: i.branchId
|
|
1792
1802
|
})];
|
|
1793
1803
|
}
|
|
1794
1804
|
if (!n) return e.main ? [r(e.main, {})] : [];
|
|
1795
1805
|
let i = [];
|
|
1796
|
-
e.main &&
|
|
1797
|
-
for (let [t, a] of Object.entries(e.branches).sort(([, e], [, t]) => e.branchId < t.branchId ? -1 : 1))
|
|
1806
|
+
e.main && N(e.main.data, n) && i.push(r(e.main, {}));
|
|
1807
|
+
for (let [t, a] of Object.entries(e.branches).sort(([, e], [, t]) => e.branchId < t.branchId ? -1 : 1)) w.find((e) => e.id === t)?.state === "open" && N(a.data, n) && i.push(r(a, {
|
|
1798
1808
|
changeSetId: t,
|
|
1799
1809
|
branchId: a.branchId
|
|
1800
1810
|
}));
|
|
1801
1811
|
return i;
|
|
1802
1812
|
}
|
|
1803
1813
|
}
|
|
1804
|
-
function
|
|
1814
|
+
function N(e, t) {
|
|
1805
1815
|
let n = (e) => e.toLocaleLowerCase().replace(/\s+/g, " "), r = n(t);
|
|
1806
1816
|
return Object.values(e).some((e) => typeof e == "string" && n(e).includes(r));
|
|
1807
1817
|
}
|
|
1808
1818
|
//#endregion
|
|
1809
1819
|
//#region src/testing/stub-status-source.ts
|
|
1810
|
-
function
|
|
1820
|
+
function P(e = E()) {
|
|
1811
1821
|
return { async listChangeSetStatuses() {
|
|
1812
1822
|
return e.map((e) => ({ ...e }));
|
|
1813
1823
|
} };
|
|
1814
1824
|
}
|
|
1815
1825
|
//#endregion
|
|
1816
|
-
export {
|
|
1826
|
+
export { w as STUB_NOW, C as STUB_OTHER_USER_ID, S as STUB_USER_ID, x as STUB_WORKSPACE_ID, he as createStubBlueprintSource, M as createStubContenthubClient, P as createStubStatusSource, oe as stubBlockReasons, j as stubBlocker, fe as stubBlueprintReleases, de as stubBlueprints, E as stubChangeSetStatuses, ce as stubChangeSets, ue as stubCollections, me as stubContents, T as stubIdentity, D as stubRepealedContent, le as stubRequiredChecks, pe as stubResolvedReleases, se as stubStatusTransitions };
|
|
1817
1827
|
|
|
1818
1828
|
//# sourceMappingURL=testing.js.map
|