@graview/core 0.1.64 → 0.1.65

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 (73) hide show
  1. package/dist/catalog.d.ts +32 -2
  2. package/dist/catalog.d.ts.map +1 -1
  3. package/dist/catalog.js +1 -0
  4. package/dist/catalog.js.map +1 -1
  5. package/dist/compose.d.ts +25 -1
  6. package/dist/compose.d.ts.map +1 -1
  7. package/dist/compose.js +56 -0
  8. package/dist/compose.js.map +1 -1
  9. package/dist/conformance/index.d.ts +6 -0
  10. package/dist/conformance/index.d.ts.map +1 -1
  11. package/dist/conformance/index.js +3 -0
  12. package/dist/conformance/index.js.map +1 -1
  13. package/dist/conformance/plan-host.d.ts +73 -0
  14. package/dist/conformance/plan-host.d.ts.map +1 -0
  15. package/dist/conformance/plan-host.js +64 -0
  16. package/dist/conformance/plan-host.js.map +1 -0
  17. package/dist/conformance/told-host.d.ts +40 -0
  18. package/dist/conformance/told-host.d.ts.map +1 -0
  19. package/dist/conformance/told-host.js +57 -0
  20. package/dist/conformance/told-host.js.map +1 -0
  21. package/dist/conformance/view-revision-host.d.ts +36 -0
  22. package/dist/conformance/view-revision-host.d.ts.map +1 -0
  23. package/dist/conformance/view-revision-host.js +42 -0
  24. package/dist/conformance/view-revision-host.js.map +1 -0
  25. package/dist/document.schema.json +2 -2
  26. package/dist/index.d.ts +2 -2
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +1 -1
  29. package/dist/index.js.map +1 -1
  30. package/dist/intelligence-bridge.d.ts +2 -0
  31. package/dist/intelligence-bridge.d.ts.map +1 -1
  32. package/dist/plan-edits.d.ts +55 -0
  33. package/dist/plan-edits.d.ts.map +1 -0
  34. package/dist/plan-edits.js +84 -0
  35. package/dist/plan-edits.js.map +1 -0
  36. package/dist/presence.d.ts +10 -0
  37. package/dist/presence.d.ts.map +1 -1
  38. package/dist/presence.js.map +1 -1
  39. package/dist/revisions/beyond.d.ts +56 -0
  40. package/dist/revisions/beyond.d.ts.map +1 -0
  41. package/dist/revisions/beyond.js +112 -0
  42. package/dist/revisions/beyond.js.map +1 -0
  43. package/dist/revisions/pictured.d.ts +52 -0
  44. package/dist/revisions/pictured.d.ts.map +1 -0
  45. package/dist/revisions/pictured.js +85 -0
  46. package/dist/revisions/pictured.js.map +1 -0
  47. package/dist/revisions/problems.d.ts +57 -0
  48. package/dist/revisions/problems.d.ts.map +1 -0
  49. package/dist/revisions/problems.js +51 -0
  50. package/dist/revisions/problems.js.map +1 -0
  51. package/dist/revisions/sections.d.ts +18 -0
  52. package/dist/revisions/sections.d.ts.map +1 -0
  53. package/dist/revisions/sections.js +91 -0
  54. package/dist/revisions/sections.js.map +1 -0
  55. package/dist/revisions/view.d.ts +71 -0
  56. package/dist/revisions/view.d.ts.map +1 -0
  57. package/dist/revisions/view.js +338 -0
  58. package/dist/revisions/view.js.map +1 -0
  59. package/dist/revisions.d.ts +11 -0
  60. package/dist/revisions.d.ts.map +1 -0
  61. package/dist/revisions.js +20 -0
  62. package/dist/revisions.js.map +1 -0
  63. package/dist/told.d.ts +306 -0
  64. package/dist/told.d.ts.map +1 -0
  65. package/dist/told.js +409 -0
  66. package/dist/told.js.map +1 -0
  67. package/dist/version.d.ts +1 -1
  68. package/dist/version.js +1 -1
  69. package/dist/views/kept.d.ts +44 -0
  70. package/dist/views/kept.d.ts.map +1 -1
  71. package/dist/views/kept.js +30 -0
  72. package/dist/views/kept.js.map +1 -1
  73. package/package.json +9 -1
@@ -0,0 +1,84 @@
1
+ const lower = (words) => words.trim().toLowerCase();
2
+ const capital = (words) => words.charAt(0).toUpperCase() + words.slice(1);
3
+ const vowel = (word) => /^(?:[aeio]|u(?![sn]i|se|ser))/i.test(word);
4
+ const an = (word) => `${vowel(word) ? "an" : "a"} ${word}`;
5
+ const camel = (words) => lower(words).replace(/[^a-z0-9]+([a-z0-9])/g, (_, letter) => letter.toUpperCase()).replace(/[^A-Za-z0-9]/g, "");
6
+ const kebab = (words) => lower(words).replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
7
+ const PEOPLE = new Set(["person", "people", "someone", "somebody", "user", "users", "member", "members"]);
8
+ /** A kind of the document named by a word: its name, noun or plural, in any case. */
9
+ function kindNamed(document, word) {
10
+ const said = lower(word);
11
+ return Object.entries(document.kinds).find(([name, spec]) => [name, spec.noun, spec.plural].some((one) => one !== undefined && lower(one) === said))?.[0];
12
+ }
13
+ /** A free name: `wanted`, else with a number after it. */
14
+ function free(taken, wanted) {
15
+ if (!taken(wanted))
16
+ return wanted;
17
+ for (let n = 2;; n++)
18
+ if (!taken(`${wanted}${n}`))
19
+ return `${wanted}${n}`;
20
+ }
21
+ /** The smallest change to `document` that meets `need`, or why none can. */
22
+ export function planEdits(document, need) {
23
+ const acts = document.acts ?? {};
24
+ const actTaken = (name) => name in acts;
25
+ if ("link" in need) {
26
+ const on = kindNamed(document, need.link.on);
27
+ if (!on)
28
+ return { refused: `This app has no ${need.link.on} to give it to.` };
29
+ const spec = document.kinds[on];
30
+ const noun = lower(spec.noun ?? on);
31
+ const called = lower(need.link.called) || "linked to";
32
+ // The kind it names, else — for a person — the kind that is the app's people, by its flag or its words.
33
+ let to = kindNamed(document, need.link.to) ??
34
+ (PEOPLE.has(lower(need.link.to))
35
+ ? (Object.entries(document.kinds).find(([, one]) => one.people) ?? Object.entries(document.kinds).find(([name, one]) => [name, one.noun, one.plural].some((word) => word !== undefined && PEOPLE.has(lower(word)))))?.[0]
36
+ : undefined);
37
+ const edits = [];
38
+ const steps = [];
39
+ let makes;
40
+ const made = to === undefined;
41
+ if (!to) {
42
+ const word = lower(need.link.to) || "person";
43
+ const person = PEOPLE.has(word);
44
+ const kindNoun = person ? "person" : word.replace(/s$/, "");
45
+ const kindPlural = person ? "people" : `${kindNoun}s`;
46
+ to = free((name) => name in document.kinds, kebab(kindNoun));
47
+ // The kind brings its own "add" act (`add-<kind>`), as every kind added by an edit does.
48
+ edits.push({ op: "add-kind", kind: to, noun: kindNoun, plural: kindPlural, fields: { name: { type: "string", required: true } }, label: "{name}" });
49
+ makes = free(actTaken, `add-${to}`);
50
+ steps.push(`Add ${an(capital(kindPlural))} list.`);
51
+ }
52
+ const toSpec = (to in document.kinds ? document.kinds[to] : edits[0]);
53
+ const toNoun = lower(toSpec.noun ?? to);
54
+ const relation = free((name) => name in (spec.edges ?? {}) || name in (spec.fields ?? {}), camel(called) || "linkedTo");
55
+ // Said as the person said it, so the record says the link in their words, not its name.
56
+ edits.push({ op: "add-relation", kind: on, relation, to: [to], cardinality: "one", description: capital(called) });
57
+ const act = free(actTaken, `set-${kebab(called)}`);
58
+ edits.push({ op: "add-act", act, title: `Set “${capital(called)}”`, on, connects: relation, description: `Say who ${an(noun)} is ${called}.` });
59
+ steps.push(`Give each ${noun} ${vowel(called) ? "an" : "a"} “${capital(called)}” field that points to ${an(toNoun)}.`);
60
+ return { edits, steps, on, relation, to, made, act, arg: "to", ...(makes ? { makes } : {}), called };
61
+ }
62
+ const on = kindNamed(document, need.field.on);
63
+ if (!on)
64
+ return { refused: `This app has no ${need.field.on} to give it to.` };
65
+ const spec = document.kinds[on];
66
+ const noun = lower(spec.noun ?? on);
67
+ const called = lower(need.field.called) || "note";
68
+ const type = need.field.type ?? "string";
69
+ const field = free((name) => name in (spec.fields ?? {}) || name in (spec.edges ?? {}), camel(called) || "note");
70
+ const act = free(actTaken, `set-${kebab(called)}`);
71
+ return {
72
+ edits: [
73
+ { op: "add-field", kind: on, field, spec: { type } },
74
+ { op: "add-act", act, title: `Set “${capital(called)}”`, on, args: { value: { type, required: true } }, sets: { [field]: "$value" }, description: `Say ${an(noun)}'s ${called}.` },
75
+ ],
76
+ steps: [`Give each ${noun} ${vowel(called) ? "an" : "a"} “${capital(called)}” field.`],
77
+ on,
78
+ field,
79
+ act,
80
+ arg: "value",
81
+ called,
82
+ };
83
+ }
84
+ //# sourceMappingURL=plan-edits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-edits.js","sourceRoot":"","sources":["../src/plan-edits.ts"],"names":[],"mappings":"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"}
@@ -66,6 +66,16 @@ export interface PresenceChannel {
66
66
  onWho(listener: (who: readonly Presence[]) => void): () => void;
67
67
  /** Say you have gone, and stop. */
68
68
  leave(): void;
69
+ /**
70
+ * SAY ANOTHER PARTICIPANT THIS PAGE SPEAKS FOR (Roadmap
71
+ * f-menu-type-anything): the app's AI thinking for the person at this
72
+ * page — "Graview, for Ada" — as a word of its own beside theirs. Said on
73
+ * every heartbeat while it stands; said once with `until` now when it
74
+ * goes. Leaves this page's own word, and its leaving, as they are. A
75
+ * channel without it carries only the page's own word, and the page shows
76
+ * the AI to itself.
77
+ */
78
+ alsoHere?(presence: Presence): void;
69
79
  }
70
80
  /** How long a presence stands after its last word: three missed heartbeats at the poll's own pace. */
71
81
  export declare const PRESENCE_TTL_MS = 2500;
@@ -1 +1 @@
1
- {"version":3,"file":"presence.d.ts","sourceRoot":"","sources":["../src/presence.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"presence.d.ts","sourceRoot":"","sources":["../src/presence.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"presence.js","sourceRoot":"","sources":["../src/presence.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"presence.js","sourceRoot":"","sources":["../src/presence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import type { MutationCall } from "../mutations/types.js";
2
+ import type { Operation } from "../ops/types.js";
3
+ import type { GraphEdge } from "../graph/types.js";
4
+ /** A record added or removed beyond what its act was asked. */
5
+ interface RecordChange<C extends "added" | "removed"> {
6
+ readonly change: C;
7
+ readonly record: string;
8
+ readonly kind: string;
9
+ readonly op: string;
10
+ readonly act: string | null;
11
+ }
12
+ /** A link made or taken beyond what its act was asked. */
13
+ interface EdgeChange<C extends "linked" | "unlinked"> {
14
+ readonly change: C;
15
+ readonly edge: GraphEdge;
16
+ readonly op: string;
17
+ readonly act: string | null;
18
+ }
19
+ /** A record or a link changed beyond what its act was asked. */
20
+ export type BeyondChange = RecordChange<"added"> | RecordChange<"removed"> | {
21
+ readonly change: "changed";
22
+ readonly record: string;
23
+ readonly fields: readonly string[];
24
+ readonly op: string;
25
+ readonly act: string | null;
26
+ } | EdgeChange<"linked"> | EdgeChange<"unlinked">;
27
+ /** What an answer changed, set against what was asked. */
28
+ export interface ActReach {
29
+ /** Each act asked, with the records it was asked about: those its arguments name and the one it made. */
30
+ readonly asked: readonly {
31
+ readonly op: string;
32
+ readonly act: string | null;
33
+ readonly records: readonly string[];
34
+ }[];
35
+ readonly beyond: readonly BeyondChange[];
36
+ readonly said: readonly string[];
37
+ /** "Besides what was asked, it also …", or that it changed only what was asked. */
38
+ readonly text: string;
39
+ }
40
+ export interface BeyondAskedOptions {
41
+ /** The acts the caller asked for. Given, an op whose act is none of them is beyond what was asked whole; left out, each op's own act is what was asked. */
42
+ readonly asked?: readonly MutationCall[];
43
+ /** A record's name, as a person says it (`describeNode`, a store's label): its id otherwise, or its name where the change carried the record. */
44
+ readonly label?: (id: string) => string | undefined;
45
+ }
46
+ /**
47
+ * WHAT AN ANSWER CHANGED BEYOND WHAT WAS ASKED: every record added,
48
+ * removed or changed, and every link made or taken, that is not the asking
49
+ * act's own — its own being the records the act's arguments name and the
50
+ * first record it made, and a link between two of those.
51
+ */
52
+ export declare function beyondAsked(answer: {
53
+ readonly ops: readonly Operation[];
54
+ }, options?: BeyondAskedOptions): ActReach;
55
+ export {};
56
+ //# sourceMappingURL=beyond.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"beyond.d.ts","sourceRoot":"","sources":["../../src/revisions/beyond.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAU,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAgB,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGjE,+DAA+D;AAC/D,UAAU,YAAY,CAAC,CAAC,SAAS,OAAO,GAAG,SAAS;IAClD,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,0DAA0D;AAC1D,UAAU,UAAU,CAAC,CAAC,SAAS,QAAQ,GAAG,UAAU;IAClD,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,gEAAgE;AAChE,MAAM,MAAM,YAAY,GACpB,YAAY,CAAC,OAAO,CAAC,GACrB,YAAY,CAAC,SAAS,CAAC,GACvB;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC7I,UAAU,CAAC,QAAQ,CAAC,GACpB,UAAU,CAAC,UAAU,CAAC,CAAC;AAE3B,0DAA0D;AAC1D,MAAM,WAAW,QAAQ;IACvB,yGAAyG;IACzG,QAAQ,CAAC,KAAK,EAAE,SAAS;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;IACrH,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,mFAAmF;IACnF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,2JAA2J;IAC3J,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IACzC,iJAAiJ;IACjJ,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CACrD;AA6BD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE;IAAE,QAAQ,CAAC,GAAG,EAAE,SAAS,SAAS,EAAE,CAAA;CAAE,EAAE,OAAO,GAAE,kBAAuB,GAAG,QAAQ,CA4DtH"}
@@ -0,0 +1,112 @@
1
+ /** Every string an act's arguments hold, however deep. */
2
+ function stringsIn(value, into) {
3
+ if (typeof value === "string")
4
+ into.add(value);
5
+ else if (Array.isArray(value))
6
+ for (const one of value)
7
+ stringsIn(one, into);
8
+ else if (typeof value === "object" && value !== null)
9
+ for (const one of Object.values(value))
10
+ stringsIn(one, into);
11
+ return into;
12
+ }
13
+ const sameAuthor = (a, b) => a.kind === b.kind && (a.id ?? "") === (b.id ?? "");
14
+ /** The record ids a primitive touches. */
15
+ function touched(primitive) {
16
+ switch (primitive.op) {
17
+ case "add-node":
18
+ case "remove-node":
19
+ return [primitive.node.id];
20
+ case "patch-node":
21
+ case "splice-text":
22
+ return [primitive.id];
23
+ case "add-edge":
24
+ case "remove-edge":
25
+ return [primitive.edge.from, primitive.edge.to];
26
+ }
27
+ }
28
+ const nameOf = (node) => [node["title"], node["name"], node["label"]].find((one) => typeof one === "string" && one.length > 0);
29
+ /**
30
+ * WHAT AN ANSWER CHANGED BEYOND WHAT WAS ASKED: every record added,
31
+ * removed or changed, and every link made or taken, that is not the asking
32
+ * act's own — its own being the records the act's arguments name and the
33
+ * first record it made, and a link between two of those.
34
+ */
35
+ export function beyondAsked(answer, options = {}) {
36
+ const askedNames = options.asked ? new Set(options.asked.map((call) => call.name)) : undefined;
37
+ const first = answer.ops[0]?.author;
38
+ const names = new Map();
39
+ const asked = [];
40
+ const beyond = [];
41
+ const changedAt = new Map();
42
+ for (const op of answer.ops) {
43
+ const act = op.mutation?.name ?? null;
44
+ for (const primitive of op.primitives)
45
+ if ((primitive.op === "add-node" || primitive.op === "remove-node") && nameOf(primitive.node))
46
+ names.set(primitive.node.id, nameOf(primitive.node));
47
+ /* An op is asked when it is an act, by whoever asked the first, and one of the acts asked: anything else in the answer is beyond it whole. */
48
+ const isAsked = act !== null && (!first || sameAuthor(op.author, first)) && (!askedNames || askedNames.has(act));
49
+ const ids = new Set(op.primitives.flatMap(touched));
50
+ const targets = new Set();
51
+ if (isAsked) {
52
+ for (const one of stringsIn(op.mutation.args, new Set()))
53
+ if (ids.has(one))
54
+ targets.add(one);
55
+ const made = op.primitives.find((primitive) => primitive.op === "add-node");
56
+ if (made)
57
+ targets.add(made.node.id);
58
+ asked.push({ op: op.id, act, records: [...targets] });
59
+ }
60
+ for (const primitive of op.primitives) {
61
+ if (primitive.op === "add-node" || primitive.op === "remove-node") {
62
+ if (!targets.has(primitive.node.id))
63
+ beyond.push({ change: primitive.op === "add-node" ? "added" : "removed", record: primitive.node.id, kind: primitive.node.kind, op: op.id, act });
64
+ }
65
+ else if (primitive.op === "patch-node" || primitive.op === "splice-text") {
66
+ if (targets.has(primitive.id))
67
+ continue;
68
+ const fields = primitive.op === "patch-node" ? Object.keys(primitive.after) : [primitive.field];
69
+ const key = `${op.id} ${primitive.id}`;
70
+ const at = changedAt.get(key);
71
+ if (at)
72
+ for (const field of fields)
73
+ at.fields.add(field);
74
+ else {
75
+ changedAt.set(key, { fields: new Set(fields), entry: beyond.length });
76
+ beyond.push({ change: "changed", record: primitive.id, fields, op: op.id, act });
77
+ }
78
+ }
79
+ else if (!(targets.has(primitive.edge.from) && targets.has(primitive.edge.to))) {
80
+ beyond.push({ change: primitive.op === "add-edge" ? "linked" : "unlinked", edge: primitive.edge, op: op.id, act });
81
+ }
82
+ }
83
+ }
84
+ for (const { fields, entry } of changedAt.values()) {
85
+ const one = beyond[entry];
86
+ beyond[entry] = { ...one, fields: [...fields] };
87
+ }
88
+ const label = (id) => {
89
+ const name = options.label?.(id) ?? names.get(id);
90
+ return name ? `"${name}"` : id;
91
+ };
92
+ const groups = [];
93
+ const of = (change) => beyond.filter((one) => one.change === change);
94
+ const changed = of("changed");
95
+ if (changed.length > 0)
96
+ groups.push(`changed ${changed.map((one) => `${label(one.record)} (${one.fields.join(", ")})`).join(", ")}`);
97
+ const added = of("added");
98
+ if (added.length > 0)
99
+ groups.push(`added ${added.map((one) => `${one.kind} ${label(one.record)}`).join(", ")}`);
100
+ const removed = of("removed");
101
+ if (removed.length > 0)
102
+ groups.push(`removed ${removed.map((one) => `${one.kind} ${label(one.record)}`).join(", ")}`);
103
+ const linked = of("linked");
104
+ if (linked.length > 0)
105
+ groups.push(`linked ${linked.map((one) => `${label(one.edge.from)} ${one.edge.kind} ${label(one.edge.to)}`).join(", ")}`);
106
+ const unlinked = of("unlinked");
107
+ if (unlinked.length > 0)
108
+ groups.push(`took the link ${unlinked.map((one) => `${label(one.edge.from)} ${one.edge.kind} ${label(one.edge.to)}`).join(", ")}`);
109
+ const said = groups.length > 0 ? [`Besides what was asked, it also ${groups.join("; ")}.`] : [];
110
+ return { asked, beyond, said, text: said[0] ?? "It changed only what was asked." };
111
+ }
112
+ //# sourceMappingURL=beyond.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"beyond.js","sourceRoot":"","sources":["../../src/revisions/beyond.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import type { DrawnSection } from "./sections.js";
2
+ /** A section of a page where it stands, in CSS pixels from the top of what scrolls. */
3
+ export interface PlacedSection extends DrawnSection {
4
+ readonly top: number;
5
+ readonly bottom: number;
6
+ }
7
+ /** A page as `MEASURE_PICTURED_PAGE` measured it. */
8
+ export interface PageMeasure {
9
+ /** How tall the whole place is: the height of what scrolls. */
10
+ readonly height: number;
11
+ /** How far it was scrolled when measured. */
12
+ readonly top: number;
13
+ /** How much of it a window shows: what a picture of the window holds. */
14
+ readonly window: number;
15
+ readonly sections: readonly PlacedSection[];
16
+ }
17
+ /** How much of a page a picture held, and what it left out. */
18
+ export interface PictureCoverage {
19
+ /** True when the picture held the whole page. */
20
+ readonly whole: boolean;
21
+ readonly height: number;
22
+ /** The part of the page pictured, top and bottom, in CSS pixels. */
23
+ readonly pictured: {
24
+ readonly top: number;
25
+ readonly bottom: number;
26
+ };
27
+ /** Sections wholly above the picture, and wholly below it. */
28
+ readonly above: readonly PlacedSection[];
29
+ readonly below: readonly PlacedSection[];
30
+ /** In a sentence: "First screen only (900 of 5,100px); not shown: This week, Dinner." */
31
+ readonly said: string;
32
+ }
33
+ /**
34
+ * MEASURE THE PAGE AS IT IS PICTURED: evaluate it in the page (Playwright's
35
+ * `page.evaluate`, a host's own browser) right before the picture is taken,
36
+ * and hand what it answers to `picturedCoverage`. It reads the box the
37
+ * place scrolls in — an embed's `[data-embed-content]`, the tallest box that
38
+ * scrolls, or the document — and every section on it, a worker view's
39
+ * among them (each view draws into an open shadow root).
40
+ */
41
+ export declare const MEASURE_PICTURED_PAGE = "(() => {\n const scrolls = (el) => /(auto|scroll)/.test(getComputedStyle(el).overflowY) && el.scrollHeight > el.clientHeight + 1;\n const content = document.querySelector(\"[data-embed-content]\");\n const box = content && scrolls(content)\n ? content\n : [...document.querySelectorAll(\"body *\")].filter((el) => scrolls(el) && el.clientHeight >= innerHeight / 2).sort((a, b) => b.clientHeight - a.clientHeight)[0];\n const doc = document.scrollingElement || document.documentElement;\n const height = box ? box.scrollHeight : Math.max(doc.scrollHeight, document.body ? document.body.scrollHeight : 0);\n const top = box ? box.scrollTop : scrollY;\n const windowHeight = box ? box.clientHeight : innerHeight;\n const origin = box ? box.getBoundingClientRect().top - box.scrollTop : -scrollY;\n const LANDMARKS = { section: null, article: null, form: null, region: null, nav: \"navigation\", navigation: \"navigation\", main: \"main content\", header: \"header\", banner: \"header\", footer: \"footer\", contentinfo: \"footer\", aside: \"aside\", complementary: \"aside\", search: \"search\" };\n const said = (text) => (text || \"\").replace(/\\s+/g, \" \").trim();\n const tagOf = (el) => (el.getAttribute(\"data-graview-as\") || el.localName || \"\").toLowerCase();\n const level = (el) => /^h[1-6]$/.test(tagOf(el)) ? 1 : el.getAttribute(\"role\") === \"heading\" ? 1 : 0;\n const all = [];\n const walk = (root) => {\n for (const el of root.querySelectorAll(\"*\")) {\n all.push(el);\n if (el.shadowRoot) walk(el.shadowRoot);\n }\n };\n walk(document);\n const sections = [];\n const seen = new Set();\n for (const el of all) {\n if (el.closest(\"[data-testid=app-bar], [role=dialog]\")) continue;\n const rect = el.getBoundingClientRect();\n if (rect.height <= 0 || rect.width <= 0 || getComputedStyle(el).visibility === \"hidden\") continue;\n let name = \"\";\n let as = \"\";\n if (level(el)) {\n name = said(el.textContent);\n as = \"heading\";\n } else {\n const role = (el.getAttribute(\"role\") || \"\").toLowerCase();\n const tag = tagOf(el);\n const what = role in LANDMARKS ? role : tag in LANDMARKS ? tag : \"\";\n if (!what) continue;\n const root = el.getRootNode();\n const namedBy = (el.getAttribute(\"aria-labelledby\") || \"\").split(/\\s+/).map((id) => id && root.getElementById ? root.getElementById(id) : null).filter(Boolean).map((one) => said(one.textContent)).join(\" \");\n const heading = [...el.querySelectorAll(\"*\")].find(level);\n name = said(el.getAttribute(\"aria-label\")) || namedBy || (heading ? said(heading.textContent) : \"\") || LANDMARKS[what] || \"\";\n as = what === \"region\" ? \"section\" : what;\n }\n if (!name || seen.has(name.toLowerCase())) continue;\n seen.add(name.toLowerCase());\n sections.push({ name: name.length > 80 ? name.slice(0, 79) + \"\u2026\" : name, as, top: Math.round(rect.top - origin), bottom: Math.round(rect.bottom - origin) });\n }\n return { height: Math.ceil(height), top: Math.round(top), window: Math.round(windowHeight), sections };\n})()";
42
+ /**
43
+ * HOW MUCH OF A PAGE A PICTURE HELD. `pictured` is the part of the page in
44
+ * the picture, from the top of what scrolls; left out, it is the window
45
+ * where the page was measured. A section is shown when any of it is in the
46
+ * picture; one wholly above or below is named as not shown.
47
+ */
48
+ export declare function picturedCoverage(measure: PageMeasure, pictured?: {
49
+ readonly top: number;
50
+ readonly height: number;
51
+ }): PictureCoverage;
52
+ //# sourceMappingURL=pictured.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pictured.d.ts","sourceRoot":"","sources":["../../src/revisions/pictured.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,uFAAuF;AACvF,MAAM,WAAW,aAAc,SAAQ,YAAY;IACjD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,qDAAqD;AACrD,MAAM,WAAW,WAAW;IAC1B,+DAA+D;IAC/D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,6CAA6C;IAC7C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;CAC7C;AAED,+DAA+D;AAC/D,MAAM,WAAW,eAAe;IAC9B,iDAAiD;IACjD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,oEAAoE;IACpE,QAAQ,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE,8DAA8D;IAC9D,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;IACzC,yFAAyF;IACzF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,qlGAkD7B,CAAC;AAMN;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,eAAe,CAcpI"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * MEASURE THE PAGE AS IT IS PICTURED: evaluate it in the page (Playwright's
3
+ * `page.evaluate`, a host's own browser) right before the picture is taken,
4
+ * and hand what it answers to `picturedCoverage`. It reads the box the
5
+ * place scrolls in — an embed's `[data-embed-content]`, the tallest box that
6
+ * scrolls, or the document — and every section on it, a worker view's
7
+ * among them (each view draws into an open shadow root).
8
+ */
9
+ export const MEASURE_PICTURED_PAGE = `(() => {
10
+ const scrolls = (el) => /(auto|scroll)/.test(getComputedStyle(el).overflowY) && el.scrollHeight > el.clientHeight + 1;
11
+ const content = document.querySelector("[data-embed-content]");
12
+ const box = content && scrolls(content)
13
+ ? content
14
+ : [...document.querySelectorAll("body *")].filter((el) => scrolls(el) && el.clientHeight >= innerHeight / 2).sort((a, b) => b.clientHeight - a.clientHeight)[0];
15
+ const doc = document.scrollingElement || document.documentElement;
16
+ const height = box ? box.scrollHeight : Math.max(doc.scrollHeight, document.body ? document.body.scrollHeight : 0);
17
+ const top = box ? box.scrollTop : scrollY;
18
+ const windowHeight = box ? box.clientHeight : innerHeight;
19
+ const origin = box ? box.getBoundingClientRect().top - box.scrollTop : -scrollY;
20
+ const LANDMARKS = { section: null, article: null, form: null, region: null, nav: "navigation", navigation: "navigation", main: "main content", header: "header", banner: "header", footer: "footer", contentinfo: "footer", aside: "aside", complementary: "aside", search: "search" };
21
+ const said = (text) => (text || "").replace(/\\s+/g, " ").trim();
22
+ const tagOf = (el) => (el.getAttribute("data-graview-as") || el.localName || "").toLowerCase();
23
+ const level = (el) => /^h[1-6]$/.test(tagOf(el)) ? 1 : el.getAttribute("role") === "heading" ? 1 : 0;
24
+ const all = [];
25
+ const walk = (root) => {
26
+ for (const el of root.querySelectorAll("*")) {
27
+ all.push(el);
28
+ if (el.shadowRoot) walk(el.shadowRoot);
29
+ }
30
+ };
31
+ walk(document);
32
+ const sections = [];
33
+ const seen = new Set();
34
+ for (const el of all) {
35
+ if (el.closest("[data-testid=app-bar], [role=dialog]")) continue;
36
+ const rect = el.getBoundingClientRect();
37
+ if (rect.height <= 0 || rect.width <= 0 || getComputedStyle(el).visibility === "hidden") continue;
38
+ let name = "";
39
+ let as = "";
40
+ if (level(el)) {
41
+ name = said(el.textContent);
42
+ as = "heading";
43
+ } else {
44
+ const role = (el.getAttribute("role") || "").toLowerCase();
45
+ const tag = tagOf(el);
46
+ const what = role in LANDMARKS ? role : tag in LANDMARKS ? tag : "";
47
+ if (!what) continue;
48
+ const root = el.getRootNode();
49
+ const namedBy = (el.getAttribute("aria-labelledby") || "").split(/\\s+/).map((id) => id && root.getElementById ? root.getElementById(id) : null).filter(Boolean).map((one) => said(one.textContent)).join(" ");
50
+ const heading = [...el.querySelectorAll("*")].find(level);
51
+ name = said(el.getAttribute("aria-label")) || namedBy || (heading ? said(heading.textContent) : "") || LANDMARKS[what] || "";
52
+ as = what === "region" ? "section" : what;
53
+ }
54
+ if (!name || seen.has(name.toLowerCase())) continue;
55
+ seen.add(name.toLowerCase());
56
+ sections.push({ name: name.length > 80 ? name.slice(0, 79) + "…" : name, as, top: Math.round(rect.top - origin), bottom: Math.round(rect.bottom - origin) });
57
+ }
58
+ return { height: Math.ceil(height), top: Math.round(top), window: Math.round(windowHeight), sections };
59
+ })()`;
60
+ const MOST_NAMED = 8;
61
+ const px = (n) => Math.round(n).toLocaleString("en-US");
62
+ const names = (sections) => (sections.length <= MOST_NAMED ? sections.map((one) => one.name).join(", ") : `${sections.slice(0, MOST_NAMED).map((one) => one.name).join(", ")} and ${sections.length - MOST_NAMED} more`);
63
+ /**
64
+ * HOW MUCH OF A PAGE A PICTURE HELD. `pictured` is the part of the page in
65
+ * the picture, from the top of what scrolls; left out, it is the window
66
+ * where the page was measured. A section is shown when any of it is in the
67
+ * picture; one wholly above or below is named as not shown.
68
+ */
69
+ export function picturedCoverage(measure, pictured) {
70
+ const top = Math.max(0, pictured?.top ?? measure.top);
71
+ const bottom = Math.min(measure.height, top + (pictured?.height ?? measure.window));
72
+ const whole = top <= 0 && bottom >= measure.height - 1;
73
+ const above = measure.sections.filter((one) => one.bottom <= top);
74
+ const below = measure.sections.filter((one) => one.top >= bottom);
75
+ let said;
76
+ if (whole)
77
+ said = `The whole page is pictured (${px(measure.height)}px).`;
78
+ else {
79
+ const part = top <= 0 ? `First screen only (${px(bottom)} of ${px(measure.height)}px)` : `Only ${px(top)}–${px(bottom)} of ${px(measure.height)}px`;
80
+ const left = [...(above.length > 0 ? [`above it, ${names(above)}`] : []), ...(below.length > 0 ? [`${above.length > 0 ? "below it, " : ""}${names(below)}`] : [])];
81
+ said = left.length > 0 ? `${part}; not shown: ${left.join("; ")}.` : `${part}; no named section is wholly outside it.`;
82
+ }
83
+ return { whole, height: measure.height, pictured: { top, bottom }, above, below, said };
84
+ }
85
+ //# sourceMappingURL=pictured.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pictured.js","sourceRoot":"","sources":["../../src/revisions/pictured.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import type { InvariantDefinition, Violation } from "../invariants/types.js";
2
+ /** A problem a view says: the view by name, where in it, and what it says (a headless run's `description.problems`). */
3
+ export interface ViewProblem {
4
+ readonly view: string;
5
+ readonly at?: string;
6
+ readonly says: string;
7
+ }
8
+ /** What was judged at one moment: the rules' problems and the views'. */
9
+ export interface ProblemSet {
10
+ readonly rules?: readonly Violation[];
11
+ readonly views?: readonly ViewProblem[];
12
+ }
13
+ /** A problem one side has and the other does not. */
14
+ export type ChangedProblem = {
15
+ readonly key: string;
16
+ readonly kind: "rule";
17
+ readonly rule: string;
18
+ /** The record it is about, where it is about one. */
19
+ readonly subject?: string;
20
+ readonly says: string;
21
+ /** The act the rule names to repair it, first; `missing` is what its caller still chooses. */
22
+ readonly repair?: {
23
+ readonly act: string;
24
+ readonly label: string;
25
+ readonly args?: Readonly<Record<string, unknown>>;
26
+ readonly missing?: readonly string[];
27
+ };
28
+ readonly violation: Violation;
29
+ } | {
30
+ readonly key: string;
31
+ readonly kind: "view";
32
+ readonly view: string;
33
+ readonly at?: string;
34
+ readonly says: string;
35
+ };
36
+ /** What a change broke and mended, as entries and in words. */
37
+ export interface ProblemsMade {
38
+ /** Problems after it that were not before: rules that held and fail, and view problems new after. */
39
+ readonly made: readonly ChangedProblem[];
40
+ /** Problems before it that are not after. */
41
+ readonly mended: readonly ChangedProblem[];
42
+ readonly said: readonly string[];
43
+ /** "This change broke: …", or that it broke nothing. */
44
+ readonly text: string;
45
+ }
46
+ /** A view problem's key: its view, where, and its words. */
47
+ export declare const viewProblemKey: (problem: ViewProblem) => string;
48
+ /**
49
+ * WHAT A CHANGE BROKE: the problems after it that were not before, and
50
+ * those it mended. `rules` are the app's rules, so a rule written in the
51
+ * rule language is one problem whether or not its words were loaded
52
+ * (`shapedRules`); without them, a problem is known by its words.
53
+ */
54
+ export declare function problemsMade(before: ProblemSet, after: ProblemSet, options?: {
55
+ readonly rules?: readonly Pick<InvariantDefinition, "name" | "shape">[];
56
+ }): ProblemsMade;
57
+ //# sourceMappingURL=problems.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"problems.d.ts","sourceRoot":"","sources":["../../src/revisions/problems.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,mBAAmB,EAAU,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGrF,wHAAwH;AACxH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,yEAAyE;AACzE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;CACzC;AAED,qDAAqD;AACrD,MAAM,MAAM,cAAc,GACtB;IACE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qDAAqD;IACrD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,8FAA8F;IAC9F,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC;IAC5J,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;CAC/B,GACD;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAExH,+DAA+D;AAC/D,MAAM,WAAW,YAAY;IAC3B,qGAAqG;IACrG,QAAQ,CAAC,IAAI,EAAE,SAAS,cAAc,EAAE,CAAC;IACzC,6CAA6C;IAC7C,QAAQ,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,wDAAwD;IACxD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,4DAA4D;AAC5D,eAAO,MAAM,cAAc,GAAI,SAAS,WAAW,KAAG,MAAoE,CAAC;AAkB3H;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,GAAE;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,IAAI,CAAC,mBAAmB,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,CAAA;CAAO,GAAG,YAAY,CAa3K"}
@@ -0,0 +1,51 @@
1
+ /*
2
+ * THE PROBLEMS A CHANGE MADE (Roadmap f-revisions-say-what-broke).
3
+ *
4
+ * An act, a batch or a proposed view can break what held: a rule that held
5
+ * before fails after, a view says a problem it did not. A host that judged
6
+ * the app before and after a change — the store's `violations()`, a
7
+ * headless run's problems — hands both sets here and is told what is new,
8
+ * each keyed as it will be keyed next time (a rule's problem by
9
+ * `violationKey`, a view's by its view, where and words), in words, and with
10
+ * the act a rule names to repair it, so an answer can carry "this change
11
+ * broke: …" and how to mend it rather than leave it to a later look.
12
+ */
13
+ import { problemWords } from "../invariants/line.js";
14
+ import { problemsMoved, violationKey, shapedRules } from "../store.js";
15
+ /** A view problem's key: its view, where, and its words. */
16
+ export const viewProblemKey = (problem) => `view:${problem.view}|${problem.at ?? ""}|${problem.says}`;
17
+ /** Only a rule that judged and failed is broken: one that could not judge (`could-not-judge`, `over-budget`) is not said as made. */
18
+ const failed = (v) => v.status === undefined || v.status === "violated";
19
+ const repairOf = (repair) => repair ? { repair: { act: repair.mutation, label: repair.label, ...(repair.args ? { args: repair.args } : {}), ...(repair.missing && repair.missing.length > 0 ? { missing: repair.missing } : {}) } } : {};
20
+ function ruleEntry(v, shaped) {
21
+ return { key: violationKey(v, shaped), kind: "rule", rule: v.invariant, ...(v.subjectId ? { subject: v.subjectId } : {}), says: problemWords(v), ...repairOf(v.repairs[0]), violation: v };
22
+ }
23
+ function sayProblem(problem) {
24
+ if (problem.kind === "view")
25
+ return `the view "${problem.view}"${problem.at ? ` at ${problem.at}` : ""} says: ${problem.says.replace(/[.\s]+$/, "")}`;
26
+ const repair = problem.repair ? ` (repair: ${problem.repair.act}${problem.repair.missing ? `, choosing ${problem.repair.missing.join(", ")}` : ""} — ${problem.repair.label})` : "";
27
+ return `${problem.says.replace(/[.\s]+$/, "")}${repair}`;
28
+ }
29
+ /**
30
+ * WHAT A CHANGE BROKE: the problems after it that were not before, and
31
+ * those it mended. `rules` are the app's rules, so a rule written in the
32
+ * rule language is one problem whether or not its words were loaded
33
+ * (`shapedRules`); without them, a problem is known by its words.
34
+ */
35
+ export function problemsMade(before, after, options = {}) {
36
+ const rules = options.rules ?? [];
37
+ const shaped = shapedRules(rules);
38
+ const moved = problemsMoved(rules, (before.rules ?? []).filter(failed), (after.rules ?? []).filter(failed));
39
+ const viewsBefore = new Set((before.views ?? []).map(viewProblemKey));
40
+ const viewsAfter = new Set((after.views ?? []).map(viewProblemKey));
41
+ const viewEntry = (problem) => ({ key: viewProblemKey(problem), kind: "view", view: problem.view, ...(problem.at ? { at: problem.at } : {}), says: problem.says });
42
+ const made = [...moved.introduces.map((v) => ruleEntry(v, shaped)), ...(after.views ?? []).filter((one) => !viewsBefore.has(viewProblemKey(one))).map(viewEntry)];
43
+ const mended = [...moved.resolves.map((v) => ruleEntry(v, shaped)), ...(before.views ?? []).filter((one) => !viewsAfter.has(viewProblemKey(one))).map(viewEntry)];
44
+ const said = [];
45
+ if (made.length > 0)
46
+ said.push(`This change broke ${made.length === 1 ? "one thing that held" : `${made.length} things that held`}: ${made.map(sayProblem).join("; ")}. Fix ${made.length === 1 ? "it" : "them"} before going on.`);
47
+ if (mended.length > 0)
48
+ said.push(`It mended ${mended.length === 1 ? "one problem" : `${mended.length} problems`}: ${mended.map(sayProblem).join("; ")}.`);
49
+ return { made, mended, said, text: made.length > 0 ? said.join(" ") : `This change broke nothing that held.${mended.length > 0 ? ` ${said.join(" ")}` : ""}` };
50
+ }
51
+ //# sourceMappingURL=problems.js.map