@knkcs/contenthub-ui 0.0.0-stage → 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.
@@ -0,0 +1,1818 @@
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
+ //#region src/testing/fixtures.ts
5
+ var b = "ws_stub", x = "user_stub", S = "user_ben", C = "2026-10-01T09:00:00.000Z";
6
+ function w() {
7
+ return {
8
+ userId: x,
9
+ workspaceId: b,
10
+ members: y([{
11
+ userId: x,
12
+ displayName: "Ada Editor",
13
+ email: "ada@example.com"
14
+ }, {
15
+ userId: S,
16
+ displayName: "Ben Reviewer",
17
+ email: "ben@example.com"
18
+ }])
19
+ };
20
+ }
21
+ function oe() {
22
+ return [{
23
+ id: "br_author",
24
+ name: "Being revised by the author",
25
+ createTime: C,
26
+ updateTime: C
27
+ }, {
28
+ id: "br_embargo",
29
+ name: "Embargoed until publication",
30
+ createTime: C,
31
+ updateTime: C
32
+ }];
33
+ }
34
+ function se() {
35
+ return [
36
+ {
37
+ slug: "in_progress",
38
+ name: "In Bearbeitung",
39
+ color: "steelblue"
40
+ },
41
+ {
42
+ slug: "in_review",
43
+ name: "In Prüfung",
44
+ color: "orange"
45
+ },
46
+ {
47
+ slug: "ready",
48
+ name: "Bereit",
49
+ color: "seagreen"
50
+ },
51
+ {
52
+ slug: "on_hold",
53
+ name: "Zurückgestellt",
54
+ color: "gray"
55
+ }
56
+ ];
57
+ }
58
+ function ce() {
59
+ return {
60
+ in_progress: ["in_review", "on_hold"],
61
+ in_review: [
62
+ "in_progress",
63
+ "ready",
64
+ "on_hold"
65
+ ],
66
+ ready: ["in_review", "on_hold"],
67
+ on_hold: ["in_progress"]
68
+ };
69
+ }
70
+ function le() {
71
+ return [
72
+ {
73
+ id: "cs_bgbl_270",
74
+ name: "BGBl. 2026 I Nr. 270",
75
+ source: {
76
+ date: "2026-09-20",
77
+ reference: "BGBl. 2026 I Nr. 270"
78
+ },
79
+ state: "open",
80
+ createdBy: x,
81
+ createTime: "2026-09-30T08:00:00.000Z",
82
+ chains: [{
83
+ id: "chain_para_1",
84
+ contentId: "content_para_1",
85
+ born: !1,
86
+ branches: [{
87
+ id: "br_para_1_a",
88
+ position: 0,
89
+ kind: "editorial",
90
+ headRevisionId: "rev_p1_a2",
91
+ effectiveOn: "2026-07-01",
92
+ carriedReleaseId: "rls_p1_1"
93
+ }, {
94
+ id: "br_para_1_b",
95
+ position: 1,
96
+ kind: "editorial",
97
+ headRevisionId: "rev_p1_b1",
98
+ effectiveOn: "2026-10-01"
99
+ }]
100
+ }, {
101
+ id: "chain_para_4a",
102
+ contentId: "content_para_4a",
103
+ born: !0,
104
+ branches: [{
105
+ id: "br_para_4a",
106
+ position: 0,
107
+ kind: "editorial",
108
+ headRevisionId: "rev_p4a_1"
109
+ }]
110
+ }],
111
+ dependsOnChangeSetIds: [],
112
+ status: "in_progress",
113
+ assigneeIds: [x],
114
+ plannedReleases: [
115
+ {
116
+ id: "rls_p1_2",
117
+ contentId: "content_para_1",
118
+ kind: "revision",
119
+ branchId: "br_para_1_b",
120
+ revisionId: "",
121
+ validityPeriod: {
122
+ firstDay: "2026-10-01",
123
+ lastDay: ""
124
+ },
125
+ supersedesReleaseIds: [],
126
+ proposed: !1,
127
+ proposedForReleaseId: "",
128
+ splitFromReleaseId: "",
129
+ withheld: !1
130
+ },
131
+ {
132
+ id: "rls_p1_1_cut",
133
+ contentId: "content_para_1",
134
+ kind: "date_only",
135
+ branchId: "",
136
+ revisionId: "rev_p1_main",
137
+ validityPeriod: {
138
+ firstDay: "2020-01-01",
139
+ lastDay: "2026-09-30"
140
+ },
141
+ supersedesReleaseIds: ["rls_p1_1"],
142
+ proposed: !0,
143
+ proposedForReleaseId: "rls_p1_1",
144
+ splitFromReleaseId: "",
145
+ withheld: !1
146
+ },
147
+ {
148
+ id: "rls_p4a_1",
149
+ contentId: "content_para_4a",
150
+ kind: "revision",
151
+ branchId: "br_para_4a",
152
+ revisionId: "",
153
+ validityPeriod: {
154
+ firstDay: "2026-10-01",
155
+ lastDay: ""
156
+ },
157
+ supersedesReleaseIds: [],
158
+ proposed: !1,
159
+ proposedForReleaseId: "",
160
+ splitFromReleaseId: "",
161
+ withheld: !1
162
+ }
163
+ ]
164
+ },
165
+ {
166
+ id: "cs_bgbl_255",
167
+ name: "BGBl. 2026 I Nr. 255",
168
+ source: {
169
+ date: "2026-09-10",
170
+ reference: "BGBl. 2026 I Nr. 255"
171
+ },
172
+ state: "open",
173
+ createdBy: S,
174
+ createTime: "2026-09-25T08:00:00.000Z",
175
+ chains: [],
176
+ dependsOnChangeSetIds: [],
177
+ status: "",
178
+ assigneeIds: [S],
179
+ plannedReleases: []
180
+ },
181
+ {
182
+ id: "cs_correction_3",
183
+ name: "Correction of § 3",
184
+ state: "published",
185
+ createdBy: x,
186
+ createTime: "2026-09-01T08:00:00.000Z",
187
+ closeTime: "2026-09-02T08:00:00.000Z",
188
+ chains: [],
189
+ dependsOnChangeSetIds: [],
190
+ status: "ready",
191
+ assigneeIds: [],
192
+ plannedReleases: []
193
+ }
194
+ ];
195
+ }
196
+ function ue() {
197
+ return [{
198
+ id: "rc_print",
199
+ name: "Druckprobe",
200
+ scope: "change_set",
201
+ blueprintAccessors: [],
202
+ independent: !1
203
+ }, {
204
+ id: "rc_lawyer",
205
+ name: "Juristische Prüfung",
206
+ scope: "branch",
207
+ blueprintAccessors: [],
208
+ independent: !0
209
+ }];
210
+ }
211
+ function de() {
212
+ return [
213
+ {
214
+ id: "col_bgb",
215
+ name: "BGB",
216
+ parentId: "col_laws",
217
+ restricted: !1
218
+ },
219
+ {
220
+ id: "col_commentary",
221
+ name: "Commentary",
222
+ parentId: "",
223
+ restricted: !1
224
+ },
225
+ {
226
+ id: "col_laws",
227
+ name: "Laws",
228
+ parentId: "",
229
+ restricted: !1
230
+ },
231
+ {
232
+ id: "col_stgb",
233
+ name: "StGB",
234
+ parentId: "col_laws",
235
+ restricted: !1
236
+ }
237
+ ];
238
+ }
239
+ function fe() {
240
+ return [
241
+ {
242
+ id: "bp_commentary",
243
+ name: "Commentary"
244
+ },
245
+ {
246
+ id: "bp_footnote",
247
+ name: "Footnote"
248
+ },
249
+ {
250
+ id: "bp_paragraph",
251
+ name: "Paragraph"
252
+ }
253
+ ];
254
+ }
255
+ function pe() {
256
+ return [
257
+ {
258
+ id: "bpr_paragraph_2",
259
+ blueprintId: "bp_paragraph",
260
+ name: "2026-10",
261
+ releaseTime: "2026-10-01T07:00:00.000Z"
262
+ },
263
+ {
264
+ id: "bpr_paragraph_1",
265
+ blueprintId: "bp_paragraph",
266
+ name: "2026-09",
267
+ releaseTime: "2026-09-01T07:00:00.000Z"
268
+ },
269
+ {
270
+ id: "bpr_footnote_1",
271
+ blueprintId: "bp_footnote",
272
+ name: "2026-08",
273
+ releaseTime: "2026-08-01T07:00:00.000Z"
274
+ }
275
+ ];
276
+ }
277
+ function me() {
278
+ let e = (e, t) => ({
279
+ field_type: "text",
280
+ config: {
281
+ name: t,
282
+ api_accessor: e,
283
+ required: !1,
284
+ instructions: ""
285
+ },
286
+ system: !1
287
+ }), t = {
288
+ displayName: "Paragraph",
289
+ dated: !0,
290
+ fields: [e("number", "Number"), e("heading", "Heading")],
291
+ parts: {}
292
+ };
293
+ return {
294
+ bpr_paragraph_1: t,
295
+ bpr_paragraph_2: t,
296
+ bpr_footnote_1: {
297
+ displayName: "Footnote",
298
+ dated: !0,
299
+ fields: [e("text", "Text")],
300
+ parts: {}
301
+ }
302
+ };
303
+ }
304
+ function T() {
305
+ let e = "2001-11-01T08:00:00.000Z";
306
+ return {
307
+ id: "content_para_3",
308
+ blueprintId: "bp_paragraph",
309
+ blueprintReleaseId: "bpr_paragraph_1",
310
+ collectionIds: ["col_bgb"],
311
+ main: {
312
+ revisionId: "rev_p3_main",
313
+ data: {
314
+ number: "§ 3",
315
+ heading: "(weggefallen)"
316
+ },
317
+ revisionCreateTime: e
318
+ },
319
+ branches: {},
320
+ timeline: [{
321
+ ordinal: 1,
322
+ releaseId: "rls_p3_repeal",
323
+ kind: "repeal",
324
+ revisionId: "rev_p3_main",
325
+ blueprintReleaseId: "bpr_paragraph_1",
326
+ validityPeriod: {
327
+ firstDay: "1900-01-01",
328
+ lastDay: "2001-12-31"
329
+ },
330
+ publishTime: e,
331
+ first: !0
332
+ }]
333
+ };
334
+ }
335
+ function he() {
336
+ let e = "2026-09-01T08:00:00.000Z";
337
+ return [
338
+ {
339
+ id: "content_fn_1",
340
+ blueprintId: "bp_footnote",
341
+ blueprintReleaseId: "bpr_footnote_1",
342
+ collectionIds: [],
343
+ main: {
344
+ revisionId: "rev_fn1_main",
345
+ data: { text: "Fassung ab 1. Januar 2027" },
346
+ revisionCreateTime: e
347
+ },
348
+ branches: {},
349
+ timeline: [{
350
+ ordinal: 1,
351
+ releaseId: "rls_fn1_1",
352
+ kind: "revision",
353
+ revisionId: "rev_fn1_main",
354
+ blueprintReleaseId: "bpr_footnote_1",
355
+ validityPeriod: {
356
+ firstDay: "2027-01-01",
357
+ lastDay: ""
358
+ },
359
+ publishTime: e,
360
+ first: !0
361
+ }]
362
+ },
363
+ {
364
+ id: "content_para_1",
365
+ blueprintId: "bp_paragraph",
366
+ blueprintReleaseId: "bpr_paragraph_1",
367
+ collectionIds: ["col_bgb"],
368
+ assigneeIds: [x, S],
369
+ main: {
370
+ revisionId: "rev_p1_main",
371
+ data: {
372
+ number: "§ 1",
373
+ heading: "Beginn der Rechtsfähigkeit"
374
+ },
375
+ revisionCreateTime: e
376
+ },
377
+ inForce: {
378
+ releaseId: "rls_p1_1",
379
+ revisionId: "rev_p1_main",
380
+ data: {
381
+ number: "§ 1",
382
+ heading: "Beginn der Rechtsfähigkeit"
383
+ },
384
+ revisionCreateTime: e
385
+ },
386
+ branches: { cs_bgbl_270: {
387
+ branchId: "br_para_1_b",
388
+ revisionId: "rev_p1_b1",
389
+ data: {
390
+ number: "§ 1",
391
+ heading: "Beginn der Rechtsfähigkeit, Erbfähigkeit"
392
+ },
393
+ revisionCreateTime: "2026-09-30T09:00:00.000Z"
394
+ } },
395
+ timeline: [{
396
+ ordinal: 1,
397
+ releaseId: "rls_p1_1",
398
+ kind: "revision",
399
+ revisionId: "rev_p1_main",
400
+ blueprintReleaseId: "bpr_paragraph_1",
401
+ validityPeriod: {
402
+ firstDay: "1900-01-01",
403
+ lastDay: ""
404
+ },
405
+ publishTime: e,
406
+ first: !0
407
+ }],
408
+ plannedReleases: [{
409
+ changeSetId: "cs_bgbl_270",
410
+ plannedRelease: {
411
+ id: "rls_p1_270",
412
+ contentId: "content_para_1",
413
+ kind: "revision",
414
+ branchId: "br_para_1_b",
415
+ validityPeriod: {
416
+ firstDay: "2026-11-01",
417
+ lastDay: ""
418
+ },
419
+ revisionId: "",
420
+ supersedesReleaseIds: [],
421
+ proposed: !1,
422
+ proposedForReleaseId: "",
423
+ splitFromReleaseId: "",
424
+ withheld: !1
425
+ }
426
+ }],
427
+ revisions: [
428
+ {
429
+ id: "rev_p1_b1",
430
+ contentId: "content_para_1",
431
+ parentId: "rev_p1_a2",
432
+ secondParentId: "",
433
+ blueprintReleaseId: "bpr_paragraph_1",
434
+ createTime: "2026-09-30T09:00:00.000Z",
435
+ author: x,
436
+ cause: "save",
437
+ branchId: "br_para_1_b",
438
+ changeSetId: "cs_bgbl_270",
439
+ data: {
440
+ number: "§ 1",
441
+ heading: "Beginn der Rechtsfähigkeit, Erbfähigkeit"
442
+ }
443
+ },
444
+ {
445
+ id: "rev_p1_a2",
446
+ contentId: "content_para_1",
447
+ parentId: "rev_p1_main",
448
+ secondParentId: "",
449
+ blueprintReleaseId: "bpr_paragraph_1",
450
+ createTime: "2026-09-30T08:30:00.000Z",
451
+ author: S,
452
+ cause: "save",
453
+ branchId: "br_para_1_a",
454
+ changeSetId: "cs_bgbl_270",
455
+ data: {
456
+ number: "§ 1",
457
+ heading: "Beginn der Rechtsfähigkeit des Menschen"
458
+ }
459
+ },
460
+ {
461
+ id: "rev_p1_main",
462
+ contentId: "content_para_1",
463
+ parentId: "",
464
+ secondParentId: "",
465
+ blueprintReleaseId: "bpr_paragraph_1",
466
+ createTime: e,
467
+ author: x,
468
+ cause: "create",
469
+ branchId: "br_para_1_main",
470
+ changeSetId: "cs_correction_3"
471
+ }
472
+ ],
473
+ edges: [{
474
+ sourceContentId: "content_para_1",
475
+ sourceRevisionId: "rev_p1_main",
476
+ path: "/see_also",
477
+ kind: "reference",
478
+ targetContentId: "content_para_2",
479
+ targetAssetId: "",
480
+ targetBlueprintReleaseId: "",
481
+ pinReleaseId: "rls_p2_0"
482
+ }]
483
+ },
484
+ {
485
+ id: "content_para_2",
486
+ blueprintId: "bp_paragraph",
487
+ blueprintReleaseId: "bpr_paragraph_1",
488
+ collectionIds: ["col_bgb"],
489
+ main: {
490
+ revisionId: "rev_p2_main",
491
+ data: {
492
+ number: "§ 2",
493
+ heading: "Eintritt der Volljährigkeit"
494
+ },
495
+ revisionCreateTime: e
496
+ },
497
+ inForce: {
498
+ releaseId: "rls_p2_1",
499
+ revisionId: "rev_p2_main",
500
+ data: {
501
+ number: "§ 2",
502
+ heading: "Eintritt der Volljährigkeit"
503
+ },
504
+ revisionCreateTime: e
505
+ },
506
+ branches: {},
507
+ timeline: [{
508
+ ordinal: 1,
509
+ releaseId: "rls_p2_1",
510
+ kind: "revision",
511
+ revisionId: "rev_p2_main",
512
+ blueprintReleaseId: "bpr_paragraph_1",
513
+ validityPeriod: {
514
+ firstDay: "1975-01-01",
515
+ lastDay: ""
516
+ },
517
+ publishTime: e,
518
+ first: !1
519
+ }],
520
+ edges: [{
521
+ sourceContentId: "content_para_2",
522
+ sourceRevisionId: "rev_p2_main",
523
+ path: "/see_also",
524
+ kind: "reference",
525
+ targetContentId: "content_para_1",
526
+ targetAssetId: "",
527
+ targetBlueprintReleaseId: "",
528
+ pinReleaseId: ""
529
+ }]
530
+ },
531
+ {
532
+ id: "content_para_4a",
533
+ blueprintId: "bp_paragraph",
534
+ blueprintReleaseId: "bpr_paragraph_2",
535
+ collectionIds: ["col_bgb"],
536
+ branches: { cs_bgbl_270: {
537
+ branchId: "br_para_4a",
538
+ revisionId: "rev_p4a_1",
539
+ data: {
540
+ number: "§ 4a",
541
+ heading: "Elektronische Form"
542
+ },
543
+ revisionCreateTime: "2026-09-30T10:00:00.000Z"
544
+ } }
545
+ },
546
+ {
547
+ id: "content_stgb_211",
548
+ blueprintId: "bp_paragraph",
549
+ blueprintReleaseId: "bpr_paragraph_1",
550
+ collectionIds: ["col_stgb"],
551
+ assigneeIds: [S],
552
+ main: {
553
+ revisionId: "rev_s211_main",
554
+ data: {
555
+ number: "§ 211",
556
+ heading: "Mord"
557
+ },
558
+ revisionCreateTime: e
559
+ },
560
+ inForce: {
561
+ releaseId: "rls_s211_1",
562
+ revisionId: "rev_s211_main",
563
+ data: {
564
+ number: "§ 211",
565
+ heading: "Mord"
566
+ },
567
+ revisionCreateTime: e
568
+ },
569
+ branches: {},
570
+ timeline: [{
571
+ ordinal: 1,
572
+ releaseId: "rls_s211_1",
573
+ kind: "revision",
574
+ revisionId: "rev_s211_main",
575
+ blueprintReleaseId: "bpr_paragraph_1",
576
+ validityPeriod: {
577
+ firstDay: "1941-09-15",
578
+ lastDay: ""
579
+ },
580
+ publishTime: e,
581
+ first: !0
582
+ }]
583
+ }
584
+ ];
585
+ }
586
+ //#endregion
587
+ //#region src/testing/stub-blueprint-source.ts
588
+ function ge(e = fe(), t = pe()) {
589
+ return {
590
+ async searchBlueprints({ query: t }) {
591
+ let n = t.trim().toLocaleLowerCase();
592
+ return {
593
+ blueprints: e.filter((e) => e.name.toLocaleLowerCase().includes(n)).map((e) => ({ ...e })),
594
+ nextPageToken: ""
595
+ };
596
+ },
597
+ async getBlueprints(t) {
598
+ return e.filter((e) => t.includes(e.id)).map((e) => ({ ...e }));
599
+ },
600
+ async listReleases(e) {
601
+ return t.filter((t) => t.blueprintId === e).map((e) => ({ ...e }));
602
+ }
603
+ };
604
+ }
605
+ //#endregion
606
+ //#region src/testing/stub-client.ts
607
+ function _e(e, t) {
608
+ let n = /* @__PURE__ */ new Date(`${e}T00:00:00Z`);
609
+ return n.setUTCDate(n.getUTCDate() + t), n.toISOString().slice(0, 10);
610
+ }
611
+ function E(e, t, n) {
612
+ let r = e.trim();
613
+ if (r === "") throw new i(`${t} is required`);
614
+ if ([...r].length > n) throw new i(`${t} is at most ${n} characters`);
615
+ if (/[\u0000-\u001f\u007f]/.test(r)) throw new i(`${t} is one line of text`);
616
+ return r;
617
+ }
618
+ function ve(e) {
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
+ return {
621
+ date: e.date.trim(),
622
+ reference: E(e.reference, "source.reference", 500)
623
+ };
624
+ }
625
+ function ye(e) {
626
+ let t = e.trim();
627
+ if (t === "") throw new i("a Block Reason needs a name");
628
+ if ([...t].length > 200) throw new i("a Block Reason's name is at most 200 characters");
629
+ if (/[\u0000-\u001f\u007f]/.test(t)) throw new i("a Block Reason's name is one line of text");
630
+ return t;
631
+ }
632
+ function be(e) {
633
+ let t = E(e.name, "a Required Check's name", 200);
634
+ if (e.scope !== "branch" && e.scope !== "change_set") throw new i("a Required Check's scope is Branch or Change Set");
635
+ let n = e.blueprintAccessors.map((e) => {
636
+ let t = e.trim();
637
+ if (t === "" || [...t].length > 200 || /[\u0000-\u001f\u007f]/.test(t)) throw new i(`"${t}" is not a Blueprint accessor`);
638
+ return t;
639
+ });
640
+ return {
641
+ name: t,
642
+ scope: e.scope,
643
+ blueprintAccessors: [...new Set(n)].sort(),
644
+ independent: e.independent
645
+ };
646
+ }
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
+ }
651
+ var k = (e) => structuredClone(e);
652
+ function A(e, t = {}) {
653
+ return {
654
+ code: e,
655
+ contentId: "",
656
+ branchId: "",
657
+ expectedHeadId: "",
658
+ currentHeadId: "",
659
+ releaseId: "",
660
+ overlapsReleaseId: "",
661
+ dependencyChangeSetId: "",
662
+ path: "",
663
+ targetContentId: "",
664
+ assetId: "",
665
+ parentContentIds: [],
666
+ requiredCheckId: "",
667
+ coveredReleaseId: "",
668
+ revisionId: "",
669
+ ...t
670
+ };
671
+ }
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
+ everyMember: !0,
677
+ userIds: []
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
+ if (!e) return n();
680
+ let r = JSON.stringify(t), a = Ae.get(e);
681
+ if (a) {
682
+ if (a.asked !== r) throw new i(`idempotency key ${e} names another request`);
683
+ return structuredClone(a.answer);
684
+ }
685
+ let o = await n();
686
+ return Ae.set(e, {
687
+ asked: r,
688
+ answer: structuredClone(o)
689
+ }), o;
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
+ return t;
694
+ }, W = (e) => structuredClone({
695
+ collectionIds: [...e.collectionIds].sort(),
696
+ assigneeIds: e.assigneeIds ?? [],
697
+ block: e.block,
698
+ archiveTime: e.archiveTime
699
+ }), Ne = () => v().slice(0, 10), G = (e) => N[e.blueprintReleaseId]?.dated ?? !1, K = (e) => {
700
+ let t = [...e.revisions ?? []], n = [...Object.entries(e.branches).map(([e, t]) => ({
701
+ ...t,
702
+ changeSetId: e
703
+ })), ...e.main ? [{
704
+ ...e.main,
705
+ branchId: "",
706
+ changeSetId: ""
707
+ }] : []];
708
+ for (let r of n) t.some((e) => e.id === r.revisionId) || t.push({
709
+ id: r.revisionId,
710
+ contentId: e.id,
711
+ parentId: "",
712
+ secondParentId: "",
713
+ blueprintReleaseId: e.blueprintReleaseId,
714
+ createTime: r.revisionCreateTime,
715
+ author: y,
716
+ cause: "create",
717
+ branchId: r.branchId,
718
+ changeSetId: r.changeSetId,
719
+ data: r.data
720
+ });
721
+ return t.sort((e, t) => e.createTime < t.createTime ? 1 : e.createTime > t.createTime ? -1 : 0);
722
+ }, q = (e, t) => [
723
+ e.main,
724
+ e.inForce,
725
+ ...Object.values(e.branches)
726
+ ].find((e) => e?.revisionId === t)?.data ?? e.revisions?.find((e) => e.id === t)?.data, Pe = (e, t) => {
727
+ let n = (e) => e == null || e === "" || Array.isArray(e) && e.length === 0;
728
+ return (e ?? []).filter((e) => e.config.required === !0 && n(t[e.config.api_accessor])).map((e) => e.config.api_accessor);
729
+ }, J = (e) => {
730
+ if (e.archiveTime) throw new a(e.id);
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
+ edge: { ...e },
734
+ releaseId: t.inForce?.releaseId ?? ""
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
+ return t;
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
+ if (e === "") throw new i("required_check_id is required");
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
+ if (n === "") throw new i("expected_head_id is required");
756
+ if (s.headRevisionId !== n) throw new f({
757
+ contentId: c.id,
758
+ branchId: t,
759
+ expectedHeadId: n,
760
+ currentHeadId: s.headRevisionId
761
+ });
762
+ let l = q(c, s.headRevisionId) ?? {}, u = JSON.parse(JSON.stringify(r)), d;
763
+ if (a) {
764
+ let e = Object.keys(u).filter((e) => !a.includes(e));
765
+ if (e.length > 0) throw new i(`data holds ${e.join(", ")}, which the mask doesn't name`);
766
+ d = structuredClone(l);
767
+ for (let e of a) e in u ? d[e] = u[e] : delete d[e];
768
+ } else d = u;
769
+ return Ue({
770
+ changeSetId: e,
771
+ chain: o,
772
+ branch: s,
773
+ c,
774
+ data: d,
775
+ cause: "save"
776
+ });
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
+ return r.revisions = [{
780
+ id: c,
781
+ contentId: r.id,
782
+ parentId: n.headRevisionId,
783
+ secondParentId: o,
784
+ blueprintReleaseId: r.blueprintReleaseId,
785
+ createTime: l,
786
+ author: y,
787
+ cause: a,
788
+ branchId: s,
789
+ changeSetId: e,
790
+ data: structuredClone(i)
791
+ }, ...r.revisions ?? []], n.headRevisionId = c, t.branches.at(-1)?.id === s && (r.branches[e] = {
792
+ branchId: s,
793
+ revisionId: c,
794
+ data: structuredClone(i),
795
+ revisionCreateTime: l
796
+ }), {
797
+ id: r.id,
798
+ blueprintId: r.blueprintId,
799
+ blueprintReleaseId: r.blueprintReleaseId,
800
+ revisionId: c,
801
+ data: structuredClone(i),
802
+ changeSetId: e,
803
+ branchId: s,
804
+ revisionCreateTime: l,
805
+ releaseId: ""
806
+ };
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
+ return {
811
+ cs: n,
812
+ chain: r,
813
+ branch: i,
814
+ c: U(r.contentId)
815
+ };
816
+ }, Ge = (e, t) => {
817
+ for (let n of C) for (let r of n.chains) {
818
+ let n = r.branches.find((t) => t.id === e);
819
+ if (!n) continue;
820
+ let i = {
821
+ branchId: e,
822
+ contentId: r.contentId,
823
+ reason: t.reason ?? "conflict",
824
+ oursRevisionId: n.headRevisionId,
825
+ theirsRevisionId: t.theirsRevisionId,
826
+ carried: !1,
827
+ fields: structuredClone(t.fields),
828
+ merged: structuredClone(t.merged)
829
+ };
830
+ B.set(e, i), n.hasPendingMerge = !0, delete z[e];
831
+ return;
832
+ }
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
+ let t = n.branches.find((t) => t.id === e);
838
+ t && (t.hasPendingMerge = !1);
839
+ }
840
+ }, qe = (e, t) => {
841
+ let n = t.validityPeriod;
842
+ if (G(e)) {
843
+ if (!n || !h.test(n.firstDay)) throw new i("validity_period.first_day is required for Dated Content");
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
+ } else if (n) throw new i("validity_period is refused for undated Content");
846
+ let r = Pe(N[e.blueprintReleaseId]?.releaseSpec, t.releaseSpec ?? {}).map((e) => ({
847
+ source: "fieldkit",
848
+ code: "required",
849
+ path: `/${e}`
850
+ }));
851
+ if (r.length > 0) throw new g("the Release Spec values break the Blueprint Release", r);
852
+ if (n && n.lastDay !== "") {
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 o(e.id, r);
855
+ }
856
+ }, Je = (e, t) => {
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
+ let o = n.find((t) => t.proposedForReleaseId === e.releaseId && t.splitFromReleaseId === a);
859
+ i.push({
860
+ id: o?.id ?? `rls_stub_${H++}`,
861
+ contentId: t.id,
862
+ kind: "date_only",
863
+ branchId: "",
864
+ revisionId: e.revisionId,
865
+ validityPeriod: r,
866
+ supersedesReleaseIds: a ? [] : [e.releaseId],
867
+ proposed: !0,
868
+ proposedForReleaseId: e.releaseId,
869
+ splitFromReleaseId: a,
870
+ withheld: !1
871
+ });
872
+ };
873
+ for (let e of r) {
874
+ let n = e.validityPeriod;
875
+ if (e.contentId === t.id && e.kind === "revision" && n) for (let r of t.timeline ?? []) {
876
+ let t = r.validityPeriod;
877
+ t && !e.supersedesReleaseIds.includes(r.releaseId) && t.firstDay < n.firstDay && (t.lastDay === "" || t.lastDay >= n.firstDay) && (a(r, {
878
+ firstDay: t.firstDay,
879
+ lastDay: _e(n.firstDay, -1)
880
+ }, ""), n.lastDay !== "" && (t.lastDay === "" || t.lastDay > n.lastDay) && a(r, {
881
+ firstDay: _e(n.lastDay, 1),
882
+ lastDay: t.lastDay
883
+ }, r.releaseId));
884
+ }
885
+ }
886
+ e.plannedReleases = [...r, ...i];
887
+ }, X = (e) => {
888
+ let t = C.find((t) => t.id === e);
889
+ if (!t) throw O("Change Set", e);
890
+ return t;
891
+ }, Z = (e) => {
892
+ let t = X(e);
893
+ if (t.state !== "open") throw new l(t.state);
894
+ return t;
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
+ key: t.id,
897
+ branchless: !1,
898
+ contentId: e.contentId,
899
+ revision: t.headRevisionId
900
+ }))), ...e.plannedReleases.filter((e) => e.kind !== "revision" && e.revisionId !== "").map((e) => ({
901
+ key: e.id,
902
+ branchless: !0,
903
+ contentId: e.contentId,
904
+ revision: e.revisionId
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
+ let r = n[0], i = r ? !p(r.heads, t.heads) : !1;
908
+ return {
909
+ check: structuredClone(e),
910
+ ...t,
911
+ results: n,
912
+ stale: i,
913
+ cleared: !!r && !i && r.outcome !== "failed"
914
+ };
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 [...P].sort(a)) {
917
+ let a = t.filter((t) => $e(e, t.contentId));
918
+ if (e.scope === "change_set") {
919
+ if (a.length === 0) continue;
920
+ let o = Object.fromEntries(t.map((e) => [e.key, e.revision]));
921
+ i.push(r(e, {
922
+ contentId: "",
923
+ branchId: "",
924
+ releaseId: "",
925
+ heads: o
926
+ }, n(e, "")));
927
+ continue;
928
+ }
929
+ for (let t of a) i.push(r(e, {
930
+ contentId: t.contentId,
931
+ branchId: t.branchless ? "" : t.key,
932
+ releaseId: t.branchless ? t.key : "",
933
+ heads: { [t.key]: t.revision }
934
+ }, n(e, t.key)));
935
+ }
936
+ return i;
937
+ }, tt = (e, t) => {
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(A("moved_head", {
940
+ contentId: r.contentId,
941
+ branchId: e.id,
942
+ expectedHeadId: t[e.id] ?? "",
943
+ currentHeadId: e.headRevisionId
944
+ }));
945
+ for (let [e, i] of Object.entries(t)) e in r || n.push(A("moved_head", {
946
+ branchId: e,
947
+ expectedHeadId: i
948
+ }));
949
+ for (let t of e.dependsOnChangeSetIds) {
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
+ }
953
+ for (let t of et(e)) t.cleared || n.push(A("outstanding_check", {
954
+ requiredCheckId: t.check.id,
955
+ contentId: t.contentId,
956
+ branchId: t.branchId,
957
+ releaseId: t.releaseId
958
+ }));
959
+ for (let t of e.chains) {
960
+ let e = T.find((e) => e.id === t.contentId);
961
+ for (let r of t.branches) {
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
+ contentId: e.id,
965
+ revisionId: r.headRevisionId,
966
+ path: `/${i}`
967
+ }));
968
+ }
969
+ }
970
+ return [...n, ...structuredClone(Oe[e.id] ?? [])];
971
+ }, Q = (e) => {
972
+ let t = te(e);
973
+ return e.plannedReleases.filter((e) => !e.withheld).map((n) => ({
974
+ id: n.id,
975
+ contentId: n.contentId,
976
+ kind: n.kind,
977
+ branchId: n.branchId,
978
+ revisionId: n.branchId ? t[n.branchId] ?? "" : n.revisionId,
979
+ first: !!e.chains.find((e) => e.contentId === n.contentId)?.born,
980
+ supersedesReleaseIds: [...n.supersedesReleaseIds],
981
+ validityPeriod: n.validityPeriod ? { ...n.validityPeriod } : void 0
982
+ }));
983
+ };
984
+ for (let [e, t] of Object.entries(z)) t.pending && Ge(e, t);
985
+ return {
986
+ async listBlockReasons() {
987
+ return [...S].sort(Ie).map((e) => ({ ...e }));
988
+ },
989
+ async createBlockReason({ name: e }) {
990
+ let t = ye(e);
991
+ if (Le(t)) throw new ne(t);
992
+ let n = {
993
+ id: `br_stub_${H++}`,
994
+ name: t,
995
+ createTime: v(),
996
+ updateTime: v()
997
+ };
998
+ return S.push(n), { ...n };
999
+ },
1000
+ async renameBlockReason({ id: e, name: t }) {
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
+ },
1006
+ async deleteBlockReason({ id: e }) {
1007
+ if (!S.some((t) => t.id === e)) throw O("Block Reason", e);
1008
+ S = S.filter((t) => t.id !== e);
1009
+ },
1010
+ async listChangeSets(e = {}) {
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
+ return {
1013
+ changeSets: t.slice(r, r + n).map((e) => ({
1014
+ ...k(e),
1015
+ chains: [],
1016
+ dependsOnChangeSetIds: [],
1017
+ plannedReleases: []
1018
+ })),
1019
+ nextPageToken: r + n < t.length ? String(r + n) : ""
1020
+ };
1021
+ },
1022
+ async createChangeSet({ name: e, source: t }) {
1023
+ let n = E(e, "name", 200), r = t ? ve(t) : void 0, i = {
1024
+ id: `cs_stub_${H++}`,
1025
+ name: n,
1026
+ source: r,
1027
+ state: "open",
1028
+ createdBy: y,
1029
+ createTime: v(),
1030
+ chains: [],
1031
+ dependsOnChangeSetIds: [],
1032
+ status: "",
1033
+ assigneeIds: [],
1034
+ plannedReleases: []
1035
+ };
1036
+ return C.unshift(i), k(i);
1037
+ },
1038
+ async getChangeSet(e) {
1039
+ return k(X(e));
1040
+ },
1041
+ async updateChangeSet({ id: e, updateMask: t, name: n, source: r }) {
1042
+ let a = Z(e);
1043
+ if (t.length === 0) throw new i("update_mask is required");
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
+ },
1047
+ async setChangeSetStatus({ id: t, expectedStatus: n, status: r }) {
1048
+ let a = Z(t);
1049
+ if (a.status !== n) throw new e(a.status);
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
+ fromStatus: a.status,
1054
+ toStatus: r,
1055
+ reason: `There is no transition from ${Ye(a.status)} to ${Ye(r)}.`,
1056
+ requiresPermission: !1
1057
+ });
1058
+ return a.status = r, k(a);
1059
+ },
1060
+ async setChangeSetAssignees({ id: e, assigneeIds: t }) {
1061
+ let n = X(e);
1062
+ if (new Set(t).size !== t.length) throw new i("each assignee is given once");
1063
+ if (t.length > 50) throw new i("at most 50 assignees");
1064
+ return n.assigneeIds = [...t], k(n);
1065
+ },
1066
+ async addDependency({ id: e, dependsOnId: t }) {
1067
+ let n = Z(e), r = X(t);
1068
+ if (r.state !== "open") throw new i(`Change Set ${t} is ${r.state}`);
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
+ },
1072
+ async removeDependency({ id: e, dependsOnId: 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
+ },
1077
+ async validatePublish({ id: e, reviewedHeads: t }) {
1078
+ let n = X(e);
1079
+ I(e);
1080
+ let r = je.get(e);
1081
+ if (r && p(r, t)) return {
1082
+ blockers: [],
1083
+ releases: Q(n),
1084
+ published: !0
1085
+ };
1086
+ if (n.state !== "open") throw new l(n.state);
1087
+ return {
1088
+ blockers: tt(n, t),
1089
+ releases: Q(n),
1090
+ published: !1
1091
+ };
1092
+ },
1093
+ async publish({ id: e, reviewedHeads: t }) {
1094
+ let n = X(e);
1095
+ I(e);
1096
+ let r = je.get(e);
1097
+ if (r && p(r, t)) return {
1098
+ changeSet: k(n),
1099
+ publishTime: n.closeTime ?? v(),
1100
+ releases: Q(n)
1101
+ };
1102
+ if (n.state !== "open") throw new l(n.state);
1103
+ let i = tt(n, t);
1104
+ if (i.length > 0) throw new ie(i);
1105
+ let a = Q(n);
1106
+ return n.state = "published", n.closeTime = v(), je.set(e, { ...t }), {
1107
+ changeSet: k(n),
1108
+ publishTime: n.closeTime,
1109
+ releases: a
1110
+ };
1111
+ },
1112
+ async updateFromMain({ id: e, chainId: t, idempotencyKey: n }) {
1113
+ return V(n, [
1114
+ "updateFromMain",
1115
+ e,
1116
+ t
1117
+ ], async () => {
1118
+ let n = Z(e);
1119
+ t || I(e);
1120
+ let r = t ? n.chains.filter((e) => e.id === t) : n.chains;
1121
+ if (t && r.length === 0) throw O("Chain", t);
1122
+ let i = structuredClone(ke[e] ?? []), a = [];
1123
+ for (let e of r) for (let t of e.branches) {
1124
+ let n = {
1125
+ branchId: t.id,
1126
+ contentId: e.contentId
1127
+ }, r = z[t.id];
1128
+ B.has(t.id) ? a.push(n) : r && (Ge(t.id, r), i.push(n));
1129
+ }
1130
+ return {
1131
+ changeSet: k(n),
1132
+ mergedBranchIds: [],
1133
+ conflicted: i,
1134
+ pending: a,
1135
+ endedBranchIds: []
1136
+ };
1137
+ });
1138
+ },
1139
+ async discardChangeSet(e) {
1140
+ let t = Z(e);
1141
+ return I(e), t.state = "discarded", t.closeTime = v(), t.chains = [], k(t);
1142
+ },
1143
+ async listCheckResults(e) {
1144
+ return et(X(e));
1145
+ },
1146
+ async recordCheckResult({ changeSetId: e, requiredCheckId: t, heads: n, outcome: r, note: a }) {
1147
+ let o = Z(e);
1148
+ if (r === "waived" && a.trim() === "") throw new i("a waived result needs a note saying why");
1149
+ if ([...a].length > 2e3) throw new i(`a note is at most ${s} characters`);
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
+ if (l.scope === "branch" && p.length !== 1) throw new i("a Branch-scope result names one head");
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
+ for (let e of p) {
1158
+ let t = d.find((t) => t.key === e);
1159
+ if (!t) throw new i(`heads name ${e}, which this Change Set doesn't hold`);
1160
+ if (t.revision !== n[e]) throw new f({
1161
+ contentId: t.contentId,
1162
+ branchId: t.branchless ? "" : t.key,
1163
+ expectedHeadId: n[e],
1164
+ currentHeadId: t.revision
1165
+ });
1166
+ }
1167
+ let m = {
1168
+ id: `cr_stub_${H++}`,
1169
+ requiredCheckId: t,
1170
+ heads: { ...n },
1171
+ outcome: r,
1172
+ note: a,
1173
+ recordedBy: y,
1174
+ recordTime: v()
1175
+ };
1176
+ return De.push({
1177
+ ...m,
1178
+ changeSetId: e
1179
+ }), structuredClone(m);
1180
+ },
1181
+ async listRequiredChecks() {
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([...P].sort(e));
1184
+ },
1185
+ async createRequiredCheck(e) {
1186
+ let n = be(e);
1187
+ if (P.some((e) => e.name === n.name)) throw new t(n.name);
1188
+ let r = {
1189
+ id: `rc_stub_${H++}`,
1190
+ ...n
1191
+ };
1192
+ return P.push(r), structuredClone(r);
1193
+ },
1194
+ async updateRequiredCheck({ id: e, ...n }) {
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
+ return Object.assign(i, r), structuredClone(i);
1199
+ },
1200
+ async deleteRequiredCheck({ id: e }) {
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
+ },
1204
+ async listRequiredCheckRecorders(e) {
1205
+ return structuredClone(Ve(e));
1206
+ },
1207
+ async grantRequiredCheckRecorder({ requiredCheckId: e, recorder: t }) {
1208
+ let n = Ve(e);
1209
+ if ("everyMember" in t) {
1210
+ R.set(e, {
1211
+ ...n,
1212
+ everyMember: !0
1213
+ });
1214
+ return;
1215
+ }
1216
+ if (!Te.includes(t.userId)) throw new i(`user ${t.userId} is not a member of the workspace`);
1217
+ R.set(e, {
1218
+ ...n,
1219
+ userIds: [.../* @__PURE__ */ new Set([...n.userIds, t.userId])].sort()
1220
+ });
1221
+ },
1222
+ async revokeRequiredCheckRecorder({ requiredCheckId: e, recorder: t }) {
1223
+ let n = Ve(e);
1224
+ R.set(e, "everyMember" in t ? {
1225
+ ...n,
1226
+ everyMember: !1
1227
+ } : {
1228
+ ...n,
1229
+ userIds: n.userIds.filter((e) => e !== t.userId)
1230
+ });
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
+ },
1248
+ async listCollections() {
1249
+ return [...w].sort(Re).map((e) => ({ ...e }));
1250
+ },
1251
+ async createCollection({ name: e, parentId: r = "", restricted: i = !1 }) {
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);
1255
+ let o = {
1256
+ id: `col_stub_${H++}`,
1257
+ name: a,
1258
+ parentId: r,
1259
+ restricted: i
1260
+ };
1261
+ return w.push(o), i && L.set(o.id, [{
1262
+ userId: y,
1263
+ level: "owner"
1264
+ }]), { ...o };
1265
+ },
1266
+ async renameCollection({ id: e, name: n }) {
1267
+ let r = E(n, "a Collection's name", 200), i = Y(e);
1268
+ if (ze(i.parentId, r, e)) throw new t(r);
1269
+ return i.name = r, { ...i };
1270
+ },
1271
+ async moveCollection({ id: e, parentId: n }) {
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("");
1275
+ return r.parentId = n, { ...r };
1276
+ },
1277
+ async removeCollection({ id: e }) {
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);
1280
+ let t = [];
1281
+ for (let n of T) n.collectionIds.includes(e) && (n.collectionIds = n.collectionIds.filter((t) => t !== e), t.push(n.id));
1282
+ return t;
1283
+ },
1284
+ async setCollectionRestricted({ id: e, restricted: t, acknowledgeDisclosure: r = !1 }) {
1285
+ if (t && F === "workspace") throw new n(D);
1286
+ let a = Y(e);
1287
+ if (a.restricted === t) return { ...a };
1288
+ if (!t && !r) throw new i(`unrestricting Collection ${e} discloses its Content to every viewer: confirm it with acknowledge_disclosure`);
1289
+ return a.restricted = t, t ? L.set(e, [{
1290
+ userId: y,
1291
+ level: "owner"
1292
+ }]) : L.delete(e), { ...a };
1293
+ },
1294
+ async listCollectionGrants(e) {
1295
+ return Be(e), structuredClone(L.get(e) ?? []).sort((e, t) => e.userId < t.userId ? -1 : +(e.userId > t.userId));
1296
+ },
1297
+ async grantCollectionAccess({ collectionId: e, userId: t, level: n }) {
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), {
1302
+ userId: t,
1303
+ level: n
1304
+ }]);
1305
+ },
1306
+ async revokeCollectionAccess({ collectionId: e, userId: t }) {
1307
+ Be(e), L.set(e, (L.get(e) ?? []).filter((e) => e.userId !== t || e.level === "owner"));
1308
+ },
1309
+ async listContents(e = {}) {
1310
+ let t = e.view ?? { kind: "main" }, n = (e.search ?? "").trim();
1311
+ if (n !== "" && t.kind === "in_force") throw new i("filter.search: Editor Search covers Main and open Branch heads, never Releases");
1312
+ if ([...n].length > 200) throw new i("filter.search is at most 200 characters");
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;
1316
+ return {
1317
+ contents: r.slice(o, o + a),
1318
+ nextPageToken: o + a < r.length ? String(o + a) : ""
1319
+ };
1320
+ },
1321
+ async createContent({ changeSetId: e, blueprintReleaseId: t, copyFrom: n }) {
1322
+ let r = Z(e), i = {}, a = t;
1323
+ if (n) {
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;
1327
+ }
1328
+ let o = j.find((e) => e.id === a);
1329
+ if (!o) throw new g(`Blueprint Release ${a} can't be loaded`, [{
1330
+ source: "contenthub",
1331
+ code: "release_not_found",
1332
+ path: ""
1333
+ }]);
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({
1337
+ id: c,
1338
+ blueprintId: o.blueprintId,
1339
+ blueprintReleaseId: a,
1340
+ collectionIds: [],
1341
+ branches: { [e]: {
1342
+ branchId: l,
1343
+ revisionId: u,
1344
+ data: i,
1345
+ revisionCreateTime: v()
1346
+ } }
1347
+ }), r.chains.push({
1348
+ id: `chain_stub_${s}`,
1349
+ contentId: c,
1350
+ born: !0,
1351
+ branches: [{
1352
+ id: l,
1353
+ position: 0,
1354
+ kind: "editorial",
1355
+ headRevisionId: u
1356
+ }]
1357
+ }), {
1358
+ id: c,
1359
+ blueprintId: o.blueprintId,
1360
+ blueprintReleaseId: a,
1361
+ revisionId: u,
1362
+ data: structuredClone(i),
1363
+ changeSetId: e,
1364
+ branchId: l,
1365
+ revisionCreateTime: v(),
1366
+ releaseId: ""
1367
+ };
1368
+ },
1369
+ async saveRevision({ idempotencyKey: e, ...t }) {
1370
+ if (!e) return He(t);
1371
+ let n = JSON.stringify(t), r = Me.get(e);
1372
+ if (r) {
1373
+ if (r.asked !== n) throw new i(`idempotency key ${e} names another save`);
1374
+ return structuredClone(r.content);
1375
+ }
1376
+ let a = await He(t);
1377
+ return Me.set(e, {
1378
+ asked: n,
1379
+ content: structuredClone(a)
1380
+ }), a;
1381
+ },
1382
+ async getContent({ id: e, changeSetId: t }) {
1383
+ let n = U(e), [r] = $(n, t ? {
1384
+ kind: "change_set",
1385
+ changeSetId: t
1386
+ } : { kind: "main" }, "");
1387
+ if (!r) throw O("Content", e);
1388
+ let i = N[n.blueprintReleaseId];
1389
+ return {
1390
+ content: r,
1391
+ blueprintRelease: i ? structuredClone(i) : void 0,
1392
+ attributes: W(n)
1393
+ };
1394
+ },
1395
+ async getTimeline(e) {
1396
+ let t = U(e), n = (e) => C.find((t) => t.id === e)?.state === "open";
1397
+ return structuredClone({
1398
+ entries: t.timeline ?? [],
1399
+ plannedReleases: (t.plannedReleases ?? []).filter((e) => n(e.changeSetId))
1400
+ });
1401
+ },
1402
+ async listRevisions({ target: e, pageSize: t, pageToken: n }) {
1403
+ let r;
1404
+ if ("contentId" in e) {
1405
+ let t = U(e.contentId);
1406
+ if (!t.main) throw O("Content", e.contentId);
1407
+ r = K(t);
1408
+ } else {
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);
1412
+ }
1413
+ let i = Math.min(t || 50, 200), a = n ? Number(n) : 0;
1414
+ return {
1415
+ revisions: r.slice(a, a + i).map(({ data: e, ...t }) => t),
1416
+ nextPageToken: a + i < r.length ? String(a + i) : ""
1417
+ };
1418
+ },
1419
+ async compare({ revisionId: e, base: t }) {
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;
1423
+ if (t.kind === "revision") o = t.revisionId;
1424
+ else if (t.kind === "main_head") {
1425
+ if (!n.main) throw new i("the Content is not published: it has no Main Branch");
1426
+ o = n.main.revisionId;
1427
+ } else o = r.find((e) => e.branchId === t.branchId)?.parentId ?? "";
1428
+ let s = r.find((e) => e.id === o);
1429
+ if (!s) throw O("Revision", o);
1430
+ let c = q(n, a.id) ?? {}, l = q(n, s.id) ?? {}, u = [];
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({
1432
+ path: `/${e}`,
1433
+ kind: "changed",
1434
+ before: l[e],
1435
+ after: c[e]
1436
+ }) : u.push({
1437
+ path: `/${e}`,
1438
+ kind: "removed",
1439
+ before: l[e]
1440
+ }) : u.push({
1441
+ path: `/${e}`,
1442
+ kind: "added",
1443
+ after: c[e]
1444
+ });
1445
+ let d = ({ data: e, ...t }) => t;
1446
+ return {
1447
+ base: d(s),
1448
+ revision: d(a),
1449
+ changes: u
1450
+ };
1451
+ },
1452
+ async listReferences({ contentId: e, revisionId: t }) {
1453
+ return (U(e).edges ?? []).filter((e) => e.sourceRevisionId === t).map((e) => ({ ...e }));
1454
+ },
1455
+ async listReferrers({ contentId: e, includeOpenChangeSets: t, pageSize: n, pageToken: r }) {
1456
+ U(e);
1457
+ let i = (e) => {
1458
+ let t = Math.min(n || 100, 1e3), i = r ? Number(r) : 0;
1459
+ return {
1460
+ referrers: e.slice(i, i + t),
1461
+ nextPageToken: i + t < e.length ? String(i + t) : ""
1462
+ };
1463
+ }, a = T.flatMap((t) => (t.edges ?? []).filter((n) => n.targetContentId === e && t.inForce?.revisionId === n.sourceRevisionId).map((e) => ({
1464
+ edge: { ...e },
1465
+ releaseId: t.inForce?.releaseId ?? "",
1466
+ changeSetId: "",
1467
+ branchId: ""
1468
+ })));
1469
+ if (!t) return i(a);
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) => ({
1471
+ edge: { ...e },
1472
+ releaseId: "",
1473
+ changeSetId: n,
1474
+ branchId: r.branchId
1475
+ })) : []));
1476
+ return i([...a, ...o]);
1477
+ },
1478
+ async listOutdatedPins(e) {
1479
+ let t;
1480
+ if ("revisionId" in e) t = e.revisionId;
1481
+ else {
1482
+ for (let n of T) {
1483
+ let r = Object.values(n.branches).find((t) => t.branchId === e.branchId);
1484
+ r && (t = r.revisionId);
1485
+ }
1486
+ if (!t) throw O("Branch", e.branchId);
1487
+ }
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 ?? "";
1490
+ return t === e.pinReleaseId ? [] : [{
1491
+ edge: { ...e },
1492
+ supersededByReleaseId: t,
1493
+ inForceReleaseId: t
1494
+ }];
1495
+ });
1496
+ },
1497
+ async setContentCollections({ contentId: e, collectionIds: t }) {
1498
+ let n = U(e), r = [...new Set(t)];
1499
+ if (r.length > 100) throw new i("at most 100 Collections");
1500
+ for (let e of r) if (!w.some((t) => t.id === e)) throw O("Collection", e);
1501
+ return n.collectionIds = r.sort(), [...n.collectionIds];
1502
+ },
1503
+ async setContentAssignees({ contentId: e, assigneeIds: t }) {
1504
+ let n = U(e);
1505
+ if (new Set(t).size !== t.length) throw new i("each assignee is given once");
1506
+ if (t.length > 50) throw new i("at most 50 assignees");
1507
+ return n.assigneeIds = [...t], W(n);
1508
+ },
1509
+ async blockContent({ contentId: e, blockReasonId: t, allowedUserIds: n }) {
1510
+ let r = U(e);
1511
+ if (!S.some((e) => e.id === t)) throw O("Block Reason", t);
1512
+ if (new Set(n).size !== n.length) throw new i("each allowed user is given once");
1513
+ return r.block = {
1514
+ blockReasonId: t,
1515
+ allowedUserIds: [...n],
1516
+ blockedBy: y,
1517
+ blockTime: v()
1518
+ }, W(r);
1519
+ },
1520
+ async unblockContent(e) {
1521
+ let t = U(e);
1522
+ return t.block = void 0, W(t);
1523
+ },
1524
+ async archiveContent(e) {
1525
+ let t = U(e);
1526
+ if (t.archiveTime) return W(t);
1527
+ if (!t.main) throw new i(`Content ${e} is not published: discard its Change Set instead of archiving it`);
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);
1530
+ },
1531
+ async unarchiveContent(e) {
1532
+ let t = U(e);
1533
+ return t.archiveTime = void 0, W(t);
1534
+ },
1535
+ async startEditing({ contentId: e, changeSetId: t, effectiveOn: n = "", changeSetName: r = "" }) {
1536
+ let a = U(e);
1537
+ if (!a.main) throw new i(`Content ${e} is not published`);
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");
1540
+ let o;
1541
+ if (t) {
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`);
1543
+ } else {
1544
+ let t = Object.values(a.main.data).filter((e) => typeof e == "string").slice(0, 2).join(" ");
1545
+ o = {
1546
+ id: `cs_stub_${H++}`,
1547
+ name: r.trim() ? E(r, "change_set_name", 200) : t || e,
1548
+ state: "open",
1549
+ createdBy: y,
1550
+ createTime: v(),
1551
+ chains: [],
1552
+ dependsOnChangeSetIds: [],
1553
+ status: "",
1554
+ assigneeIds: [],
1555
+ plannedReleases: []
1556
+ }, C.unshift(o);
1557
+ }
1558
+ let s = H++, c = `br_stub_${s}`, l = {
1559
+ ...structuredClone(a.main),
1560
+ branchId: c
1561
+ };
1562
+ a.branches[o.id] = l, o.chains.push({
1563
+ id: `chain_stub_${s}`,
1564
+ contentId: e,
1565
+ born: !1,
1566
+ branches: [{
1567
+ id: c,
1568
+ position: 0,
1569
+ kind: "editorial",
1570
+ headRevisionId: l.revisionId
1571
+ }]
1572
+ });
1573
+ let [u] = $(a, {
1574
+ kind: "change_set",
1575
+ changeSetId: o.id
1576
+ }, "");
1577
+ return {
1578
+ changeSet: k(o),
1579
+ content: u
1580
+ };
1581
+ },
1582
+ async previewChain({ changeSetId: e, contentId: t, effectiveOn: n, validityPeriod: r }) {
1583
+ Z(e);
1584
+ let a = U(t);
1585
+ if (!a.main) throw new i(`Content ${t} is not published`);
1586
+ if (!G(a)) throw new i("undated Content's Chain takes no date");
1587
+ if (!h.test(n)) throw new i("effective_on is YYYY-MM-DD");
1588
+ let o = a.timeline ?? [], s = o.find((e) => e.validityPeriod && e.validityPeriod.firstDay <= n && (e.validityPeriod.lastDay === "" || n <= e.validityPeriod.lastDay));
1589
+ return {
1590
+ forkReleaseId: s?.releaseId ?? "",
1591
+ carryForwardReleaseIds: o.filter((e) => e.validityPeriod && e.validityPeriod.firstDay > n).map((e) => e.releaseId),
1592
+ mergesMain: !1,
1593
+ cutIntoReleaseIds: s ? [s.releaseId] : [],
1594
+ coveredReleaseIds: r && r.lastDay !== "" ? o.filter((e) => e.validityPeriod && e.validityPeriod.lastDay !== "" && r.firstDay <= e.validityPeriod.firstDay && e.validityPeriod.lastDay <= r.lastDay).map((e) => e.releaseId) : []
1595
+ };
1596
+ },
1597
+ async planRepeal({ changeSetId: e, contentId: t, lastDay: n }) {
1598
+ Z(e);
1599
+ let r = U(t);
1600
+ if (J(r), !G(r)) throw new i("a Repeal is for Dated Content");
1601
+ if (!h.test(n)) throw new i("last_day is YYYY-MM-DD");
1602
+ return nt(r, e, {
1603
+ kind: "repeal",
1604
+ validityPeriod: {
1605
+ firstDay: m(r.timeline ?? [], n)?.validityPeriod?.firstDay ?? n,
1606
+ lastDay: n
1607
+ }
1608
+ });
1609
+ },
1610
+ async planWithdrawal({ changeSetId: e, contentId: t }) {
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" });
1615
+ },
1616
+ async planRelease({ idempotencyKey: e, ...t }) {
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");
1620
+ if (s.plannedReleases.some((e) => e.branchId === n)) throw new i(`Branch ${n} is planned already`);
1621
+ let d = {
1622
+ id: `rls_stub_${H++}`,
1623
+ contentId: c.contentId,
1624
+ kind: "revision",
1625
+ branchId: n,
1626
+ revisionId: "",
1627
+ validityPeriod: r ? { ...r } : void 0,
1628
+ releaseSpec: structuredClone(a ?? {}),
1629
+ supersedesReleaseIds: [...o ?? []],
1630
+ proposed: !1,
1631
+ proposedForReleaseId: "",
1632
+ splitFromReleaseId: "",
1633
+ withheld: !1
1634
+ };
1635
+ return qe(u, d), s.plannedReleases.push(d), Je(s, u), structuredClone(d);
1636
+ });
1637
+ },
1638
+ async updatePlannedRelease({ idempotencyKey: e, ...t }) {
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);
1642
+ let l = s.plannedReleases[c];
1643
+ if (l.proposed) throw new i("a proposal is derived from the plans and can't be set");
1644
+ let u = U(l.contentId);
1645
+ J(u);
1646
+ let d = {
1647
+ ...structuredClone(l),
1648
+ ...r ? { validityPeriod: { ...r } } : {},
1649
+ ...a ? { releaseSpec: structuredClone(a) } : {},
1650
+ ...o ? { supersedesReleaseIds: [...o] } : {}
1651
+ };
1652
+ return qe(u, d), s.plannedReleases[c] = d, Je(s, u), structuredClone(d);
1653
+ });
1654
+ },
1655
+ async appendBranch({ idempotencyKey: e, ...t }) {
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");
1661
+ let c = o.branches.filter((e) => e.kind === "editorial").at(-1);
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");
1663
+ let l = o.branches.at(-1), u = `br_stub_${H++}`;
1664
+ o.branches.push({
1665
+ id: u,
1666
+ position: o.branches.length,
1667
+ kind: "editorial",
1668
+ headRevisionId: l?.headRevisionId ?? "",
1669
+ effectiveOn: r
1670
+ });
1671
+ let d = s.branches[e];
1672
+ return d && (s.branches[e] = {
1673
+ ...d,
1674
+ branchId: u
1675
+ }), {
1676
+ changeSet: k(a),
1677
+ branchId: u
1678
+ };
1679
+ });
1680
+ },
1681
+ async dropChain({ idempotencyKey: e, ...t }) {
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);
1685
+ if (a.born) throw new i("the Chain of Content born in the Change Set can't be dropped: discard the Change Set");
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);
1688
+ });
1689
+ },
1690
+ async getPendingMerge(e) {
1691
+ let t = B.get(e);
1692
+ return t ? structuredClone(t) : null;
1693
+ },
1694
+ async resolveMerge({ idempotencyKey: e, ...t }) {
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);
1697
+ if (!l) throw new i(`Branch ${n} has no Pending Merge`);
1698
+ if (s.headRevisionId !== r) throw new f({
1699
+ contentId: c.id,
1700
+ branchId: n,
1701
+ expectedHeadId: r,
1702
+ currentHeadId: s.headRevisionId
1703
+ });
1704
+ let u = a.map((e) => e.path), d = l.fields.map((e) => e.path);
1705
+ if (new Set(u).size !== u.length || u.some((e) => !d.includes(e)) || d.some((e) => !u.includes(e))) throw new i("decide every field the Pending Merge lists, once");
1706
+ let p = structuredClone(l.merged);
1707
+ for (let e of a) {
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(/^\//, "");
1709
+ n === void 0 ? delete p[r] : p[r] = structuredClone(n);
1710
+ }
1711
+ let m = Ue({
1712
+ changeSetId: e,
1713
+ chain: o,
1714
+ branch: s,
1715
+ c,
1716
+ data: p,
1717
+ cause: "resolve",
1718
+ secondParentId: l.theirsRevisionId
1719
+ });
1720
+ return Ke(n), m;
1721
+ });
1722
+ },
1723
+ async abortMerge({ idempotencyKey: e, ...t }) {
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);
1727
+ });
1728
+ },
1729
+ async previewInForce({ contentId: e, changeSetId: t, validOn: n }) {
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));
1731
+ if (c) {
1732
+ let e = c.branchId ? o?.branches.find((e) => e.id === c.branchId)?.headRevisionId ?? "" : c.revisionId;
1733
+ return {
1734
+ releaseId: c.id,
1735
+ revisionId: e,
1736
+ planned: !0,
1737
+ withheld: !1,
1738
+ validityPeriod: c.validityPeriod ? { ...c.validityPeriod } : void 0,
1739
+ data: structuredClone(q(i, e) ?? {})
1740
+ };
1741
+ }
1742
+ let l = m(i.timeline ?? [], a);
1743
+ return l ? {
1744
+ releaseId: l.releaseId,
1745
+ revisionId: l.revisionId,
1746
+ planned: !1,
1747
+ withheld: !1,
1748
+ validityPeriod: l.validityPeriod ? { ...l.validityPeriod } : void 0,
1749
+ data: structuredClone(q(i, l.revisionId) ?? {})
1750
+ } : null;
1751
+ }
1752
+ };
1753
+ function nt(e, t, n) {
1754
+ let r = {
1755
+ id: `rls_stub_${H++}`,
1756
+ contentId: e.id,
1757
+ branchId: "",
1758
+ revisionId: e.inForce?.revisionId ?? e.main?.revisionId ?? "",
1759
+ supersedesReleaseIds: [],
1760
+ proposed: !1,
1761
+ proposedForReleaseId: "",
1762
+ splitFromReleaseId: "",
1763
+ withheld: !1,
1764
+ ...n
1765
+ };
1766
+ return e.plannedReleases = [...e.plannedReleases ?? [], {
1767
+ changeSetId: t,
1768
+ plannedRelease: r
1769
+ }], structuredClone({
1770
+ plannedRelease: r,
1771
+ gapReferrers: Fe(e.id)
1772
+ });
1773
+ }
1774
+ function $(e, t, n) {
1775
+ let r = (t, n) => ({
1776
+ id: e.id,
1777
+ blueprintId: e.blueprintId,
1778
+ blueprintReleaseId: e.blueprintReleaseId,
1779
+ revisionId: t.revisionId,
1780
+ data: structuredClone(t.data),
1781
+ changeSetId: n.changeSetId ?? "",
1782
+ branchId: n.branchId ?? "",
1783
+ revisionCreateTime: t.revisionCreateTime,
1784
+ releaseId: n.releaseId ?? ""
1785
+ });
1786
+ if (t.kind === "in_force") return e.inForce ? [r(e.inForce, { releaseId: e.inForce.releaseId })] : [];
1787
+ if (t.kind === "change_set") {
1788
+ let i = e.branches[t.changeSetId];
1789
+ return !i || n && !M(i.data, n) ? [] : [r(i, {
1790
+ changeSetId: t.changeSetId,
1791
+ branchId: i.branchId
1792
+ })];
1793
+ }
1794
+ if (!n) return e.main ? [r(e.main, {})] : [];
1795
+ let i = [];
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, {
1798
+ changeSetId: t,
1799
+ branchId: a.branchId
1800
+ }));
1801
+ return i;
1802
+ }
1803
+ }
1804
+ function M(e, t) {
1805
+ let n = (e) => e.toLocaleLowerCase().replace(/\s+/g, " "), r = n(t);
1806
+ return Object.values(e).some((e) => typeof e == "string" && n(e).includes(r));
1807
+ }
1808
+ //#endregion
1809
+ //#region src/testing/stub-status-source.ts
1810
+ function N(e = se()) {
1811
+ return { async listChangeSetStatuses() {
1812
+ return e.map((e) => ({ ...e }));
1813
+ } };
1814
+ }
1815
+ //#endregion
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 };
1817
+
1818
+ //# sourceMappingURL=testing.js.map