@ascribed/review 0.1.2-next.2

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 (70) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +183 -0
  3. package/dist/github/index.d.ts +7 -0
  4. package/dist/github/index.js +8 -0
  5. package/dist/github/index.js.map +1 -0
  6. package/dist/github/marker.d.ts +63 -0
  7. package/dist/github/marker.js +156 -0
  8. package/dist/github/marker.js.map +1 -0
  9. package/dist/github/queries.d.ts +16 -0
  10. package/dist/github/queries.js +174 -0
  11. package/dist/github/queries.js.map +1 -0
  12. package/dist/github/read.d.ts +84 -0
  13. package/dist/github/read.js +141 -0
  14. package/dist/github/read.js.map +1 -0
  15. package/dist/github/repository.d.ts +30 -0
  16. package/dist/github/repository.js +77 -0
  17. package/dist/github/repository.js.map +1 -0
  18. package/dist/github/requests.d.ts +65 -0
  19. package/dist/github/requests.js +274 -0
  20. package/dist/github/requests.js.map +1 -0
  21. package/dist/github/session.d.ts +143 -0
  22. package/dist/github/session.js +581 -0
  23. package/dist/github/session.js.map +1 -0
  24. package/dist/github/transport.d.ts +33 -0
  25. package/dist/github/transport.js +206 -0
  26. package/dist/github/transport.js.map +1 -0
  27. package/dist/marks/index.d.ts +92 -0
  28. package/dist/marks/index.js +766 -0
  29. package/dist/marks/index.js.map +1 -0
  30. package/dist/overlay/index.d.ts +4 -0
  31. package/dist/overlay/index.js +7 -0
  32. package/dist/overlay/index.js.map +1 -0
  33. package/dist/overlay/markdown.d.ts +4 -0
  34. package/dist/overlay/markdown.js +368 -0
  35. package/dist/overlay/markdown.js.map +1 -0
  36. package/dist/overlay/overlay.d.ts +47 -0
  37. package/dist/overlay/overlay.js +1710 -0
  38. package/dist/overlay/overlay.js.map +1 -0
  39. package/dist/overlay/style.d.ts +1 -0
  40. package/dist/overlay/style.js +570 -0
  41. package/dist/overlay/style.js.map +1 -0
  42. package/dist/overlay/text.d.ts +33 -0
  43. package/dist/overlay/text.js +200 -0
  44. package/dist/overlay/text.js.map +1 -0
  45. package/dist/overlay/types.d.ts +60 -0
  46. package/dist/overlay/types.js +2 -0
  47. package/dist/overlay/types.js.map +1 -0
  48. package/dist/place/anchor.d.ts +23 -0
  49. package/dist/place/anchor.js +49 -0
  50. package/dist/place/anchor.js.map +1 -0
  51. package/dist/place/index.d.ts +4 -0
  52. package/dist/place/index.js +6 -0
  53. package/dist/place/index.js.map +1 -0
  54. package/dist/place/lines.d.ts +56 -0
  55. package/dist/place/lines.js +280 -0
  56. package/dist/place/lines.js.map +1 -0
  57. package/dist/place/place.d.ts +77 -0
  58. package/dist/place/place.js +182 -0
  59. package/dist/place/place.js.map +1 -0
  60. package/dist/shared/errors.d.ts +40 -0
  61. package/dist/shared/errors.js +22 -0
  62. package/dist/shared/errors.js.map +1 -0
  63. package/dist/shared/git.d.ts +4 -0
  64. package/dist/shared/git.js +29 -0
  65. package/dist/shared/git.js.map +1 -0
  66. package/dist/shared/types.d.ts +56 -0
  67. package/dist/shared/types.js +3 -0
  68. package/dist/shared/types.js.map +1 -0
  69. package/package.json +61 -0
  70. package/src/marks/marks.css +361 -0
@@ -0,0 +1,206 @@
1
+ // How requests reach GitHub's GraphQL API: through the GitHub CLI, or with a
2
+ // token the host supplies. Neither stores a token or puts one in an error.
3
+ import { spawn } from "node:child_process";
4
+ import { ReviewError, scrub } from "../shared/errors.js";
5
+ /** The oldest `gh` this package runs. */
6
+ export const MIN_GH_VERSION = "2.0.0";
7
+ /**
8
+ * A transport that runs `gh api graphql` with a fixed argument list: the
9
+ * query on standard input, each variable as an argument. `gh` uses its own
10
+ * sign-in for the host.
11
+ */
12
+ export function ghTransport(options = {}) {
13
+ const host = options.host ?? "github.com";
14
+ const command = options.command ?? "gh";
15
+ let checked;
16
+ return {
17
+ async graphql(query, variables) {
18
+ checked ??= checkGh(command);
19
+ try {
20
+ await checked;
21
+ }
22
+ catch (error) {
23
+ checked = undefined;
24
+ throw error;
25
+ }
26
+ const args = ["api", "graphql", "--hostname", host, "-F", "query=@-"];
27
+ for (const [name, value] of Object.entries(variables)) {
28
+ if (value === undefined)
29
+ continue;
30
+ if (typeof value === "string")
31
+ args.push("-f", `${name}=${value}`);
32
+ else if (typeof value === "number" || typeof value === "boolean" || value === null) {
33
+ args.push("-F", `${name}=${String(value)}`);
34
+ }
35
+ else {
36
+ throw new TypeError(`ghTransport can't pass the variable ${name}: ${typeof value}`);
37
+ }
38
+ }
39
+ const result = await run(command, args, query);
40
+ const body = parseBody(result.stdout);
41
+ if (result.code === 0 && body !== undefined && body.errors === undefined) {
42
+ return body.data;
43
+ }
44
+ throw ghError(result, body, host);
45
+ },
46
+ };
47
+ }
48
+ async function checkGh(command) {
49
+ const result = await run(command, ["--version"], "");
50
+ const version = /gh version (\d+)\.(\d+)\.(\d+)/.exec(result.stdout);
51
+ if (result.code !== 0 || version === null) {
52
+ throw new ReviewError("gh-too-old", "Couldn't read the GitHub CLI's version (`gh --version`).");
53
+ }
54
+ const found = version.slice(1, 4).map(Number);
55
+ const min = MIN_GH_VERSION.split(".").map(Number);
56
+ for (let i = 0; i < 3; i++) {
57
+ const a = found[i] ?? 0;
58
+ const b = min[i] ?? 0;
59
+ if (a > b)
60
+ return;
61
+ if (a < b) {
62
+ throw new ReviewError("gh-too-old", `The GitHub CLI is version ${found.join(".")}; review needs ${MIN_GH_VERSION} or later. Update it from https://cli.github.com.`);
63
+ }
64
+ }
65
+ }
66
+ function run(command, args, input) {
67
+ return new Promise((resolve, reject) => {
68
+ const child = spawn(command, args, {
69
+ stdio: ["pipe", "pipe", "pipe"],
70
+ env: { ...process.env, GH_PROMPT_DISABLED: "1", GH_NO_UPDATE_NOTIFIER: "1", NO_COLOR: "1" },
71
+ windowsHide: true,
72
+ });
73
+ const stdout = [];
74
+ const stderr = [];
75
+ child.stdout.on("data", (chunk) => stdout.push(chunk));
76
+ child.stderr.on("data", (chunk) => stderr.push(chunk));
77
+ child.on("error", (error) => {
78
+ if (error.code === "ENOENT") {
79
+ reject(new ReviewError("gh-missing", "The GitHub CLI (`gh`) isn't on the path. Install it from https://cli.github.com and run `gh auth login`.", { cause: error }));
80
+ }
81
+ else {
82
+ reject(new ReviewError("network", `Couldn't run \`gh\`: ${error.message}`, { cause: error }));
83
+ }
84
+ });
85
+ child.on("close", (code) => {
86
+ resolve({
87
+ code: code ?? 1,
88
+ stdout: Buffer.concat(stdout).toString("utf8"),
89
+ stderr: Buffer.concat(stderr).toString("utf8"),
90
+ });
91
+ });
92
+ // gh may exit before reading its input; the exit code says what happened.
93
+ child.stdin.on("error", () => undefined);
94
+ child.stdin.end(input);
95
+ });
96
+ }
97
+ function parseBody(text) {
98
+ try {
99
+ const value = JSON.parse(text);
100
+ return typeof value === "object" && value !== null ? value : undefined;
101
+ }
102
+ catch {
103
+ return undefined;
104
+ }
105
+ }
106
+ function ghError(result, body, host) {
107
+ const stderr = result.stderr.replace(/^gh: /gm, "").trim();
108
+ // gh exits with 4 when a command needs authentication it doesn't have.
109
+ if (result.code === 4 ||
110
+ /gh auth login|not logged in|HTTP 401|Bad credentials/i.test(result.stderr)) {
111
+ return new ReviewError("not-signed-in", `The GitHub CLI isn't signed in to ${host}. Run \`gh auth login --hostname ${host}\`.`);
112
+ }
113
+ if (body?.errors !== undefined)
114
+ return graphqlError(body.errors);
115
+ if (/rate limit/i.test(stderr))
116
+ return rateLimited(undefined, stderr);
117
+ return new ReviewError("refused", `GitHub refused the request: ${stderr || body?.message || `gh exited with ${result.code}`}`);
118
+ }
119
+ function graphqlError(errors) {
120
+ const message = errors.map((error) => error.message ?? "unknown error").join("; ");
121
+ if (errors.some((error) => error.type === "RATE_LIMITED"))
122
+ return rateLimited(undefined, message);
123
+ if (errors.every((error) => error.type === "NOT_FOUND")) {
124
+ return new ReviewError("not-found", `GitHub couldn't find it: ${message}`);
125
+ }
126
+ return new ReviewError("refused", `GitHub refused the request: ${message}`);
127
+ }
128
+ function rateLimited(retryAfter, detail) {
129
+ const wait = retryAfter === undefined
130
+ ? "Wait a minute"
131
+ : `Wait ${retryAfter} second${retryAfter === 1 ? "" : "s"}`;
132
+ return new ReviewError("rate-limited", `GitHub is limiting how fast requests can be made. ${wait} and try again. (${detail})`, retryAfter === undefined ? {} : { retryAfter });
133
+ }
134
+ /**
135
+ * A transport that posts to the GraphQL API with `fetch`, using a token from
136
+ * `getToken`, which is called for each request so the host can refresh it.
137
+ */
138
+ export function tokenTransport(getToken, options = {}) {
139
+ const host = options.host ?? "github.com";
140
+ const url = graphqlUrl(host);
141
+ return {
142
+ async graphql(query, variables) {
143
+ const doFetch = options.fetch ?? globalThis.fetch;
144
+ const token = await getToken();
145
+ if (token === undefined || token === "") {
146
+ throw new ReviewError("not-signed-in", `There's no GitHub sign-in for ${host}.`);
147
+ }
148
+ let response;
149
+ try {
150
+ response = await doFetch(url, {
151
+ method: "POST",
152
+ headers: {
153
+ authorization: `bearer ${token}`,
154
+ "content-type": "application/json",
155
+ accept: "application/json",
156
+ "user-agent": "ascribe-review",
157
+ },
158
+ body: JSON.stringify({ query, variables }),
159
+ });
160
+ }
161
+ catch (error) {
162
+ const detail = error instanceof Error ? error.message : String(error);
163
+ throw new ReviewError("network", `Couldn't reach ${host}: ${detail}`, { cause: error });
164
+ }
165
+ const text = await response.text();
166
+ const body = parseBody(text);
167
+ if (response.status === 401) {
168
+ throw new ReviewError("not-signed-in", `${host} didn't accept the GitHub sign-in.`);
169
+ }
170
+ if (response.status === 403 || response.status === 429) {
171
+ const retryAfter = retryAfterOf(response.headers);
172
+ if (response.status === 429 ||
173
+ retryAfter !== undefined ||
174
+ /rate limit/i.test(body?.message ?? text)) {
175
+ throw rateLimited(retryAfter, scrub(body?.message ?? `HTTP ${response.status}`));
176
+ }
177
+ }
178
+ if (!response.ok) {
179
+ throw new ReviewError("refused", `GitHub refused the request (HTTP ${response.status}): ${scrub(body?.message ?? text.slice(0, 200))}`);
180
+ }
181
+ if (body === undefined) {
182
+ throw new ReviewError("network", `${host} answered with something that isn't JSON.`);
183
+ }
184
+ if (body.errors !== undefined && body.errors.length > 0)
185
+ throw graphqlError(body.errors);
186
+ return body.data;
187
+ },
188
+ };
189
+ }
190
+ /** The GraphQL endpoint for a host. */
191
+ export function graphqlUrl(host) {
192
+ return host === "github.com" ? "https://api.github.com/graphql" : `https://${host}/api/graphql`;
193
+ }
194
+ function retryAfterOf(headers) {
195
+ const after = headers.get("retry-after");
196
+ if (after !== null && /^\d+$/.test(after))
197
+ return Number(after);
198
+ if (headers.get("x-ratelimit-remaining") === "0") {
199
+ const reset = Number(headers.get("x-ratelimit-reset"));
200
+ if (Number.isFinite(reset) && reset > 0) {
201
+ return Math.max(0, Math.ceil(reset - Date.now() / 1000));
202
+ }
203
+ }
204
+ return undefined;
205
+ }
206
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/github/transport.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,2EAA2E;AAC3E,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAOzD,yCAAyC;AACzC,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AAUtC;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,OAAO,GAAuB,EAAE;IAC1D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,YAAY,CAAC;IAC1C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;IACxC,IAAI,OAAkC,CAAC;IACvC,OAAO;QACL,KAAK,CAAC,OAAO,CAAI,KAAa,EAAE,SAAkC;YAChE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC;YAChB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,GAAG,SAAS,CAAC;gBACpB,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;YACtE,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBACtD,IAAI,KAAK,KAAK,SAAS;oBAAE,SAAS;gBAClC,IAAI,OAAO,KAAK,KAAK,QAAQ;oBAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC;qBAC9D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBACnF,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC9C,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,SAAS,CAAC,uCAAuC,IAAI,KAAK,OAAO,KAAK,EAAE,CAAC,CAAC;gBACtF,CAAC;YACH,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAC/C,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzE,OAAO,IAAI,CAAC,IAAS,CAAC;YACxB,CAAC;YACD,MAAM,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACpC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,OAAe;IACpC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,gCAAgC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrE,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAC1C,MAAM,IAAI,WAAW,CAAC,YAAY,EAAE,0DAA0D,CAAC,CAAC;IAClG,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO;QAClB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACV,MAAM,IAAI,WAAW,CACnB,YAAY,EACZ,6BAA6B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,cAAc,mDAAmD,CAChI,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAQD,SAAS,GAAG,CAAC,OAAe,EAAE,IAAc,EAAE,KAAa;IACzD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;YACjC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,kBAAkB,EAAE,GAAG,EAAE,qBAAqB,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE;YAC3F,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QACH,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/D,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/D,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAA4B,EAAE,EAAE;YACjD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC5B,MAAM,CACJ,IAAI,WAAW,CACb,YAAY,EACZ,0GAA0G,EAC1G,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CACF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,CACJ,IAAI,WAAW,CAAC,SAAS,EAAE,wBAAwB,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CACtF,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,OAAO,CAAC;gBACN,IAAI,EAAE,IAAI,IAAI,CAAC;gBACf,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC9C,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;aAC/C,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,0EAA0E;QAC1E,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACzC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAaD,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,CAAC;QACH,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAE,KAAqB,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,MAAiB,EAAE,IAA6B,EAAE,IAAY;IAC7E,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3D,uEAAuE;IACvE,IACE,MAAM,CAAC,IAAI,KAAK,CAAC;QACjB,uDAAuD,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAC3E,CAAC;QACD,OAAO,IAAI,WAAW,CACpB,eAAe,EACf,qCAAqC,IAAI,oCAAoC,IAAI,KAAK,CACvF,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,EAAE,MAAM,KAAK,SAAS;QAAE,OAAO,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjE,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACtE,OAAO,IAAI,WAAW,CACpB,SAAS,EACT,+BAA+B,MAAM,IAAI,IAAI,EAAE,OAAO,IAAI,kBAAkB,MAAM,CAAC,IAAI,EAAE,EAAE,CAC5F,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,MAAsB;IAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnF,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC;QAAE,OAAO,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAClG,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,EAAE,CAAC;QACxD,OAAO,IAAI,WAAW,CAAC,WAAW,EAAE,4BAA4B,OAAO,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,IAAI,WAAW,CAAC,SAAS,EAAE,+BAA+B,OAAO,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,WAAW,CAAC,UAA8B,EAAE,MAAc;IACjE,MAAM,IAAI,GACR,UAAU,KAAK,SAAS;QACtB,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,QAAQ,UAAU,UAAU,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAChE,OAAO,IAAI,WAAW,CACpB,cAAc,EACd,qDAAqD,IAAI,oBAAoB,MAAM,GAAG,EACtF,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAC/C,CAAC;AACJ,CAAC;AAUD;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAgE,EAChE,OAAO,GAA0B,EAAE;IAEnC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,YAAY,CAAC;IAC1C,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO;QACL,KAAK,CAAC,OAAO,CAAI,KAAa,EAAE,SAAkC;YAChE,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;YAClD,MAAM,KAAK,GAAG,MAAM,QAAQ,EAAE,CAAC;YAC/B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;gBACxC,MAAM,IAAI,WAAW,CAAC,eAAe,EAAE,iCAAiC,IAAI,GAAG,CAAC,CAAC;YACnF,CAAC;YACD,IAAI,QAAkB,CAAC;YACvB,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE;oBAC5B,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP,aAAa,EAAE,UAAU,KAAK,EAAE;wBAChC,cAAc,EAAE,kBAAkB;wBAClC,MAAM,EAAE,kBAAkB;wBAC1B,YAAY,EAAE,gBAAgB;qBAC/B;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;iBAC3C,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACtE,MAAM,IAAI,WAAW,CAAC,SAAS,EAAE,kBAAkB,IAAI,KAAK,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1F,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,MAAM,IAAI,WAAW,CAAC,eAAe,EAAE,GAAG,IAAI,oCAAoC,CAAC,CAAC;YACtF,CAAC;YACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACvD,MAAM,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAClD,IACE,QAAQ,CAAC,MAAM,KAAK,GAAG;oBACvB,UAAU,KAAK,SAAS;oBACxB,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,EACzC,CAAC;oBACD,MAAM,WAAW,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,IAAI,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACnF,CAAC;YACH,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,WAAW,CACnB,SAAS,EACT,oCAAoC,QAAQ,CAAC,MAAM,MAAM,KAAK,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CACtG,CAAC;YACJ,CAAC;YACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,MAAM,IAAI,WAAW,CAAC,SAAS,EAAE,GAAG,IAAI,2CAA2C,CAAC,CAAC;YACvF,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzF,OAAO,IAAI,CAAC,IAAS,CAAC;QACxB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,WAAW,IAAI,cAAc,CAAC;AAClG,CAAC;AAED,SAAS,YAAY,CAAC,OAAgB;IACpC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACzC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IAChE,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,KAAK,GAAG,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;QACvD,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,92 @@
1
+ /** Where a block is written: the anchor grammar's `source` and `via`. */
2
+ export interface Anchor {
3
+ source: string;
4
+ via: string[];
5
+ }
6
+ /** The words that differ inside a changed block of prose. */
7
+ export interface Words {
8
+ /** `[start, end)` ranges, in characters, of `now_text`. */
9
+ now: [number, number][];
10
+ /** `[start, end)` ranges, in characters, of `was_text`. */
11
+ was: [number, number][];
12
+ now_text: string;
13
+ was_text: string;
14
+ }
15
+ /** One block's change, as `ascribe diff --format json` writes it. */
16
+ export interface Change {
17
+ kind: "changed" | "added" | "removed" | "moved";
18
+ now?: Anchor;
19
+ was?: Anchor;
20
+ words?: Words;
21
+ after?: Anchor;
22
+ parent?: Anchor;
23
+ text?: string;
24
+ }
25
+ /** What the page shows: its changes, the page as it will be, or as it was. */
26
+ export type Show = "changes" | "will" | "was";
27
+ export interface MarkOptions {
28
+ /**
29
+ * The page as it was, rendered with anchors. Removed blocks, and moved
30
+ * blocks at their old place, are copied from it; without it they're shown
31
+ * from the change's `text`, and "as it was" shows changed prose from its
32
+ * words.
33
+ */
34
+ was?: ParentNode | null;
35
+ }
36
+ /** A change as marked on the page. */
37
+ export interface Mark {
38
+ change: Change;
39
+ /** The element to go to: the block now, or what stands for a removed one. */
40
+ element: HTMLElement;
41
+ }
42
+ /** A parsed anchor source: the path, decoded, and the lines. */
43
+ export interface Source {
44
+ path: string;
45
+ first: number;
46
+ last: number;
47
+ }
48
+ /** Parses `<path>:<first>-<last>`, splitting at the last `:`. */
49
+ export declare function parseSource(source: string): Source | undefined;
50
+ /** `guides/install.md:12`, or `guides/install.md:12-14`, and its includes. */
51
+ export declare function describeSource(source: string, via?: string | null): string;
52
+ /**
53
+ * The element of a block: the one with exactly its anchor, or, when there's
54
+ * none (a paragraph in a tight list item has no element of its own), the
55
+ * smallest anchored element with the same file and includes whose lines
56
+ * contain it.
57
+ */
58
+ export declare function findBlock(root: ParentNode, anchor: Anchor): HTMLElement | null;
59
+ /**
60
+ * Marks `changes` on the page in `root`, and returns the marks in page
61
+ * order. Marks already there are cleared first.
62
+ */
63
+ export declare function markChanges(root: HTMLElement, changes: readonly Change[], options?: MarkOptions): Mark[];
64
+ /**
65
+ * The button that selects an `<ascribe-tab>`, in its group's tab list, or
66
+ * null before `@ascribed/elements` has made the list.
67
+ */
68
+ export declare function tabButton(tab: Element): HTMLButtonElement | null;
69
+ /** Removes every mark from the page in `root`. */
70
+ export declare function clearMarks(root: HTMLElement): void;
71
+ /** Shows the changes, the page as it will be, or the page as it was. */
72
+ export declare function setShow(root: HTMLElement, show: Show): void;
73
+ /**
74
+ * Makes `element` visible: opens the `<details>` and selects the tabs it's
75
+ * in.
76
+ */
77
+ export declare function reveal(element: HTMLElement): void;
78
+ /** Reveals `element`, scrolls to it, and flashes it. */
79
+ export declare function goTo(element: HTMLElement): void;
80
+ /**
81
+ * Shows each block's source on hover and focus: `guides/install.md:12`,
82
+ * from its anchor. Returns a function that stops.
83
+ */
84
+ export declare function showSources(root: HTMLElement): () => void;
85
+ /**
86
+ * Takes out of a page's HTML what could run script or take the reader
87
+ * elsewhere: scripts, `<meta>` and `<base>`, event handler attributes, and
88
+ * `javascript:` URLs. A page under review comes from the change being
89
+ * reviewed, so a host disarms it before showing it, whatever its content
90
+ * security policy also blocks.
91
+ */
92
+ export declare function disarm(fragment: DocumentFragment): void;