@coldtea/pr-lens-schema 0.1.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.
Files changed (93) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +150 -0
  3. package/dist/apply.d.ts +42 -0
  4. package/dist/apply.d.ts.map +1 -0
  5. package/dist/apply.js +315 -0
  6. package/dist/apply.js.map +1 -0
  7. package/dist/config.d.ts +58 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +61 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/errors.d.ts +24 -0
  12. package/dist/errors.d.ts.map +1 -0
  13. package/dist/errors.js +12 -0
  14. package/dist/errors.js.map +1 -0
  15. package/dist/examples/baseline.d.ts +18 -0
  16. package/dist/examples/baseline.d.ts.map +1 -0
  17. package/dist/examples/baseline.js +433 -0
  18. package/dist/examples/baseline.js.map +1 -0
  19. package/dist/examples/index.d.ts +1194 -0
  20. package/dist/examples/index.d.ts.map +1 -0
  21. package/dist/examples/index.js +20 -0
  22. package/dist/examples/index.js.map +1 -0
  23. package/dist/examples/minimal.d.ts +4 -0
  24. package/dist/examples/minimal.d.ts.map +1 -0
  25. package/dist/examples/minimal.js +25 -0
  26. package/dist/examples/minimal.js.map +1 -0
  27. package/dist/examples/postmark-refactor.d.ts +16 -0
  28. package/dist/examples/postmark-refactor.d.ts.map +1 -0
  29. package/dist/examples/postmark-refactor.js +468 -0
  30. package/dist/examples/postmark-refactor.js.map +1 -0
  31. package/dist/graph.d.ts +568 -0
  32. package/dist/graph.d.ts.map +1 -0
  33. package/dist/graph.js +266 -0
  34. package/dist/graph.js.map +1 -0
  35. package/dist/index.d.ts +12 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +12 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/integrity.d.ts +20 -0
  40. package/dist/integrity.d.ts.map +1 -0
  41. package/dist/integrity.js +167 -0
  42. package/dist/integrity.js.map +1 -0
  43. package/dist/manifest.d.ts +65 -0
  44. package/dist/manifest.d.ts.map +1 -0
  45. package/dist/manifest.js +60 -0
  46. package/dist/manifest.js.map +1 -0
  47. package/dist/patch.d.ts +824 -0
  48. package/dist/patch.d.ts.map +1 -0
  49. package/dist/patch.js +84 -0
  50. package/dist/patch.js.map +1 -0
  51. package/dist/primitives.d.ts +92 -0
  52. package/dist/primitives.d.ts.map +1 -0
  53. package/dist/primitives.js +120 -0
  54. package/dist/primitives.js.map +1 -0
  55. package/dist/utils.d.ts +6 -0
  56. package/dist/utils.d.ts.map +1 -0
  57. package/dist/utils.js +8 -0
  58. package/dist/utils.js.map +1 -0
  59. package/dist/validate.d.ts +18 -0
  60. package/dist/validate.d.ts.map +1 -0
  61. package/dist/validate.js +95 -0
  62. package/dist/validate.js.map +1 -0
  63. package/dist/version.d.ts +21 -0
  64. package/dist/version.d.ts.map +1 -0
  65. package/dist/version.js +24 -0
  66. package/dist/version.js.map +1 -0
  67. package/examples/broadcast-baseline.graph.json +289 -0
  68. package/examples/broadcast-baseline.patch.json +321 -0
  69. package/examples/minimal.graph.json +45 -0
  70. package/examples/postmark-refactor.graph.json +580 -0
  71. package/examples/postmark-refactor.render-manifest.json +67 -0
  72. package/examples/pr-lens.config.json +32 -0
  73. package/json-schema/config.schema.json +153 -0
  74. package/json-schema/graph-doc.schema.json +1032 -0
  75. package/json-schema/patch-doc.schema.json +1383 -0
  76. package/json-schema/render-manifest.schema.json +183 -0
  77. package/package.json +66 -0
  78. package/src/apply.ts +399 -0
  79. package/src/config.ts +69 -0
  80. package/src/errors.ts +34 -0
  81. package/src/examples/baseline.ts +437 -0
  82. package/src/examples/index.ts +25 -0
  83. package/src/examples/minimal.ts +26 -0
  84. package/src/examples/postmark-refactor.ts +480 -0
  85. package/src/graph.ts +331 -0
  86. package/src/index.ts +82 -0
  87. package/src/integrity.ts +216 -0
  88. package/src/manifest.ts +64 -0
  89. package/src/patch.ts +100 -0
  90. package/src/primitives.ts +146 -0
  91. package/src/utils.ts +7 -0
  92. package/src/validate.ts +132 -0
  93. package/src/version.ts +31 -0
package/dist/config.js ADDED
@@ -0,0 +1,61 @@
1
+ import { z } from "zod";
2
+ import { Id, Label, Lens, SchemaVersionField } from "./primitives.js";
3
+ /**
4
+ * Which inferred elements a correction applies to.
5
+ *
6
+ * `id:<node-id>` addresses one node exactly. Anything else is a path glob
7
+ * matched against the node's file paths, so a correction survives the model
8
+ * renaming the node between runs.
9
+ */
10
+ export const Selector = z
11
+ .string()
12
+ .min(1)
13
+ .max(256)
14
+ .describe("`id:<node-id>` for an exact node, otherwise a repository-relative path glob.");
15
+ /**
16
+ * Human corrections to the inferred map. They are an overlay: inference never
17
+ * writes back here, and every run re-applies the overlay on top of fresh
18
+ * inference, so a correction keeps holding as the code moves.
19
+ */
20
+ export const MapCorrections = z
21
+ .strictObject({
22
+ rename: z
23
+ .array(z.strictObject({ match: Selector, to: Label }))
24
+ .max(128)
25
+ .default([])
26
+ .describe("Replace the inferred label."),
27
+ exclude: z
28
+ .array(Selector)
29
+ .max(128)
30
+ .default([])
31
+ .describe("Drop matching nodes, and any edge or flow step that touched them."),
32
+ lane: z
33
+ .array(z.strictObject({ match: Selector, lane: Id }))
34
+ .max(128)
35
+ .default([])
36
+ .describe("Move matching nodes into a lane."),
37
+ group: z
38
+ .array(z.strictObject({ match: Selector, group: Id }))
39
+ .max(128)
40
+ .default([])
41
+ .describe("Cluster matching nodes under a sub-group within their lane."),
42
+ })
43
+ .describe("Overlay applied over inference, never mutated by it.");
44
+ /** The `.github/pr-lens.yml` a repository may commit. Every field is optional. */
45
+ export const Config = z
46
+ .strictObject({
47
+ schemaVersion: SchemaVersionField.describe("Declared explicitly so a repository's corrections keep their meaning across contract versions."),
48
+ lenses: z
49
+ .array(Lens)
50
+ .min(1)
51
+ .max(8)
52
+ .default(["architecture", "data-flow"])
53
+ .describe("Lenses to render for this repository."),
54
+ map: MapCorrections.default({ rename: [], exclude: [], lane: [], group: [] }),
55
+ branding: z
56
+ .boolean()
57
+ .default(true)
58
+ .describe("Show the 'Rendered by PR Lens' footer on comments."),
59
+ })
60
+ .describe("Repository configuration for PR Lens.");
61
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEtE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC;KACtB,MAAM,EAAE;KACR,GAAG,CAAC,CAAC,CAAC;KACN,GAAG,CAAC,GAAG,CAAC;KACR,QAAQ,CAAC,8EAA8E,CAAC,CAAC;AAG5F;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC;KAC5B,YAAY,CAAC;IACZ,MAAM,EAAE,CAAC;SACN,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;SACrD,GAAG,CAAC,GAAG,CAAC;SACR,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,6BAA6B,CAAC;IAC1C,OAAO,EAAE,CAAC;SACP,KAAK,CAAC,QAAQ,CAAC;SACf,GAAG,CAAC,GAAG,CAAC;SACR,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,mEAAmE,CAAC;IAChF,IAAI,EAAE,CAAC;SACJ,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;SACpD,GAAG,CAAC,GAAG,CAAC;SACR,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,kCAAkC,CAAC;IAC/C,KAAK,EAAE,CAAC;SACL,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;SACrD,GAAG,CAAC,GAAG,CAAC;SACR,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,6DAA6D,CAAC;CAC3E,CAAC;KACD,QAAQ,CAAC,sDAAsD,CAAC,CAAC;AAGpE,kFAAkF;AAClF,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC;KACpB,YAAY,CAAC;IACZ,aAAa,EAAE,kBAAkB,CAAC,QAAQ,CACxC,gGAAgG,CACjG;IACD,MAAM,EAAE,CAAC;SACN,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,CAAC,CAAC;SACN,OAAO,CAAC,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;SACtC,QAAQ,CAAC,uCAAuC,CAAC;IACpD,GAAG,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC7E,QAAQ,EAAE,CAAC;SACR,OAAO,EAAE;SACT,OAAO,CAAC,IAAI,CAAC;SACb,QAAQ,CAAC,oDAAoD,CAAC;CAClE,CAAC;KACD,QAAQ,CAAC,uCAAuC,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Codes are the stable half of a failure; messages are not. Callers switch on
3
+ * the code, and every code stays meaningful across contract versions.
4
+ */
5
+ export type SchemaErrorCode = "INVALID_DOCUMENT" | "BROKEN_REFERENCE" | "DUPLICATE_ID" | "UNSUPPORTED_SCHEMA_VERSION" | "PATCH_CONFLICT" | "NOT_A_SNAPSHOT";
6
+ export type SchemaIssue = {
7
+ code: SchemaErrorCode;
8
+ path: string;
9
+ message: string;
10
+ };
11
+ export declare class PrLensSchemaError extends Error {
12
+ readonly code: SchemaErrorCode;
13
+ readonly issues: readonly SchemaIssue[];
14
+ constructor(code: SchemaErrorCode, message: string, issues?: readonly SchemaIssue[]);
15
+ }
16
+ export type Parsed<T> = {
17
+ ok: true;
18
+ value: T;
19
+ } | {
20
+ ok: false;
21
+ error: PrLensSchemaError;
22
+ };
23
+ export declare const formatIssues: (issues: readonly SchemaIssue[]) => string;
24
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,eAAe,GACvB,kBAAkB,GAClB,kBAAkB,GAClB,cAAc,GACd,4BAA4B,GAC5B,gBAAgB,GAChB,gBAAgB,CAAC;AAErB,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IAExC,YAAY,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,SAAS,WAAW,EAAO,EAKtF;CACF;AAED,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAEzF,eAAO,MAAM,YAAY,WAAY,SAAS,WAAW,EAAE,KAAG,MACqC,CAAC"}
package/dist/errors.js ADDED
@@ -0,0 +1,12 @@
1
+ export class PrLensSchemaError extends Error {
2
+ code;
3
+ issues;
4
+ constructor(code, message, issues = []) {
5
+ super(message);
6
+ this.name = "PrLensSchemaError";
7
+ this.code = code;
8
+ this.issues = issues;
9
+ }
10
+ }
11
+ export const formatIssues = (issues) => issues.map((issue) => ` ${issue.path || "<root>"}: ${issue.message} [${issue.code}]`).join("\n");
12
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAkBA,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACjC,IAAI,CAAkB;IACtB,MAAM,CAAyB;IAExC,YAAY,IAAqB,EAAE,OAAe,EAAE,MAAM,GAA2B,EAAE;QACrF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAID,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAA8B,EAAU,EAAE,CACrE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,QAAQ,KAAK,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { GraphDocInput } from "../graph.js";
2
+ import type { PatchDocInput } from "../patch.js";
3
+ /**
4
+ * The stored baseline map for the broadcast subsystem as `main` stood before
5
+ * the refactor. A map describes a system rather than a change, so everything
6
+ * in it is `unchanged` and its provenance names the single commit it reflects.
7
+ */
8
+ export declare const broadcastBaselineGraphInput: GraphDocInput;
9
+ /**
10
+ * The refactor folded back into the baseline map, which is what happens once
11
+ * the pull request merges: the batch path joins the map as ordinary
12
+ * `unchanged` structure, and the single-send path leaves it.
13
+ *
14
+ * The old flow is removed before its participants are, so the removal is a
15
+ * deliberate replacement rather than a side effect of cascade.
16
+ */
17
+ export declare const broadcastBaselinePatchInput: PatchDocInput;
18
+ //# sourceMappingURL=baseline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseline.d.ts","sourceRoot":"","sources":["../../src/examples/baseline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAMjD;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,EAAE,aAuLzC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,2BAA2B,EAAE,aAuOzC,CAAC"}
@@ -0,0 +1,433 @@
1
+ import { SCHEMA_VERSION } from "../version.js";
2
+ const BASE_SHA = "3f5c1ab9d24e7f08c6b1a5d3e9074c2b8a6f1d40";
3
+ const HEAD_SHA = "b71e0d4c8a92f5361de7c0b4a8f2593d6c1e8a77";
4
+ /**
5
+ * The stored baseline map for the broadcast subsystem as `main` stood before
6
+ * the refactor. A map describes a system rather than a change, so everything
7
+ * in it is `unchanged` and its provenance names the single commit it reflects.
8
+ */
9
+ export const broadcastBaselineGraphInput = {
10
+ schemaVersion: SCHEMA_VERSION,
11
+ kind: "graph",
12
+ id: "bestregards-broadcast-baseline",
13
+ generatedAt: "2026-08-12T09:02:00.000Z",
14
+ title: "Broadcast sending",
15
+ summary: "How a broadcast reaches its recipients: queued from the web app, sent one message at a time by a Firestore trigger.",
16
+ lenses: ["architecture", "data-flow"],
17
+ provenance: {
18
+ repo: { owner: "ohansemmanuel", name: "bestregards", host: "github.com" },
19
+ base: { sha: BASE_SHA, ref: "main" },
20
+ head: { sha: BASE_SHA, ref: "main" },
21
+ generator: { name: "pr-lens-examples", version: "0.1.0" },
22
+ },
23
+ lanes: [
24
+ { id: "web", label: "Next.js", subtitle: "Vercel", order: 0 },
25
+ { id: "functions", label: "Cloud Functions", subtitle: "Firebase", order: 1 },
26
+ { id: "external", label: "External", subtitle: "Postmark", order: 2 },
27
+ ],
28
+ nodes: [
29
+ {
30
+ id: "broadcast-composer",
31
+ label: "Broadcast composer",
32
+ kind: "ui",
33
+ delta: "unchanged",
34
+ lane: "web",
35
+ subtitle: "app/broadcasts/new",
36
+ files: [{ path: "app/broadcasts/new/page.tsx" }],
37
+ },
38
+ {
39
+ id: "queue-route",
40
+ label: "POST /api/broadcasts/queue",
41
+ kind: "route",
42
+ delta: "unchanged",
43
+ lane: "web",
44
+ files: [{ path: "app/api/broadcasts/queue/route.ts" }],
45
+ },
46
+ {
47
+ id: "broadcast-queue",
48
+ label: "broadcastQueue",
49
+ kind: "datastore",
50
+ delta: "unchanged",
51
+ lane: "functions",
52
+ subtitle: "Firestore collection",
53
+ files: [{ path: "functions/src/broadcast/schema.ts" }],
54
+ },
55
+ {
56
+ id: "process-broadcast",
57
+ label: "processBroadcast",
58
+ kind: "function",
59
+ delta: "unchanged",
60
+ lane: "functions",
61
+ subtitle: "onWrite trigger",
62
+ summary: "Walks the recipient list and sends one message at a time.",
63
+ files: [{ path: "functions/src/broadcast/processBroadcast.ts" }],
64
+ },
65
+ {
66
+ id: "send-single-email",
67
+ label: "sendSingleEmail",
68
+ kind: "function",
69
+ delta: "unchanged",
70
+ lane: "functions",
71
+ files: [{ path: "functions/src/broadcast/sendSingleEmail.ts" }],
72
+ },
73
+ {
74
+ id: "postmark",
75
+ label: "Postmark",
76
+ kind: "external",
77
+ delta: "unchanged",
78
+ lane: "external",
79
+ subtitle: "Email API",
80
+ },
81
+ ],
82
+ edges: [
83
+ {
84
+ id: "composer-to-queue",
85
+ from: "broadcast-composer",
86
+ to: "queue-route",
87
+ kind: "http",
88
+ delta: "unchanged",
89
+ label: "send broadcast",
90
+ },
91
+ {
92
+ id: "queue-to-firestore",
93
+ from: "queue-route",
94
+ to: "broadcast-queue",
95
+ kind: "data",
96
+ delta: "unchanged",
97
+ label: "enqueue job",
98
+ },
99
+ {
100
+ id: "firestore-to-process",
101
+ from: "broadcast-queue",
102
+ to: "process-broadcast",
103
+ kind: "event",
104
+ delta: "unchanged",
105
+ label: "onWrite",
106
+ },
107
+ {
108
+ id: "process-to-single",
109
+ from: "process-broadcast",
110
+ to: "send-single-email",
111
+ kind: "call",
112
+ delta: "unchanged",
113
+ label: "per recipient",
114
+ },
115
+ {
116
+ id: "single-to-postmark",
117
+ from: "send-single-email",
118
+ to: "postmark",
119
+ kind: "http",
120
+ delta: "unchanged",
121
+ label: "POST /email · 1 msg/call",
122
+ },
123
+ ],
124
+ flows: [
125
+ {
126
+ id: "send-pipeline",
127
+ title: "Sending a broadcast",
128
+ delta: "unchanged",
129
+ participants: [
130
+ { node: "queue-route", label: "queue route" },
131
+ { node: "broadcast-queue", label: "Firestore" },
132
+ { node: "process-broadcast", label: "processBroadcast" },
133
+ { node: "postmark", label: "Postmark" },
134
+ ],
135
+ messages: [
136
+ {
137
+ id: "enqueue",
138
+ from: "queue-route",
139
+ to: "broadcast-queue",
140
+ label: "enqueue broadcast job",
141
+ kind: "async",
142
+ delta: "unchanged",
143
+ },
144
+ {
145
+ id: "trigger",
146
+ from: "broadcast-queue",
147
+ to: "process-broadcast",
148
+ label: "onWrite trigger",
149
+ kind: "async",
150
+ delta: "unchanged",
151
+ },
152
+ {
153
+ id: "single-post",
154
+ from: "process-broadcast",
155
+ to: "postmark",
156
+ label: "POST /email",
157
+ kind: "sync",
158
+ delta: "unchanged",
159
+ repeat: 2000,
160
+ note: "One request per recipient.",
161
+ },
162
+ {
163
+ id: "single-result",
164
+ from: "postmark",
165
+ to: "process-broadcast",
166
+ label: "message id",
167
+ kind: "return",
168
+ delta: "unchanged",
169
+ },
170
+ {
171
+ id: "write-result",
172
+ from: "process-broadcast",
173
+ to: "broadcast-queue",
174
+ label: "write result",
175
+ kind: "async",
176
+ delta: "unchanged",
177
+ repeat: 2000,
178
+ },
179
+ ],
180
+ },
181
+ ],
182
+ views: [
183
+ {
184
+ id: "overview",
185
+ title: "Broadcast sending",
186
+ lens: "architecture",
187
+ defaultOpen: true,
188
+ scope: { kind: "all" },
189
+ },
190
+ ],
191
+ layout: { direction: "right", laneOrder: ["web", "functions", "external"] },
192
+ };
193
+ /**
194
+ * The refactor folded back into the baseline map, which is what happens once
195
+ * the pull request merges: the batch path joins the map as ordinary
196
+ * `unchanged` structure, and the single-send path leaves it.
197
+ *
198
+ * The old flow is removed before its participants are, so the removal is a
199
+ * deliberate replacement rather than a side effect of cascade.
200
+ */
201
+ export const broadcastBaselinePatchInput = {
202
+ schemaVersion: SCHEMA_VERSION,
203
+ kind: "patch",
204
+ generatedAt: "2026-08-19T18:31:00.000Z",
205
+ summary: "Fold the batch send path into the baseline map and retire the single-send path.",
206
+ target: {
207
+ graphId: "bestregards-broadcast-baseline",
208
+ fromSha: BASE_SHA,
209
+ toSha: HEAD_SHA,
210
+ },
211
+ ops: [
212
+ {
213
+ op: "add_node",
214
+ node: {
215
+ id: "send-broadcast-bulk",
216
+ label: "sendBroadcastBulk",
217
+ kind: "function",
218
+ delta: "unchanged",
219
+ lane: "functions",
220
+ subtitle: "onWrite trigger",
221
+ summary: "Fetches suppressions once, then posts batched payloads of 500 to Postmark.",
222
+ files: [{ path: "functions/src/broadcast/sendBroadcastBulk.ts" }],
223
+ },
224
+ },
225
+ {
226
+ op: "add_node",
227
+ node: {
228
+ id: "build-bulk-payload",
229
+ label: "buildBulkPayload",
230
+ kind: "function",
231
+ delta: "unchanged",
232
+ lane: "functions",
233
+ files: [{ path: "packages/broadcast-lib/src/buildBulkPayload.ts" }],
234
+ },
235
+ },
236
+ {
237
+ op: "add_node",
238
+ node: {
239
+ id: "get-suppressed-emails",
240
+ label: "getSuppressedEmails",
241
+ kind: "function",
242
+ delta: "unchanged",
243
+ lane: "functions",
244
+ files: [{ path: "packages/broadcast-lib/src/getSuppressedEmails.ts" }],
245
+ },
246
+ },
247
+ {
248
+ op: "add_node",
249
+ node: {
250
+ id: "broadcast-lib",
251
+ label: "broadcast-lib",
252
+ kind: "package",
253
+ delta: "unchanged",
254
+ lane: "functions",
255
+ subtitle: "packages/broadcast-lib",
256
+ files: [{ path: "packages/broadcast-lib/src/index.ts" }],
257
+ },
258
+ },
259
+ {
260
+ op: "add_edge",
261
+ edge: {
262
+ id: "firestore-to-bulk",
263
+ from: "broadcast-queue",
264
+ to: "send-broadcast-bulk",
265
+ kind: "event",
266
+ delta: "unchanged",
267
+ label: "onWrite",
268
+ },
269
+ },
270
+ {
271
+ op: "add_edge",
272
+ edge: {
273
+ id: "bulk-to-payload",
274
+ from: "send-broadcast-bulk",
275
+ to: "build-bulk-payload",
276
+ kind: "call",
277
+ delta: "unchanged",
278
+ },
279
+ },
280
+ {
281
+ op: "add_edge",
282
+ edge: {
283
+ id: "bulk-to-suppressions",
284
+ from: "send-broadcast-bulk",
285
+ to: "get-suppressed-emails",
286
+ kind: "call",
287
+ delta: "unchanged",
288
+ },
289
+ },
290
+ {
291
+ op: "add_edge",
292
+ edge: {
293
+ id: "bulk-to-lib",
294
+ from: "send-broadcast-bulk",
295
+ to: "broadcast-lib",
296
+ kind: "dependency",
297
+ delta: "unchanged",
298
+ },
299
+ },
300
+ {
301
+ op: "add_edge",
302
+ edge: {
303
+ id: "queue-to-lib",
304
+ from: "queue-route",
305
+ to: "broadcast-lib",
306
+ kind: "dependency",
307
+ delta: "unchanged",
308
+ label: "batch size",
309
+ },
310
+ },
311
+ {
312
+ op: "add_edge",
313
+ edge: {
314
+ id: "suppressions-to-postmark",
315
+ from: "get-suppressed-emails",
316
+ to: "postmark",
317
+ kind: "http",
318
+ delta: "unchanged",
319
+ label: "GET suppression dump",
320
+ },
321
+ },
322
+ {
323
+ op: "add_edge",
324
+ edge: {
325
+ id: "bulk-to-postmark",
326
+ from: "send-broadcast-bulk",
327
+ to: "postmark",
328
+ kind: "http",
329
+ delta: "unchanged",
330
+ label: "500 msgs/call",
331
+ },
332
+ },
333
+ {
334
+ op: "add_edge",
335
+ edge: {
336
+ id: "bulk-to-firestore",
337
+ from: "send-broadcast-bulk",
338
+ to: "broadcast-queue",
339
+ kind: "data",
340
+ delta: "unchanged",
341
+ label: "write results",
342
+ },
343
+ },
344
+ { op: "remove_flow", id: "send-pipeline" },
345
+ { op: "remove_node", id: "process-broadcast" },
346
+ { op: "remove_node", id: "send-single-email" },
347
+ {
348
+ op: "update_node",
349
+ id: "broadcast-queue",
350
+ patch: {
351
+ summary: "Queue documents carry the batch size and suppressed count the sender works from.",
352
+ },
353
+ },
354
+ {
355
+ op: "add_flow",
356
+ flow: {
357
+ id: "send-pipeline",
358
+ title: "Sending a broadcast",
359
+ delta: "unchanged",
360
+ participants: [
361
+ { node: "queue-route", label: "queue route" },
362
+ { node: "broadcast-queue", label: "Firestore" },
363
+ { node: "send-broadcast-bulk", label: "sendBroadcastBulk" },
364
+ { node: "postmark", label: "Postmark" },
365
+ ],
366
+ messages: [
367
+ {
368
+ id: "enqueue",
369
+ from: "queue-route",
370
+ to: "broadcast-queue",
371
+ label: "enqueue broadcast job",
372
+ kind: "async",
373
+ delta: "unchanged",
374
+ },
375
+ {
376
+ id: "trigger",
377
+ from: "broadcast-queue",
378
+ to: "send-broadcast-bulk",
379
+ label: "onWrite trigger",
380
+ kind: "async",
381
+ delta: "unchanged",
382
+ },
383
+ {
384
+ id: "suppressions-request",
385
+ from: "send-broadcast-bulk",
386
+ to: "postmark",
387
+ label: "GET suppression dump",
388
+ kind: "sync",
389
+ delta: "unchanged",
390
+ },
391
+ {
392
+ id: "suppressions-response",
393
+ from: "postmark",
394
+ to: "send-broadcast-bulk",
395
+ label: "suppressed addresses",
396
+ kind: "return",
397
+ delta: "unchanged",
398
+ },
399
+ {
400
+ id: "batch-post",
401
+ from: "send-broadcast-bulk",
402
+ to: "postmark",
403
+ label: "POST /email/batch · 500 msgs",
404
+ kind: "sync",
405
+ delta: "unchanged",
406
+ repeat: 4,
407
+ },
408
+ {
409
+ id: "batch-results",
410
+ from: "postmark",
411
+ to: "send-broadcast-bulk",
412
+ label: "per-message results",
413
+ kind: "return",
414
+ delta: "unchanged",
415
+ },
416
+ {
417
+ id: "write-results",
418
+ from: "send-broadcast-bulk",
419
+ to: "broadcast-queue",
420
+ label: "write results",
421
+ kind: "async",
422
+ delta: "unchanged",
423
+ },
424
+ ],
425
+ },
426
+ },
427
+ {
428
+ op: "set_stats",
429
+ stats: { chips: [{ label: "Batch size", value: "500", tone: "neutral" }] },
430
+ },
431
+ ],
432
+ };
433
+ //# sourceMappingURL=baseline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseline.js","sourceRoot":"","sources":["../../src/examples/baseline.ts"],"names":[],"mappings":"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"}