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