@functional-systems/srcx 0.1.0-dev.1

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 (52) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/CONTRIBUTING.md +54 -0
  3. package/DESIGN.md +1057 -0
  4. package/LICENSE +202 -0
  5. package/README.md +209 -0
  6. package/RELEASING.md +137 -0
  7. package/VALIDATION.md +181 -0
  8. package/dist/build.d.ts +94 -0
  9. package/dist/build.js +433 -0
  10. package/dist/build.js.map +1 -0
  11. package/dist/chunk.d.ts +30 -0
  12. package/dist/chunk.js +296 -0
  13. package/dist/chunk.js.map +1 -0
  14. package/dist/cli.d.ts +2 -0
  15. package/dist/cli.js +276 -0
  16. package/dist/cli.js.map +1 -0
  17. package/dist/common.d.ts +17 -0
  18. package/dist/common.js +74 -0
  19. package/dist/common.js.map +1 -0
  20. package/dist/git.d.ts +38 -0
  21. package/dist/git.js +224 -0
  22. package/dist/git.js.map +1 -0
  23. package/dist/publish.d.ts +60 -0
  24. package/dist/publish.js +341 -0
  25. package/dist/publish.js.map +1 -0
  26. package/dist/releases.d.ts +8 -0
  27. package/dist/releases.js +79 -0
  28. package/dist/releases.js.map +1 -0
  29. package/dist/remote.d.ts +53 -0
  30. package/dist/remote.js +136 -0
  31. package/dist/remote.js.map +1 -0
  32. package/dist/repository.d.ts +29 -0
  33. package/dist/repository.js +180 -0
  34. package/dist/repository.js.map +1 -0
  35. package/dist/search.d.ts +46 -0
  36. package/dist/search.js +181 -0
  37. package/dist/search.js.map +1 -0
  38. package/dist/settings.d.ts +10 -0
  39. package/dist/settings.js +35 -0
  40. package/dist/settings.js.map +1 -0
  41. package/package.json +58 -0
  42. package/src/build.ts +587 -0
  43. package/src/chunk.ts +328 -0
  44. package/src/cli.ts +366 -0
  45. package/src/common.ts +71 -0
  46. package/src/git.ts +286 -0
  47. package/src/publish.ts +487 -0
  48. package/src/releases.ts +108 -0
  49. package/src/remote.ts +230 -0
  50. package/src/repository.ts +306 -0
  51. package/src/search.ts +282 -0
  52. package/src/settings.ts +59 -0
package/dist/common.js ADDED
@@ -0,0 +1,74 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
3
+ import { dirname } from "node:path";
4
+ export const APP = "srcx";
5
+ export const PURPOSE = "code-search-v1";
6
+ export function canonical(value) {
7
+ if (Array.isArray(value))
8
+ return `[${value.map(canonical).join(",")}]`;
9
+ if (value && typeof value === "object")
10
+ return `{${Object.entries(value)
11
+ .filter(([, v]) => v !== undefined)
12
+ .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
13
+ .map(([k, v]) => `${JSON.stringify(k)}:${canonical(v)}`)
14
+ .join(",")}}`;
15
+ return JSON.stringify(value);
16
+ }
17
+ export function hash(value) {
18
+ return createHash("sha256")
19
+ .update(Buffer.isBuffer(value)
20
+ ? value
21
+ : typeof value === "string"
22
+ ? value
23
+ : canonical(value))
24
+ .digest("hex");
25
+ }
26
+ export function invariant(value, message) {
27
+ if (!value)
28
+ throw new Error(message);
29
+ }
30
+ export async function atomic(path, value) {
31
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
32
+ const temp = `${path}.${randomUUID()}.tmp`;
33
+ try {
34
+ await writeFile(temp, `${JSON.stringify(value, null, 2)}\n`, {
35
+ flag: "wx",
36
+ mode: 0o600,
37
+ });
38
+ await rename(temp, path);
39
+ }
40
+ finally {
41
+ await rm(temp, { force: true });
42
+ }
43
+ }
44
+ export async function json(path) {
45
+ return JSON.parse(await readFile(path, "utf8"));
46
+ }
47
+ export async function optionalJson(path) {
48
+ try {
49
+ return await json(path);
50
+ }
51
+ catch (e) {
52
+ if (e.code === "ENOENT")
53
+ return undefined;
54
+ throw e;
55
+ }
56
+ }
57
+ export function utf8(bytes) {
58
+ const s = bytes.toString("utf8");
59
+ return Buffer.from(s).equals(bytes) ? s : undefined;
60
+ }
61
+ export function sortedHash(docs) {
62
+ return hash([...docs].sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0)));
63
+ }
64
+ export function lineAt(source, byte) {
65
+ let n = 1;
66
+ for (let i = 0; i < byte; i++)
67
+ if (source[i] === 10)
68
+ n++;
69
+ return n;
70
+ }
71
+ export function sleep(ms) {
72
+ return new Promise((resolve) => setTimeout(resolve, ms));
73
+ }
74
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":"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"}
package/dist/git.d.ts ADDED
@@ -0,0 +1,38 @@
1
+ export declare function git(path: string, args: string[]): Promise<Buffer>;
2
+ export declare function resolveCommit(path: string, ref: string): Promise<{
3
+ oid: string;
4
+ branch?: string;
5
+ time: string;
6
+ }>;
7
+ export type Entry = {
8
+ path: string;
9
+ pathBase64: string;
10
+ validPath: boolean;
11
+ mode: string;
12
+ oid: string;
13
+ type: string;
14
+ bytes: number;
15
+ };
16
+ export declare function inventory(path: string, oid: string): Promise<Entry[]>;
17
+ /** One sequential cat-file process; each response is bounded to one allowed blob. */
18
+ export declare class Blobs {
19
+ private child;
20
+ private iterator;
21
+ private buffer;
22
+ constructor(path: string);
23
+ private fill;
24
+ read(e: Entry): Promise<Buffer>;
25
+ close(): void;
26
+ }
27
+ export declare function normalizeRemote(raw: string): string;
28
+ export type Identity = {
29
+ key: string;
30
+ name: string;
31
+ path: string;
32
+ remote?: string;
33
+ };
34
+ export declare function identity(path: string, remote?: string): Promise<Identity>;
35
+ export declare function gitTags(path: string): Promise<{
36
+ ref: string;
37
+ oid: string;
38
+ }[]>;
package/dist/git.js ADDED
@@ -0,0 +1,224 @@
1
+ import { execFile, spawn } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import { realpath } from "node:fs/promises";
4
+ import { basename, join } from "node:path";
5
+ import { randomUUID } from "node:crypto";
6
+ import { atomic, hash, invariant, optionalJson, utf8 } from "./common.js";
7
+ import { stateRoot } from "./settings.js";
8
+ const exec = promisify(execFile);
9
+ export async function git(path, args) {
10
+ try {
11
+ const r = await exec("git", ["--no-replace-objects", "-C", path, ...args], {
12
+ encoding: "buffer",
13
+ maxBuffer: 64 * 1024 * 1024,
14
+ env: {
15
+ ...process.env,
16
+ GIT_NO_REPLACE_OBJECTS: "1",
17
+ GIT_TERMINAL_PROMPT: "0",
18
+ },
19
+ });
20
+ return r.stdout;
21
+ }
22
+ catch {
23
+ throw new Error(`Git ${args[0]} failed. Verify the repository, ref, and local objects.`);
24
+ }
25
+ }
26
+ export async function resolveCommit(path, ref) {
27
+ invariant(ref && !ref.startsWith("-") && !/[\s~^:@{\\]/.test(ref), "Use a branch, Git tag, or commit OID; revision expressions are not supported.");
28
+ let qualified = ref;
29
+ let branch;
30
+ const exists = async (r) => {
31
+ try {
32
+ await git(path, ["show-ref", "--verify", "--hash", r]);
33
+ return true;
34
+ }
35
+ catch {
36
+ return false;
37
+ }
38
+ };
39
+ if (ref.startsWith("refs/")) {
40
+ invariant(ref.startsWith("refs/heads/") || ref.startsWith("refs/tags/"), "Only heads/tags refs are supported.");
41
+ invariant(await exists(ref), "Ref not found.");
42
+ if (ref.startsWith("refs/heads/"))
43
+ branch = ref;
44
+ }
45
+ else {
46
+ const heads = await exists(`refs/heads/${ref}`), tags = await exists(`refs/tags/${ref}`);
47
+ invariant(!(heads && tags), "Ambiguous branch/tag name: use refs/heads/... or refs/tags/...");
48
+ if (heads) {
49
+ qualified = `refs/heads/${ref}`;
50
+ branch = qualified;
51
+ }
52
+ else if (tags)
53
+ qualified = `refs/tags/${ref}`;
54
+ else
55
+ invariant(/^[0-9a-fA-F]{4,64}$/.test(ref), "Unknown ref; only local branch/tag names and commit OIDs are accepted.");
56
+ }
57
+ const oid = (await git(path, [
58
+ "rev-parse",
59
+ "--verify",
60
+ "--end-of-options",
61
+ `${qualified}^{commit}`,
62
+ ]))
63
+ .toString()
64
+ .trim();
65
+ const time = (await git(path, ["show", "-s", "--format=%cI", oid]))
66
+ .toString()
67
+ .trim();
68
+ return { oid, branch, time };
69
+ }
70
+ export async function inventory(path, oid) {
71
+ const raw = await git(path, ["ls-tree", "-r", "-z", "--full-tree", oid]);
72
+ const entries = [];
73
+ let start = 0;
74
+ for (let i = 0; i < raw.length; i++)
75
+ if (raw[i] === 0) {
76
+ const rec = raw.subarray(start, i);
77
+ start = i + 1;
78
+ const tab = rec.indexOf(9);
79
+ invariant(tab >= 0, "Malformed Git tree.");
80
+ const [mode, type, object] = rec.subarray(0, tab).toString().split(" ");
81
+ const name = rec.subarray(tab + 1);
82
+ const decoded = utf8(name);
83
+ invariant(mode && type && object, "Malformed tree metadata.");
84
+ entries.push({
85
+ path: decoded ?? `<invalid-utf8:${name.toString("base64")}>`,
86
+ pathBase64: name.toString("base64"),
87
+ validPath: decoded !== undefined,
88
+ mode,
89
+ oid: object,
90
+ type,
91
+ bytes: 0,
92
+ });
93
+ }
94
+ const blobs = entries.filter((e) => e.type === "blob");
95
+ if (blobs.length) {
96
+ const child = spawn("git", [
97
+ "--no-replace-objects",
98
+ "-C",
99
+ path,
100
+ "cat-file",
101
+ "--batch-check=%(objectname) %(objecttype) %(objectsize)",
102
+ ], { stdio: ["pipe", "pipe", "ignore"] });
103
+ const pieces = [];
104
+ child.stdout.on("data", (b) => pieces.push(b));
105
+ const ended = new Promise((ok, no) => {
106
+ child.once("error", no);
107
+ child.once("close", (c) => c === 0 ? ok() : no(new Error("Git object size lookup failed.")));
108
+ });
109
+ child.stdin.on("error", () => { });
110
+ child.stdin.end(blobs.map((e) => e.oid + "\n").join(""));
111
+ await ended;
112
+ const lines = Buffer.concat(pieces).toString().trim().split("\n");
113
+ invariant(lines.length === blobs.length, "Incomplete Git object inventory.");
114
+ lines.forEach((line, i) => {
115
+ const [id, type, size] = line.split(" ");
116
+ const e = blobs[i];
117
+ invariant(id === e.oid && type === "blob" && /^\d+$/.test(size ?? ""), "Missing Git blob.");
118
+ e.bytes = Number(size);
119
+ });
120
+ }
121
+ return entries;
122
+ }
123
+ /** One sequential cat-file process; each response is bounded to one allowed blob. */
124
+ export class Blobs {
125
+ child;
126
+ iterator;
127
+ buffer = Buffer.alloc(0);
128
+ constructor(path) {
129
+ this.child = spawn("git", ["--no-replace-objects", "-C", path, "cat-file", "--batch"], { stdio: ["pipe", "pipe", "ignore"] });
130
+ this.child.on("error", () => { });
131
+ this.child.stdin.on("error", () => { });
132
+ this.iterator = this.child.stdout[Symbol.asyncIterator]();
133
+ }
134
+ async fill(n) {
135
+ while (this.buffer.length < n) {
136
+ const r = await this.iterator.next();
137
+ invariant(!r.done, "Git blob stream ended early.");
138
+ this.buffer = Buffer.concat([this.buffer, r.value]);
139
+ }
140
+ }
141
+ async read(e) {
142
+ this.child.stdin.write(e.oid + "\n");
143
+ let newline = this.buffer.indexOf(10);
144
+ while (newline < 0) {
145
+ await this.fill(this.buffer.length + 1);
146
+ newline = this.buffer.indexOf(10);
147
+ }
148
+ const header = this.buffer.subarray(0, newline).toString();
149
+ this.buffer = this.buffer.subarray(newline + 1);
150
+ invariant(header === `${e.oid} blob ${e.bytes}`, "Git blob metadata changed or object is missing.");
151
+ await this.fill(e.bytes + 1);
152
+ const data = Buffer.from(this.buffer.subarray(0, e.bytes));
153
+ invariant(this.buffer[e.bytes] === 10, "Malformed Git blob response.");
154
+ this.buffer = this.buffer.subarray(e.bytes + 1);
155
+ return data;
156
+ }
157
+ close() {
158
+ this.child.stdin.end();
159
+ this.child.kill();
160
+ }
161
+ }
162
+ export function normalizeRemote(raw) {
163
+ const value = raw.trim();
164
+ let host, path;
165
+ if (value.includes("://")) {
166
+ const u = new URL(value);
167
+ invariant(["ssh:", "https:", "http:", "git:"].includes(u.protocol) &&
168
+ !u.search &&
169
+ !u.hash, "Unsupported remote URL.");
170
+ host = u.host.toLowerCase();
171
+ path = u.pathname;
172
+ }
173
+ else {
174
+ const m = /^(?:[^@/:]+@)?([^/:]+):(.+)$/.exec(value);
175
+ invariant(m, "Remote must be a network Git URL; local-path remotes need explicit support.");
176
+ host = m[1].toLowerCase();
177
+ path = m[2];
178
+ }
179
+ path = path.replace(/^\/+|\/+$/g, "").replace(/\.git$/, "");
180
+ invariant(host && path && !path.split("/").some((x) => !x || x === "." || x === ".."), "Invalid remote identity.");
181
+ if (host === "github.com")
182
+ path = path.toLowerCase();
183
+ return `${host}/${path}`;
184
+ }
185
+ export async function identity(path, remote) {
186
+ path = await realpath(path);
187
+ await git(path, ["rev-parse", "--git-dir"]);
188
+ const names = (await git(path, ["remote"]))
189
+ .toString()
190
+ .trim()
191
+ .split("\n")
192
+ .filter(Boolean);
193
+ let selected = remote;
194
+ if (!selected && names.includes("origin"))
195
+ selected = "origin";
196
+ if (!selected && names.length)
197
+ throw new Error("No origin remote; choose --remote explicitly.");
198
+ if (selected) {
199
+ invariant(names.includes(selected), "Selected remote does not exist.");
200
+ const key = normalizeRemote((await git(path, ["remote", "get-url", selected])).toString());
201
+ return { key, name: key.split("/").at(-1), path, remote: selected };
202
+ }
203
+ const file = join(stateRoot(), "local-sources", hash(path) + ".json");
204
+ let saved = await optionalJson(file);
205
+ if (!saved) {
206
+ saved = { key: `local/${randomUUID()}` };
207
+ await atomic(file, saved);
208
+ }
209
+ return { key: saved.key, name: basename(path), path };
210
+ }
211
+ export async function gitTags(path) {
212
+ const refs = (await git(path, ["for-each-ref", "--format=%(refname)", "refs/tags/"]))
213
+ .toString()
214
+ .trim()
215
+ .split("\n")
216
+ .filter(Boolean);
217
+ const result = [];
218
+ for (const ref of refs) {
219
+ const { oid } = await resolveCommit(path, ref);
220
+ result.push({ ref, oid });
221
+ }
222
+ return result;
223
+ }
224
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import { type Doc } from "./common.js";
2
+ import { type Build } from "./build.js";
3
+ import { type CollectionStore } from "./remote.js";
4
+ export type Binding = {
5
+ repoId: string;
6
+ indexId: string;
7
+ repoKey: string;
8
+ configHash: string;
9
+ };
10
+ export type Published = Doc & {
11
+ commitOid: string;
12
+ tagName: string;
13
+ snapshotId: string;
14
+ writer: string;
15
+ buildId: string;
16
+ recordsHash: string;
17
+ inventoryHash: string;
18
+ attemptId: string;
19
+ };
20
+ export type Journal = {
21
+ buildId: string;
22
+ recordsHash: string;
23
+ inventoryHash: string;
24
+ artifact: string;
25
+ attemptId: string;
26
+ writer: string;
27
+ source: string;
28
+ baseline?: Published;
29
+ phase: "branch" | "writing" | "waiting" | "publishing";
30
+ batches: {
31
+ operation: string;
32
+ hash: string;
33
+ outcome: "unknown" | "accepted" | "superseded";
34
+ }[];
35
+ candidate?: {
36
+ name: string;
37
+ snapshotId: string;
38
+ };
39
+ };
40
+ export declare function versionTag(oid: string): string;
41
+ export declare function versionId(oid: string): string;
42
+ export declare function exclusive<T>(directory: string, work: () => Promise<T>): Promise<T>;
43
+ export declare function matchesManifest(doc: Doc | undefined, b: Build, binding: Binding, attemptId?: string): boolean;
44
+ /** Exact immutable inventory/content comparison, not merely a marker/count check. */
45
+ export declare function validateCandidate(store: CollectionStore, name: string, b: Build, binding: Binding, attemptId: string): Promise<boolean>;
46
+ export declare function published(store: CollectionStore, binding: Binding): Promise<Published[]>;
47
+ /** Caller holds the per-collection lock for the complete import. */
48
+ export declare function publish(args: {
49
+ store: CollectionStore;
50
+ binding: Binding;
51
+ build: Build;
52
+ state: string;
53
+ baseline?: {
54
+ version: Published;
55
+ build: Build;
56
+ };
57
+ resume?: boolean;
58
+ timeoutMs?: number;
59
+ pollMs?: number;
60
+ }): Promise<Published>;