@intentic/base 1.326.0 → 1.328.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 (98) hide show
  1. package/README.md +43 -7
  2. package/dist/acme/acme.d.ts.map +1 -0
  3. package/dist/{acme.js → acme/acme.js} +1 -1
  4. package/dist/acme/acme.js.map +1 -0
  5. package/dist/acme/authoritative-dns.d.ts.map +1 -0
  6. package/dist/acme/authoritative-dns.js.map +1 -0
  7. package/dist/acme/csr.d.ts.map +1 -0
  8. package/dist/acme/csr.js.map +1 -0
  9. package/dist/async.d.ts +55 -1
  10. package/dist/async.d.ts.map +1 -1
  11. package/dist/async.js +202 -19
  12. package/dist/async.js.map +1 -1
  13. package/dist/cloudflare.d.ts +21 -0
  14. package/dist/cloudflare.d.ts.map +1 -0
  15. package/dist/cloudflare.js +82 -0
  16. package/dist/cloudflare.js.map +1 -0
  17. package/dist/dag.d.ts +2 -0
  18. package/dist/dag.d.ts.map +1 -0
  19. package/dist/dag.js +21 -0
  20. package/dist/dag.js.map +1 -0
  21. package/dist/format.d.ts +3 -0
  22. package/dist/format.d.ts.map +1 -1
  23. package/dist/format.js +4 -1
  24. package/dist/format.js.map +1 -1
  25. package/dist/git/commands.d.ts +41 -0
  26. package/dist/git/commands.d.ts.map +1 -0
  27. package/dist/git/commands.js +84 -0
  28. package/dist/git/commands.js.map +1 -0
  29. package/dist/git/forker.d.ts +20 -0
  30. package/dist/git/forker.d.ts.map +1 -0
  31. package/dist/git/forker.js +32 -0
  32. package/dist/git/forker.js.map +1 -0
  33. package/dist/git/index.d.ts +5 -0
  34. package/dist/git/index.d.ts.map +1 -0
  35. package/dist/git/index.js +5 -0
  36. package/dist/git/index.js.map +1 -0
  37. package/dist/git/locks.d.ts +14 -0
  38. package/dist/git/locks.d.ts.map +1 -0
  39. package/dist/git/locks.js +71 -0
  40. package/dist/git/locks.js.map +1 -0
  41. package/dist/git/remote-http.d.ts +4 -0
  42. package/dist/git/remote-http.d.ts.map +1 -0
  43. package/dist/git/remote-http.js +8 -0
  44. package/dist/git/remote-http.js.map +1 -0
  45. package/dist/git/runner.d.ts +44 -0
  46. package/dist/git/runner.d.ts.map +1 -0
  47. package/dist/git/runner.js +294 -0
  48. package/dist/git/runner.js.map +1 -0
  49. package/dist/lifecycle.d.ts +7 -2
  50. package/dist/lifecycle.d.ts.map +1 -1
  51. package/dist/lifecycle.js +38 -0
  52. package/dist/lifecycle.js.map +1 -1
  53. package/dist/node/fs.d.ts +1 -0
  54. package/dist/node/fs.d.ts.map +1 -1
  55. package/dist/node/fs.js +16 -2
  56. package/dist/node/fs.js.map +1 -1
  57. package/dist/node/ws-tcp-pump.d.ts +33 -0
  58. package/dist/node/ws-tcp-pump.d.ts.map +1 -0
  59. package/dist/node/ws-tcp-pump.js +78 -0
  60. package/dist/node/ws-tcp-pump.js.map +1 -0
  61. package/dist/ssh-config.d.ts +5 -0
  62. package/dist/ssh-config.d.ts.map +1 -0
  63. package/dist/ssh-config.js +19 -0
  64. package/dist/ssh-config.js.map +1 -0
  65. package/dist/text/outside-text.d.ts.map +1 -0
  66. package/dist/text/outside-text.js.map +1 -0
  67. package/dist/text/plain-text.d.ts.map +1 -0
  68. package/dist/text/plain-text.js.map +1 -0
  69. package/dist/text/utf16-text.d.ts.map +1 -0
  70. package/dist/text/utf16-text.js.map +1 -0
  71. package/dist/text/utf8-text.d.ts +7 -0
  72. package/dist/text/utf8-text.d.ts.map +1 -0
  73. package/dist/text/utf8-text.js +39 -0
  74. package/dist/text/utf8-text.js.map +1 -0
  75. package/package.json +89 -22
  76. package/dist/acme.d.ts.map +0 -1
  77. package/dist/acme.js.map +0 -1
  78. package/dist/authoritative-dns.d.ts.map +0 -1
  79. package/dist/authoritative-dns.js.map +0 -1
  80. package/dist/csr.d.ts.map +0 -1
  81. package/dist/csr.js.map +0 -1
  82. package/dist/outside-text.d.ts.map +0 -1
  83. package/dist/outside-text.js.map +0 -1
  84. package/dist/plain-text.d.ts.map +0 -1
  85. package/dist/plain-text.js.map +0 -1
  86. package/dist/utf16-text.d.ts.map +0 -1
  87. package/dist/utf16-text.js.map +0 -1
  88. /package/dist/{acme.d.ts → acme/acme.d.ts} +0 -0
  89. /package/dist/{authoritative-dns.d.ts → acme/authoritative-dns.d.ts} +0 -0
  90. /package/dist/{authoritative-dns.js → acme/authoritative-dns.js} +0 -0
  91. /package/dist/{csr.d.ts → acme/csr.d.ts} +0 -0
  92. /package/dist/{csr.js → acme/csr.js} +0 -0
  93. /package/dist/{outside-text.d.ts → text/outside-text.d.ts} +0 -0
  94. /package/dist/{outside-text.js → text/outside-text.js} +0 -0
  95. /package/dist/{plain-text.d.ts → text/plain-text.d.ts} +0 -0
  96. /package/dist/{plain-text.js → text/plain-text.js} +0 -0
  97. /package/dist/{utf16-text.d.ts → text/utf16-text.d.ts} +0 -0
  98. /package/dist/{utf16-text.js → text/utf16-text.js} +0 -0
@@ -0,0 +1,82 @@
1
+ import { errorMessage } from "./errors.js";
2
+ export const CLOUDFLARE_API = "https://api.cloudflare.com/client/v4";
3
+ const TIMEOUT_MS = 30_000;
4
+ export const ZONE_OUT_OF_RECORDS = 81_045;
5
+ export class CloudflareError extends Error {
6
+ status;
7
+ codes;
8
+ constructor(message, status, codes) {
9
+ super(message);
10
+ this.status = status;
11
+ this.codes = codes;
12
+ }
13
+ }
14
+ export class CloudflareTokenError extends CloudflareError {
15
+ }
16
+ export class CloudflareZoneFullError extends CloudflareError {
17
+ }
18
+ const isJsonObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
19
+ const isProblem = (error) => isJsonObject(error) && typeof error["code"] === "number" && typeof error["message"] === "string";
20
+ const isEnvelope = (body) => typeof body === "object" &&
21
+ body !== null &&
22
+ !Array.isArray(body) &&
23
+ typeof body.success === "boolean" &&
24
+ Array.isArray(body.errors) &&
25
+ body.errors.every(isProblem);
26
+ const hasTotalPages = (info) => isJsonObject(info) && typeof info["total_pages"] === "number";
27
+ const request = async (token, path, init = {}) => {
28
+ const label = `Cloudflare API ${init.method ?? "GET"} ${path}`;
29
+ const started = Date.now();
30
+ const headers = new Headers({ Authorization: `Bearer ${token}` });
31
+ const sent = { headers, signal: AbortSignal.timeout(TIMEOUT_MS) };
32
+ if (init.method !== undefined) {
33
+ sent.method = init.method;
34
+ }
35
+ if (init.body !== undefined) {
36
+ headers.set("Content-Type", "application/json");
37
+ sent.body = JSON.stringify(init.body);
38
+ }
39
+ let response;
40
+ try {
41
+ response = await fetch(`${CLOUDFLARE_API}${path}`, sent);
42
+ }
43
+ catch (error) {
44
+ throw new Error(`${label} transport failed after ${Date.now() - started}ms: ${errorMessage(error)}`, { cause: error });
45
+ }
46
+ const body = await response.json().catch(() => undefined);
47
+ const envelope = isEnvelope(body) ? body : undefined;
48
+ const detail = envelope?.errors.map((error) => `${error.code} ${error.message}`).join("; ") ?? "";
49
+ const codes = envelope?.errors.map((error) => error.code) ?? [];
50
+ if (response.status === 401 || response.status === 403) {
51
+ throw new CloudflareTokenError(`${label} was refused (HTTP ${response.status}): ${detail || "the token is invalid or lacks the scope"}`, response.status, codes);
52
+ }
53
+ if (envelope === undefined) {
54
+ throw new Error(`${label} returned an unexpected response: not Cloudflare's envelope (HTTP ${response.status})`);
55
+ }
56
+ if (!response.ok || !envelope.success) {
57
+ const failed = `${label} failed (HTTP ${response.status}): ${detail}`;
58
+ throw codes.includes(ZONE_OUT_OF_RECORDS)
59
+ ? new CloudflareZoneFullError(`${failed} (the zone is out of DNS records, Cloudflare's per-zone quota)`, response.status, codes)
60
+ : new CloudflareError(failed, response.status, codes);
61
+ }
62
+ return envelope;
63
+ };
64
+ export const cloudflareCall = async (token, path, init) => (await request(token, path, init)).result;
65
+ export const cloudflarePages = async (token, path, perPage = 50) => {
66
+ const items = [];
67
+ let page = 1;
68
+ let totalPages = 1;
69
+ do {
70
+ const paged = `${path}${path.includes("?") ? "&" : "?"}per_page=${perPage}&page=${page}`;
71
+ const envelope = await request(token, paged);
72
+ const { result, result_info: info } = envelope;
73
+ if (!Array.isArray(result)) {
74
+ throw new Error(`Cloudflare API GET ${paged} returned an unexpected response: a page that is not a list`);
75
+ }
76
+ items.push(...result);
77
+ totalPages = hasTotalPages(info) ? info.total_pages : 1;
78
+ page += 1;
79
+ } while (page <= totalPages);
80
+ return items;
81
+ };
82
+ //# sourceMappingURL=cloudflare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare.js","sourceRoot":"","sources":["../src/cloudflare.ts"],"names":[],"mappings":"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"}
package/dist/dag.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare const dagLayers: <T>(items: readonly T[], idOf: (item: T) => string, needsOf: (item: T) => readonly string[]) => T[][];
2
+ //# sourceMappingURL=dag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dag.d.ts","sourceRoot":"","sources":["../src/dag.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,SAAS,CAAC,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC,KAAK,SAAS,MAAM,EAAE,KAAG,CAAC,EAAE,EAmBzH,CAAC"}
package/dist/dag.js ADDED
@@ -0,0 +1,21 @@
1
+ export const dagLayers = (items, idOf, needsOf) => {
2
+ const unplaced = new Map();
3
+ for (const item of items) {
4
+ unplaced.set(idOf(item), (unplaced.get(idOf(item)) ?? 0) + 1);
5
+ }
6
+ const settled = (item, need) => need === idOf(item) || (unplaced.get(need) ?? 0) === 0;
7
+ const layers = [];
8
+ let waiting = [...items];
9
+ while (waiting.length > 0) {
10
+ const ready = waiting.filter((item) => needsOf(item).every((need) => settled(item, need)));
11
+ const layer = ready.length > 0 ? ready : waiting;
12
+ const placed = new Set(layer);
13
+ for (const item of layer) {
14
+ unplaced.set(idOf(item), (unplaced.get(idOf(item)) ?? 1) - 1);
15
+ }
16
+ layers.push(layer);
17
+ waiting = waiting.filter((item) => !placed.has(item));
18
+ }
19
+ return layers;
20
+ };
21
+ //# sourceMappingURL=dag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dag.js","sourceRoot":"","sources":["../src/dag.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,SAAS,GAAG,CAAI,KAAmB,EAAE,IAAyB,EAAE,OAAuC,EAAS,EAAE;IAC3H,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,IAAO,EAAE,IAAY,EAAW,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;IAC3G,MAAM,MAAM,GAAU,EAAE,CAAC;IACzB,IAAI,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACzB,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3F,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC"}
package/dist/format.d.ts CHANGED
@@ -1,5 +1,8 @@
1
1
  export declare const sizeLabel: (bytes: number) => string;
2
+ export declare const CHARS_PER_TOKEN = 4;
3
+ export declare const tokensOfChars: (chars: number) => number;
2
4
  export declare const estimateTokens: (text: string) => number;
5
+ export declare const charsOfTokens: (tokens: number) => number;
3
6
  export declare const plural: (count: number, one: string, many?: string) => string;
4
7
  export declare const escapeHtml: (text: string) => string;
5
8
  export declare const clamp: (value: number, min: number, max: number) => number;
@@ -1 +1 @@
1
- {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,SAAS,UAAW,MAAM,KAAG,MAGzC,CAAC;AAIF,eAAO,MAAM,cAAc,SAAU,MAAM,KAAG,MAAoC,CAAC;AAInF,eAAO,MAAM,MAAM,UAAW,MAAM,OAAO,MAAM,SAAS,MAAM,KAAG,MACkC,CAAC;AAMtG,eAAO,MAAM,UAAU,SAAU,MAAM,KAAG,MAAmE,CAAC;AAG9G,eAAO,MAAM,KAAK,UAAW,MAAM,OAAO,MAAM,OAAO,MAAM,KAAG,MAA6C,CAAC;AAI9G,eAAO,MAAM,aAAa,YAAa,MAAM,KAAG,MAA0E,CAAC"}
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,SAAS,UAAW,MAAM,KAAG,MAGzC,CAAC;AAKF,eAAO,MAAM,eAAe,IAAI,CAAC;AACjC,eAAO,MAAM,aAAa,UAAW,MAAM,KAAG,MAA4C,CAAC;AAC3F,eAAO,MAAM,cAAc,SAAU,MAAM,KAAG,MAAoC,CAAC;AAEnF,eAAO,MAAM,aAAa,WAAY,MAAM,KAAG,MAAkC,CAAC;AAIlF,eAAO,MAAM,MAAM,UAAW,MAAM,OAAO,MAAM,SAAS,MAAM,KAAG,MACkC,CAAC;AAMtG,eAAO,MAAM,UAAU,SAAU,MAAM,KAAG,MAAmE,CAAC;AAG9G,eAAO,MAAM,KAAK,UAAW,MAAM,OAAO,MAAM,OAAO,MAAM,KAAG,MAA6C,CAAC;AAI9G,eAAO,MAAM,aAAa,YAAa,MAAM,KAAG,MAA0E,CAAC"}
package/dist/format.js CHANGED
@@ -3,7 +3,10 @@ export const sizeLabel = (bytes) => {
3
3
  const index = Math.min(SIZE_UNITS.length - 1, bytes === 0 ? 0 : Math.floor(Math.log(bytes) / Math.log(1024)));
4
4
  return `${(bytes / 1024 ** index).toFixed(index === 0 ? 0 : 1)} ${SIZE_UNITS[index]}`;
5
5
  };
6
- export const estimateTokens = (text) => Math.ceil(text.length / 4);
6
+ export const CHARS_PER_TOKEN = 4;
7
+ export const tokensOfChars = (chars) => Math.ceil(chars / CHARS_PER_TOKEN);
8
+ export const estimateTokens = (text) => tokensOfChars(text.length);
9
+ export const charsOfTokens = (tokens) => tokens * CHARS_PER_TOKEN;
7
10
  export const plural = (count, one, many) => `${count} ${count === 1 ? one : (many ?? (/(s|x|z|ch|sh)$/.test(one) ? `${one}es` : `${one}s`))}`;
8
11
  const HTML_ENTITIES = { "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" };
9
12
  export const escapeHtml = (text) => text.replace(/[&<>"']/g, (ch) => HTML_ENTITIES[ch] ?? ch);
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAI3C,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAa,EAAU,EAAE;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9G,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,IAAI,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;AAC1F,CAAC,CAAC;AAIF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAInF,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,IAAa,EAAU,EAAE,CACxE,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC;AAEtG,MAAM,aAAa,GAA2B,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AAItH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAG9G,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,EAAU,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAI9G,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC"}
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAK3C,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAa,EAAU,EAAE;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9G,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,IAAI,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;AAC1F,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AACjC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC,CAAC;AAC3F,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAEnF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAc,EAAU,EAAE,CAAC,MAAM,GAAG,eAAe,CAAC;AAIlF,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,IAAa,EAAU,EAAE,CACxE,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC;AAEtG,MAAM,aAAa,GAA2B,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AAItH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAG9G,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,EAAU,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAI9G,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { type GitRunner } from "./runner.js";
2
+ export declare const gitInit: (dir: string, separateGitDir?: string, git?: GitRunner) => Promise<void>;
3
+ export interface GitCloneOptions {
4
+ readonly branch?: string;
5
+ readonly authHeader?: string;
6
+ readonly separateGitDir?: string;
7
+ }
8
+ export declare const gitClone: (parentDir: string, name: string, cloneUrl: string, options?: GitCloneOptions, git?: GitRunner) => Promise<void>;
9
+ export interface GitStatus {
10
+ readonly branch: string;
11
+ readonly dirty: boolean;
12
+ readonly files: string[];
13
+ }
14
+ export declare const gitStatus: (dir: string, git?: GitRunner) => Promise<GitStatus>;
15
+ export declare const gitStageAll: (dir: string, git?: GitRunner) => Promise<void>;
16
+ export declare const gitCommitAll: (dir: string, message: string, author: {
17
+ readonly name: string;
18
+ readonly email: string;
19
+ }, git?: GitRunner) => Promise<boolean>;
20
+ export declare const gitCheckout: (dir: string, ref: string, git?: GitRunner) => Promise<void>;
21
+ export declare const gitHead: (dir: string, git?: GitRunner) => Promise<string>;
22
+ export declare const gitFullHead: (dir: string, git?: GitRunner) => Promise<string>;
23
+ export declare const gitListFiles: (dir: string, git?: GitRunner) => Promise<string[]>;
24
+ export type GitSyncResult = {
25
+ readonly status: "updated";
26
+ readonly behind: number;
27
+ readonly head: string;
28
+ } | {
29
+ readonly status: "current";
30
+ } | {
31
+ readonly status: "dirty";
32
+ readonly behind: number;
33
+ } | {
34
+ readonly status: "diverged";
35
+ readonly ahead: number;
36
+ readonly behind: number;
37
+ } | {
38
+ readonly status: "no-remote";
39
+ };
40
+ export declare const gitSync: (dir: string, git?: GitRunner) => Promise<GitSyncResult>;
41
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/git/commands.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAMzD,eAAO,MAAM,OAAO,QAAe,MAAM,mBAAmB,MAAM,QAAO,SAAS,KAAgB,OAAO,CAAC,IAAI,CAO7G,CAAC;AAEF,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAGzB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAE7B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CACpC;AAID,eAAO,MAAM,QAAQ,cACN,MAAM,QACX,MAAM,YACF,MAAM,YACN,eAAe,QACpB,SAAS,KACf,OAAO,CAAC,IAAI,CAgBd,CAAC;AAQF,MAAM,WAAW,SAAS;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAExB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,eAAO,MAAM,SAAS,QAAe,MAAM,QAAO,SAAS,KAAgB,OAAO,CAAC,SAAS,CAM3F,CAAC;AAIF,eAAO,MAAM,WAAW,QAAe,MAAM,QAAO,SAAS,KAAgB,OAAO,CAAC,IAAI,CAQxF,CAAC;AAIF,eAAO,MAAM,YAAY,QAChB,MAAM,WACF,MAAM,UACP;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,QACpD,SAAS,KACf,OAAO,CAAC,OAAO,CASjB,CAAC;AAGF,eAAO,MAAM,WAAW,QAAe,MAAM,OAAO,MAAM,QAAO,SAAS,KAAgB,OAAO,CAAC,IAAI,CAErG,CAAC;AAGF,eAAO,MAAM,OAAO,QAAe,MAAM,QAAO,SAAS,KAAgB,OAAO,CAAC,MAAM,CACnB,CAAC;AAIrE,eAAO,MAAM,WAAW,QAAe,MAAM,QAAO,SAAS,KAAgB,OAAO,CAAC,MAAM,CAA0D,CAAC;AAGtJ,eAAO,MAAM,YAAY,QAAe,MAAM,QAAO,SAAS,KAAgB,OAAO,CAAC,MAAM,EAAE,CAIxD,CAAC;AAEvC,MAAM,MAAM,aAAa,GACnB;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9E;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GAC9B;IAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAChF;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAAE,CAAC;AAIvC,eAAO,MAAM,OAAO,QAAe,MAAM,QAAO,SAAS,KAAgB,OAAO,CAAC,aAAa,CA2B7F,CAAC"}
@@ -0,0 +1,84 @@
1
+ import { mkdir } from "node:fs/promises";
2
+ import { dirname } from "node:path";
3
+ import { gitHeaderEnv } from "./remote-http.js";
4
+ import { defaultGit } from "./runner.js";
5
+ export const gitInit = async (dir, separateGitDir, git = defaultGit) => {
6
+ await mkdir(dir, { recursive: true });
7
+ if (separateGitDir !== undefined) {
8
+ await mkdir(dirname(separateGitDir), { recursive: true });
9
+ }
10
+ await git(dir, ["init", "-q", "--initial-branch=main", ...(separateGitDir !== undefined ? [`--separate-git-dir=${separateGitDir}`] : [])]);
11
+ };
12
+ export const gitClone = async (parentDir, name, cloneUrl, options, git = defaultGit) => {
13
+ if (options?.separateGitDir !== undefined) {
14
+ await mkdir(dirname(options.separateGitDir), { recursive: true });
15
+ }
16
+ await git(parentDir, [
17
+ "clone",
18
+ ...(options?.branch !== undefined ? ["--branch", options.branch] : []),
19
+ ...(options?.separateGitDir !== undefined ? [`--separate-git-dir=${options.separateGitDir}`] : []),
20
+ cloneUrl,
21
+ name,
22
+ ], options?.authHeader !== undefined ? gitHeaderEnv(options.authHeader) : undefined);
23
+ };
24
+ const porcelainFiles = (stdout) => stdout
25
+ .split("\n")
26
+ .map((line) => line.trim())
27
+ .filter((line) => line !== "");
28
+ export const gitStatus = async (dir, git = defaultGit) => {
29
+ const [branchOut, statusOut] = await Promise.all([git(dir, ["rev-parse", "--abbrev-ref", "HEAD"]), git(dir, ["status", "--porcelain"])]);
30
+ const branch = branchOut.stdout.trim();
31
+ const files = porcelainFiles(statusOut.stdout);
32
+ return { branch, dirty: files.length > 0, files };
33
+ };
34
+ export const gitStageAll = async (dir, git = defaultGit) => {
35
+ try {
36
+ await git(dir, ["-c", "advice.addEmbeddedRepo=false", "add", "-A", "--ignore-errors"]);
37
+ }
38
+ catch (error) {
39
+ if (error.code !== 1) {
40
+ throw error;
41
+ }
42
+ }
43
+ };
44
+ export const gitCommitAll = async (dir, message, author, git = defaultGit) => {
45
+ await gitStageAll(dir, git);
46
+ if ((await git(dir, ["diff", "--cached", "--name-only", "-z"])).stdout === "") {
47
+ return false;
48
+ }
49
+ await git(dir, ["-c", `user.name=${author.name}`, "-c", `user.email=${author.email}`, "commit", "--no-verify", "-m", message]);
50
+ return true;
51
+ };
52
+ export const gitCheckout = async (dir, ref, git = defaultGit) => {
53
+ await git(dir, ["checkout", "--detach", "-q", ref]);
54
+ };
55
+ export const gitHead = async (dir, git = defaultGit) => (await git(dir, ["rev-parse", "--short", "HEAD"])).stdout.trim();
56
+ export const gitFullHead = async (dir, git = defaultGit) => (await git(dir, ["rev-parse", "HEAD"])).stdout.trim();
57
+ export const gitListFiles = async (dir, git = defaultGit) => (await git(dir, ["ls-files"])).stdout
58
+ .split("\n")
59
+ .map((line) => line.trim())
60
+ .filter((line) => line !== "");
61
+ export const gitSync = async (dir, git = defaultGit) => {
62
+ const remotes = (await git(dir, ["remote"])).stdout.split("\n").map((line) => line.trim());
63
+ if (!remotes.includes("origin")) {
64
+ return { status: "no-remote" };
65
+ }
66
+ await git(dir, ["fetch", "--quiet", "origin"]);
67
+ const upstream = await git(dir, ["rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{u}"]).then((r) => r.stdout.trim(), () => "");
68
+ if (upstream === "") {
69
+ return { status: "no-remote" };
70
+ }
71
+ const [behind = 0, ahead = 0] = (await git(dir, ["rev-list", "--left-right", "--count", "@{u}...HEAD"])).stdout.trim().split(/\s+/).map(Number);
72
+ if (behind === 0) {
73
+ return { status: "current" };
74
+ }
75
+ if (porcelainFiles((await git(dir, ["status", "--porcelain"])).stdout).length > 0) {
76
+ return { status: "dirty", behind };
77
+ }
78
+ if (ahead > 0) {
79
+ return { status: "diverged", ahead, behind };
80
+ }
81
+ await git(dir, ["merge", "--ff-only", "--quiet", "@{u}"]);
82
+ return { status: "updated", behind, head: await gitHead(dir, git) };
83
+ };
84
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/git/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface ForkRequest {
2
+ readonly id: number;
3
+ readonly command: string;
4
+ readonly args: readonly string[];
5
+ readonly maxBuffer: number;
6
+ readonly timeout?: number;
7
+ readonly cwd?: string;
8
+ readonly env?: Readonly<Record<string, string | undefined>>;
9
+ }
10
+ export interface ForkResponse {
11
+ readonly id: number;
12
+ readonly stdout: string;
13
+ readonly stderr: string;
14
+ readonly execMs: number;
15
+ readonly failure?: {
16
+ readonly message: string;
17
+ readonly code?: number | string;
18
+ };
19
+ }
20
+ //# sourceMappingURL=forker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forker.d.ts","sourceRoot":"","sources":["../../src/git/forker.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAE1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAEtB,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;CAC/D;AAID,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;CACpF"}
@@ -0,0 +1,32 @@
1
+ import { execFile } from "node:child_process";
2
+ const send = process.send?.bind(process);
3
+ if (send === undefined) {
4
+ throw new Error("the forker started without an IPC channel");
5
+ }
6
+ process.on("message", (request) => {
7
+ const from = process.hrtime.bigint();
8
+ execFile(request.command, [...request.args], {
9
+ maxBuffer: request.maxBuffer,
10
+ ...(request.timeout !== undefined ? { timeout: request.timeout } : {}),
11
+ ...(request.cwd !== undefined ? { cwd: request.cwd } : {}),
12
+ ...(request.env !== undefined ? { env: request.env } : {}),
13
+ }, (error, stdout, stderr) => {
14
+ const response = {
15
+ id: request.id,
16
+ stdout,
17
+ stderr,
18
+ execMs: Number(process.hrtime.bigint() - from) / 1e6,
19
+ ...(error === null
20
+ ? {}
21
+ : {
22
+ failure: {
23
+ message: error.message,
24
+ ...(error.code !== undefined && error.code !== null ? { code: error.code } : {}),
25
+ },
26
+ }),
27
+ };
28
+ send(response);
29
+ });
30
+ });
31
+ process.on("disconnect", () => process.exit(0));
32
+ //# sourceMappingURL=forker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forker.js","sourceRoot":"","sources":["../../src/git/forker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AA6B9C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;AACzC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;IACrB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;AACjE,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAoB,EAAE,EAAE;IAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;IACrC,QAAQ,CACJ,OAAO,CAAC,OAAO,EACf,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,EACjB;QACI,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7D,EACD,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;QACtB,MAAM,QAAQ,GAAiB;YAC3B,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,MAAM;YACN,MAAM;YACN,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG;YAEpD,GAAG,CAAC,KAAK,KAAK,IAAI;gBACd,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC;oBACI,OAAO,EAAE;wBACL,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACnF;iBACJ,CAAC;SACX,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnB,CAAC,CACJ,CAAC;AACN,CAAC,CAAC,CAAC;AAGH,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from "./commands.js";
2
+ export * from "./locks.js";
3
+ export * from "./remote-http.js";
4
+ export * from "./runner.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/git/index.ts"],"names":[],"mappings":"AACA,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from "./commands.js";
2
+ export * from "./locks.js";
3
+ export * from "./remote-http.js";
4
+ export * from "./runner.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/git/index.ts"],"names":[],"mappings":"AACA,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC"}
@@ -0,0 +1,14 @@
1
+ export declare const STALE_LOCK_MS: number;
2
+ export declare const gitProcessRunning: (procRoot?: string) => Promise<boolean | undefined>;
3
+ export declare const contendedLockOf: (dir: string, stderr: string) => string | undefined;
4
+ export interface StaleLockCleared {
5
+ readonly path: string;
6
+ readonly ageMs: number;
7
+ }
8
+ export declare const observeStaleLocks: (observer: (cleared: StaleLockCleared) => void) => void;
9
+ export interface StaleLockProbe {
10
+ readonly now?: number;
11
+ readonly gitRunning?: () => Promise<boolean | undefined>;
12
+ }
13
+ export declare const clearStaleLock: (dir: string, stderr: string, probe?: StaleLockProbe) => Promise<StaleLockCleared | undefined>;
14
+ //# sourceMappingURL=locks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locks.d.ts","sourceRoot":"","sources":["../../src/git/locks.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,aAAa,QAAc,CAAC;AA+BzC,eAAO,MAAM,iBAAiB,yBAA+B,OAAO,CAAC,OAAO,GAAG,SAAS,CAiBvF,CAAC;AAIF,eAAO,MAAM,eAAe,QAAS,MAAM,UAAU,MAAM,KAAG,MAAM,GAAG,SAGtE,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CAC1B;AAOD,eAAO,MAAM,iBAAiB,aAAc,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,KAAG,IAEjF,CAAC;AAEF,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;CAC5D;AAOD,eAAO,MAAM,cAAc,QAAe,MAAM,UAAU,MAAM,UAAS,cAAc,KAAQ,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAyBlI,CAAC"}
@@ -0,0 +1,71 @@
1
+ import { lstat, readdir, readFile, rm } from "node:fs/promises";
2
+ import { basename, join, resolve } from "node:path";
3
+ export const STALE_LOCK_MS = 10 * 60_000;
4
+ const isGitName = (name) => name === "git" || name.startsWith("git-");
5
+ const vanished = (error) => ["ENOENT", "ESRCH"].includes(String(error.code));
6
+ const readProcFile = (path) => readFile(path, "utf8").catch((error) => {
7
+ if (vanished(error)) {
8
+ return "";
9
+ }
10
+ throw error;
11
+ });
12
+ const processIsGit = async (pidDir) => {
13
+ const comm = (await readProcFile(join(pidDir, "comm"))).trim();
14
+ if (isGitName(comm)) {
15
+ return true;
16
+ }
17
+ const argv0 = (await readProcFile(join(pidDir, "cmdline"))).split("\0")[0] ?? "";
18
+ return argv0 !== "" && isGitName(basename(argv0));
19
+ };
20
+ export const gitProcessRunning = async (procRoot = "/proc") => {
21
+ try {
22
+ const pids = (await readdir(procRoot)).filter((name) => /^\d+$/.test(name));
23
+ if (pids.length === 0) {
24
+ return undefined;
25
+ }
26
+ for (const pid of pids) {
27
+ if (await processIsGit(join(procRoot, pid))) {
28
+ return true;
29
+ }
30
+ }
31
+ return false;
32
+ }
33
+ catch {
34
+ return undefined;
35
+ }
36
+ };
37
+ export const contendedLockOf = (dir, stderr) => {
38
+ const named = /Unable to create '([^']+\.lock)': File exists/.exec(stderr)?.[1];
39
+ return named === undefined ? undefined : resolve(dir, named);
40
+ };
41
+ let staleLockObserver = ({ path, ageMs }) => console.warn(`git: removed a stale lock ${path} (${Math.round(ageMs / 60_000)} min old, no git process running)`);
42
+ export const observeStaleLocks = (observer) => {
43
+ staleLockObserver = observer;
44
+ };
45
+ export const clearStaleLock = async (dir, stderr, probe = {}) => {
46
+ const path = contendedLockOf(dir, stderr);
47
+ if (path === undefined) {
48
+ return undefined;
49
+ }
50
+ const stats = await lstat(path).catch((error) => {
51
+ if (vanished(error)) {
52
+ return undefined;
53
+ }
54
+ throw error;
55
+ });
56
+ if (stats === undefined || !stats.isFile()) {
57
+ return undefined;
58
+ }
59
+ const ageMs = (probe.now ?? Date.now()) - stats.mtimeMs;
60
+ if (ageMs <= STALE_LOCK_MS) {
61
+ return undefined;
62
+ }
63
+ if ((await (probe.gitRunning ?? gitProcessRunning)()) !== false) {
64
+ return undefined;
65
+ }
66
+ await rm(path, { force: true });
67
+ const cleared = { path, ageMs };
68
+ staleLockObserver(cleared);
69
+ return cleared;
70
+ };
71
+ //# sourceMappingURL=locks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locks.js","sourceRoot":"","sources":["../../src/git/locks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare const gitHeaderEnv: (header: string) => Readonly<Record<string, string>>;
2
+ export declare const gitAuthHeader: (token: string) => string;
3
+ export declare const GIT_STALL_GUARD: readonly ["-c", "http.lowSpeedLimit=1000", "-c", "http.lowSpeedTime=30"];
4
+ //# sourceMappingURL=remote-http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-http.d.ts","sourceRoot":"","sources":["../../src/git/remote-http.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,YAAY,WAAY,MAAM,KAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAI3E,CAAC;AAGH,eAAO,MAAM,aAAa,UAAW,MAAM,KAAG,MAA6F,CAAC;AAM5I,eAAO,MAAM,eAAe,YAAI,IAAI,EAAE,yBAAyB,EAAE,IAAI,EAAE,sBAAsB,CAAU,CAAC"}
@@ -0,0 +1,8 @@
1
+ export const gitHeaderEnv = (header) => ({
2
+ GIT_CONFIG_COUNT: "1",
3
+ GIT_CONFIG_KEY_0: "http.extraheader",
4
+ GIT_CONFIG_VALUE_0: header,
5
+ });
6
+ export const gitAuthHeader = (token) => `Authorization: Basic ${Buffer.from(`x-access-token:${token}`).toString("base64")}`;
7
+ export const GIT_STALL_GUARD = ["-c", "http.lowSpeedLimit=1000", "-c", "http.lowSpeedTime=30"];
8
+ //# sourceMappingURL=remote-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-http.js","sourceRoot":"","sources":["../../src/git/remote-http.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAc,EAAoC,EAAE,CAAC,CAAC;IAC/E,gBAAgB,EAAE,GAAG;IACrB,gBAAgB,EAAE,kBAAkB;IACpC,kBAAkB,EAAE,MAAM;CAC7B,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,wBAAwB,MAAM,CAAC,IAAI,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;AAM5I,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,yBAAyB,EAAE,IAAI,EAAE,sBAAsB,CAAU,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { execFile } from "node:child_process";
2
+ export declare const exec: typeof execFile.__promisify__;
3
+ export declare const GIT_GLOBAL_ARGS: readonly ["--no-optional-locks", "-c", "core.fileMode=false"];
4
+ export declare const literalPathspecs: (args: readonly string[]) => readonly string[];
5
+ export type GitRunner = (dir: string, args: readonly string[], env?: Readonly<Record<string, string>>) => Promise<{
6
+ readonly stdout: string;
7
+ readonly stderr: string;
8
+ }>;
9
+ export declare const gitBytes: (dir: string, args: readonly string[], maxBytes: number) => Promise<Buffer>;
10
+ type ForkedOutput = {
11
+ readonly stdout: string;
12
+ readonly stderr: string;
13
+ };
14
+ export declare const forkedExec: (command: string, args: readonly string[], options?: Partial<ForkedOptions>) => Promise<ForkedOutput>;
15
+ export declare const gitSpawnStats: () => {
16
+ readonly activeBulk: number;
17
+ readonly queuedBulk: number;
18
+ readonly bulkSlots: number;
19
+ };
20
+ interface ForkedOptions {
21
+ readonly maxBuffer: number;
22
+ readonly timeout?: number;
23
+ readonly cwd?: string;
24
+ readonly env?: Readonly<Record<string, string>>;
25
+ }
26
+ export declare const setRunnerEnv: (env: Readonly<Record<string, string>>) => void;
27
+ export interface GitObservation {
28
+ readonly dir: string;
29
+ readonly args: readonly string[];
30
+ readonly ms: number;
31
+ readonly execMs: number;
32
+ readonly attempts: number;
33
+ readonly failed: boolean;
34
+ readonly forked: boolean;
35
+ readonly queueDepth: number;
36
+ }
37
+ export declare const gitCommandLabel: (args: readonly string[]) => string;
38
+ export declare const observeGitCommands: (observer: (observation: GitObservation) => void) => void;
39
+ export declare const gitRunCounts: () => Readonly<Record<string, number>>;
40
+ export declare const defaultGit: GitRunner;
41
+ export declare const settleIndex: (dir: string) => Promise<boolean>;
42
+ export declare const politeGit: GitRunner;
43
+ export {};
44
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/git/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,QAAQ,EAAQ,MAAM,oBAAoB,CAAC;AAQvE,eAAO,MAAM,IAAI,+BAAsB,CAAC;AAKxC,eAAO,MAAM,eAAe,+DAAuD,CAAC;AAMpF,eAAO,MAAM,gBAAgB,SAAU,SAAS,MAAM,EAAE,KAAG,SAAS,MAAM,EAMzE,CAAC;AAuBF,MAAM,MAAM,SAAS,GAAG,CACpB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,KACrC,OAAO,CAAC;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAKnE,eAAO,MAAM,QAAQ,QAAe,MAAM,QAAQ,SAAS,MAAM,EAAE,YAAY,MAAM,KAAG,OAAO,CAAC,MAAM,CAGrG,CAAC;AAIF,KAAK,YAAY,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AA+EzE,eAAO,MAAM,UAAU,YAAmB,MAAM,QAAQ,SAAS,MAAM,EAAE,YAAW,OAAO,CAAC,aAAa,CAAC,KAAQ,OAAO,CAAC,YAAY,CAGrI,CAAC;AAoDF,eAAO,MAAM,aAAa,QAAO;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAIrH,CAAC;AAEH,UAAU,aAAa;IACnB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAEtB,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACnD;AAMD,eAAO,MAAM,YAAY,QAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,KAAG,IAEpE,CAAC;AAkEF,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEzB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC/B;AAKD,eAAO,MAAM,eAAe,SAAU,SAAS,MAAM,EAAE,KAAG,MAWzD,CAAC;AAOF,eAAO,MAAM,kBAAkB,aAAc,CAAC,WAAW,EAAE,cAAc,KAAK,IAAI,KAAG,IAEpF,CAAC;AASF,eAAO,MAAM,YAAY,QAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAyC,CAAC;AAgFzG,eAAO,MAAM,UAAU,EAAE,SAAyF,CAAC;AAuBnH,eAAO,MAAM,WAAW,QAAe,MAAM,KAAG,OAAO,CAAC,OAAO,CAa9D,CAAC;AAGF,eAAO,MAAM,SAAS,EAAE,SASvB,CAAC"}