nano-git 0.2.1 → 0.2.3

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.
@@ -0,0 +1,363 @@
1
+ import { sha1 } from "../core/types.mjs";
2
+ import { createRootDirectoryNode } from "./nodes.mjs";
3
+ import { createVirtualWorkdirSessionId } from "./session-id.mjs";
4
+ import { openVirtualWorkdirSession } from "./session.mjs";
5
+ import { Database } from "bun:sqlite";
6
+ //#region src/workdir/sqlite-backend.ts
7
+ /**
8
+ * Virtual Workdir SQLite backend
9
+ */
10
+ const WORKDIR_SQLITE_SCHEMA_VERSION = 1;
11
+ const WORKDIR_CHANGES_SESSION_ORDER_INDEX = "workdir_changes_session_id_id_idx";
12
+ /**
13
+ * 创建基于 SQLite 的 Virtual Workdir backend
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * using backend = createSqliteVirtualWorkdirBackend(":memory:");
18
+ * const sessionId = backend.createSession({ baseTree: tree });
19
+ * const session = backend.openSession(repo.objects, sessionId);
20
+ * expect(session.baseTree).toBe(tree);
21
+ * ```
22
+ */
23
+ function createSqliteVirtualWorkdirBackend(dbPath, options = {}) {
24
+ const db = new Database(dbPath);
25
+ let disposed = false;
26
+ if (options.walMode !== false) db.run("PRAGMA journal_mode = WAL");
27
+ ensureSchema(db);
28
+ return {
29
+ kind: "sqlite",
30
+ createSession(options) {
31
+ assertBackendAvailable(disposed);
32
+ const sessionId = createVirtualWorkdirSessionId();
33
+ createSqliteVirtualWorkdirStateStore(db, sessionId).reset(options.baseTree);
34
+ return sessionId;
35
+ },
36
+ openSession(source, sessionId) {
37
+ assertBackendAvailable(disposed);
38
+ if (!hasSession(db, sessionId)) throw new Error(`Virtual workdir session not found: ${sessionId}`);
39
+ validateSessionIntegrity(db, sessionId);
40
+ return openVirtualWorkdirSession(source, createSqliteVirtualWorkdirStateStore(db, sessionId));
41
+ },
42
+ deleteSession(sessionId) {
43
+ assertBackendAvailable(disposed);
44
+ if (!hasSession(db, sessionId)) throw new Error(`Virtual workdir session not found: ${sessionId}`);
45
+ deleteSessionRows(db, sessionId);
46
+ },
47
+ listSessions() {
48
+ assertBackendAvailable(disposed);
49
+ return db.query("SELECT session_id FROM workdir_sessions ORDER BY session_id").all().map((row) => row.session_id).filter((sessionId) => {
50
+ try {
51
+ validateSessionIntegrity(db, sessionId);
52
+ return true;
53
+ } catch {
54
+ return false;
55
+ }
56
+ });
57
+ },
58
+ [Symbol.dispose]() {
59
+ if (disposed) return;
60
+ disposed = true;
61
+ db.close();
62
+ }
63
+ };
64
+ }
65
+ function assertBackendAvailable(disposed) {
66
+ if (disposed) throw new Error("SQLite virtual workdir backend is disposed");
67
+ }
68
+ /**
69
+ * 创建单个 session 的 SQLite 状态存储
70
+ *
71
+ * @example
72
+ * ```ts
73
+ * const store = createSqliteVirtualWorkdirStateStore(db, sessionId);
74
+ * expect(store.kind).toBe("sqlite");
75
+ * ```
76
+ */
77
+ function createSqliteVirtualWorkdirStateStore(db, sessionId) {
78
+ const transactImpl = db.transaction((fn) => fn());
79
+ const readBaseTreeStmt = db.query("SELECT base_tree FROM workdir_sessions WHERE session_id = ?");
80
+ const upsertSessionStmt = db.query("INSERT INTO workdir_sessions (session_id, base_tree) VALUES (?, ?) ON CONFLICT(session_id) DO UPDATE SET base_tree = excluded.base_tree");
81
+ const getNodeStmt = db.query(`SELECT node_id, origin_kind, origin_hash, origin_mode, state_kind, state_mode, content, target, directory_overlay
82
+ FROM workdir_nodes
83
+ WHERE session_id = ? AND node_id = ?`);
84
+ const setNodeStmt = db.query(`INSERT INTO workdir_nodes (
85
+ session_id, node_id, origin_kind, origin_hash, origin_mode,
86
+ state_kind, state_mode, content, target, directory_overlay
87
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
88
+ ON CONFLICT(session_id, node_id) DO UPDATE SET
89
+ origin_kind = excluded.origin_kind,
90
+ origin_hash = excluded.origin_hash,
91
+ origin_mode = excluded.origin_mode,
92
+ state_kind = excluded.state_kind,
93
+ state_mode = excluded.state_mode,
94
+ content = excluded.content,
95
+ target = excluded.target,
96
+ directory_overlay = excluded.directory_overlay`);
97
+ const deleteNodeStmt = db.query("DELETE FROM workdir_nodes WHERE session_id = ? AND node_id = ?");
98
+ const listChangesStmt = db.query("SELECT op, path, old_path FROM workdir_changes WHERE session_id = ? ORDER BY id");
99
+ const insertChangeStmt = db.query("INSERT INTO workdir_changes (session_id, op, path, old_path) VALUES (?, ?, ?, ?)");
100
+ const clearNodesStmt = db.query("DELETE FROM workdir_nodes WHERE session_id = ?");
101
+ const clearChangesStmt = db.query("DELETE FROM workdir_changes WHERE session_id = ?");
102
+ const resetTx = db.transaction((baseTree) => {
103
+ upsertSessionStmt.run(sessionId, baseTree);
104
+ clearNodesStmt.run(sessionId);
105
+ clearChangesStmt.run(sessionId);
106
+ writeNode(setNodeStmt, sessionId, createRootDirectoryNode(baseTree));
107
+ });
108
+ return {
109
+ kind: "sqlite",
110
+ transact(fn) {
111
+ return transactImpl(fn);
112
+ },
113
+ readBaseTree() {
114
+ const row = readBaseTreeStmt.get(sessionId);
115
+ if (row === null) throw new Error(`Virtual workdir session not found: ${sessionId}`);
116
+ return readBaseTreeValue(row.base_tree);
117
+ },
118
+ writeBaseTree(baseTree) {
119
+ upsertSessionStmt.run(sessionId, baseTree);
120
+ },
121
+ getNode(id) {
122
+ const row = getNodeStmt.get(sessionId, id);
123
+ if (row === null) return null;
124
+ return readNode(row);
125
+ },
126
+ setNode(node) {
127
+ writeNode(setNodeStmt, sessionId, node);
128
+ },
129
+ deleteNode(id) {
130
+ deleteNodeStmt.run(sessionId, id);
131
+ },
132
+ appendChange(record) {
133
+ insertChangeStmt.run(sessionId, record.op, getRecordPath(record), getRecordOldPath(record));
134
+ },
135
+ listChangeRecords() {
136
+ return listChangesStmt.all(sessionId).map(readChangeRecord);
137
+ },
138
+ clearChanges() {
139
+ clearChangesStmt.run(sessionId);
140
+ },
141
+ reset(baseTree) {
142
+ resetTx(baseTree);
143
+ }
144
+ };
145
+ }
146
+ function ensureSchema(db) {
147
+ const currentVersion = readSchemaVersion(db);
148
+ if (currentVersion !== 0 && currentVersion !== WORKDIR_SQLITE_SCHEMA_VERSION) throw new Error(`Unsupported virtual workdir SQLite schema version: expected ${WORKDIR_SQLITE_SCHEMA_VERSION}, got ${currentVersion}`);
149
+ db.run(`
150
+ CREATE TABLE IF NOT EXISTS workdir_sessions (
151
+ session_id TEXT PRIMARY KEY,
152
+ base_tree TEXT NOT NULL
153
+ )
154
+ `);
155
+ db.run(`
156
+ CREATE TABLE IF NOT EXISTS workdir_nodes (
157
+ session_id TEXT NOT NULL,
158
+ node_id TEXT NOT NULL,
159
+ origin_kind TEXT NOT NULL,
160
+ origin_hash TEXT,
161
+ origin_mode TEXT,
162
+ state_kind TEXT NOT NULL,
163
+ state_mode TEXT,
164
+ content BLOB,
165
+ target BLOB,
166
+ directory_overlay TEXT,
167
+ PRIMARY KEY (session_id, node_id)
168
+ )
169
+ `);
170
+ db.run(`
171
+ CREATE TABLE IF NOT EXISTS workdir_changes (
172
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
173
+ session_id TEXT NOT NULL,
174
+ op TEXT NOT NULL,
175
+ path TEXT,
176
+ old_path TEXT
177
+ )
178
+ `);
179
+ db.run(`
180
+ CREATE INDEX IF NOT EXISTS ${WORKDIR_CHANGES_SESSION_ORDER_INDEX}
181
+ ON workdir_changes (session_id, id)
182
+ `);
183
+ writeSchemaVersion(db, WORKDIR_SQLITE_SCHEMA_VERSION);
184
+ }
185
+ function hasSession(db, sessionId) {
186
+ return db.query("SELECT 1 FROM workdir_sessions WHERE session_id = ?").get(sessionId) !== null;
187
+ }
188
+ function deleteSessionRows(db, sessionId) {
189
+ db.transaction(() => {
190
+ db.query("DELETE FROM workdir_changes WHERE session_id = ?").run(sessionId);
191
+ db.query("DELETE FROM workdir_nodes WHERE session_id = ?").run(sessionId);
192
+ db.query("DELETE FROM workdir_sessions WHERE session_id = ?").run(sessionId);
193
+ })();
194
+ }
195
+ function readSchemaVersion(db) {
196
+ return db.query("PRAGMA user_version").get()?.user_version ?? 0;
197
+ }
198
+ function writeSchemaVersion(db, version) {
199
+ db.run(`PRAGMA user_version = ${version}`);
200
+ }
201
+ function validateSessionIntegrity(db, sessionId) {
202
+ const sessionRow = db.query("SELECT base_tree FROM workdir_sessions WHERE session_id = ?").get(sessionId);
203
+ if (sessionRow === null) throw new Error(`Virtual workdir session not found: ${sessionId}`);
204
+ readBaseTreeValue(sessionRow.base_tree);
205
+ const rootRow = db.query(`SELECT node_id, origin_kind, origin_hash, origin_mode, state_kind, state_mode, content, target, directory_overlay
206
+ FROM workdir_nodes
207
+ WHERE session_id = ? AND node_id = ?`).get(sessionId, "root");
208
+ if (rootRow === null) throw new Error(`Virtual workdir session is corrupted: missing root node for ${sessionId}`);
209
+ if (readNode(rootRow).state.kind !== "directory") throw new Error(`Virtual workdir session is corrupted: root node is not a directory for ${sessionId}`);
210
+ const allNodesStmt = db.query(`SELECT node_id, origin_kind, origin_hash, origin_mode, state_kind, state_mode, content, target, directory_overlay
211
+ FROM workdir_nodes
212
+ WHERE session_id = ?`);
213
+ for (const row of allNodesStmt.all(sessionId)) readNode(row);
214
+ }
215
+ function writeNode(stmt, sessionId, node) {
216
+ if (node.state.kind === "directory") {
217
+ stmt.run(sessionId, node.id, node.origin.kind, node.origin.kind === "none" ? null : node.origin.hash, node.origin.kind === "repo-blob" ? node.origin.mode : null, "directory", null, null, null, JSON.stringify({
218
+ addedEntries: Array.from(node.state.overlay.addedEntries.entries()),
219
+ deletedNames: Array.from(node.state.overlay.deletedNames.values())
220
+ }));
221
+ return;
222
+ }
223
+ if (node.state.kind === "file") {
224
+ stmt.run(sessionId, node.id, node.origin.kind, node.origin.kind === "none" ? null : node.origin.hash, node.origin.kind === "repo-blob" ? node.origin.mode : null, "file", node.state.mode, node.state.content ?? null, null, null);
225
+ return;
226
+ }
227
+ stmt.run(sessionId, node.id, node.origin.kind, node.origin.kind === "none" ? null : node.origin.hash, node.origin.kind === "repo-blob" ? node.origin.mode : null, "symlink", "120000", null, node.state.target ?? null, null);
228
+ }
229
+ function readNode(row) {
230
+ const origin = readNodeOrigin(row);
231
+ if (row.state_kind === "directory") {
232
+ if (row.state_mode !== null || row.content !== null || row.target !== null) throw new Error("Invalid SQLite workdir directory node payload columns");
233
+ const overlay = readDirectoryOverlay(row.directory_overlay);
234
+ return {
235
+ id: row.node_id,
236
+ origin,
237
+ state: {
238
+ kind: "directory",
239
+ overlay
240
+ }
241
+ };
242
+ }
243
+ if (row.state_kind === "file") {
244
+ if (row.state_mode !== "100644" && row.state_mode !== "100755") throw new Error(`Invalid SQLite workdir node state mode: ${row.state_mode ?? "null"}`);
245
+ if (row.target !== null || row.directory_overlay !== null) throw new Error("Invalid SQLite workdir file node payload columns");
246
+ return {
247
+ id: row.node_id,
248
+ origin,
249
+ state: {
250
+ kind: "file",
251
+ mode: row.state_mode,
252
+ content: readBlobColumn(row.content, "content")
253
+ }
254
+ };
255
+ }
256
+ if (row.state_kind !== "symlink") throw new Error(`Invalid SQLite workdir node state kind: ${row.state_kind}`);
257
+ if (row.state_mode !== "120000") throw new Error(`Invalid SQLite workdir node state mode: ${row.state_mode ?? "null"}`);
258
+ if (row.content !== null || row.directory_overlay !== null) throw new Error("Invalid SQLite workdir symlink node payload columns");
259
+ return {
260
+ id: row.node_id,
261
+ origin,
262
+ state: {
263
+ kind: "symlink",
264
+ mode: "120000",
265
+ target: readBlobColumn(row.target, "target")
266
+ }
267
+ };
268
+ }
269
+ function readNodeOrigin(row) {
270
+ if (row.origin_kind === "none") return { kind: "none" };
271
+ if (row.origin_kind === "repo-tree") {
272
+ if (row.origin_hash === null) throw new Error("Invalid SQLite workdir node: repo-tree origin is missing hash");
273
+ return {
274
+ kind: "repo-tree",
275
+ hash: row.origin_hash
276
+ };
277
+ }
278
+ if (row.origin_kind === "repo-blob") {
279
+ if (row.origin_hash === null) throw new Error("Invalid SQLite workdir node: repo-blob origin is missing hash");
280
+ if (row.origin_mode !== "100644" && row.origin_mode !== "100755" && row.origin_mode !== "120000") throw new Error(`Invalid SQLite workdir node origin mode: ${row.origin_mode ?? "null"}`);
281
+ return {
282
+ kind: "repo-blob",
283
+ mode: row.origin_mode,
284
+ hash: row.origin_hash
285
+ };
286
+ }
287
+ throw new Error(`Invalid SQLite workdir node origin kind: ${row.origin_kind}`);
288
+ }
289
+ function readDirectoryOverlay(raw) {
290
+ if (raw === null) return {
291
+ addedEntries: /* @__PURE__ */ new Map(),
292
+ deletedNames: /* @__PURE__ */ new Set()
293
+ };
294
+ if (typeof raw !== "string") throw new Error("Invalid SQLite workdir directory overlay column type");
295
+ let parsed;
296
+ try {
297
+ parsed = JSON.parse(raw);
298
+ } catch (error) {
299
+ throw new Error(`Invalid SQLite workdir directory overlay JSON: ${error instanceof Error ? error.message : String(error)}`);
300
+ }
301
+ if (!isDirectoryOverlayPayload(parsed)) throw new Error("Invalid SQLite workdir directory overlay payload");
302
+ const addedEntries = parsed.addedEntries.map(([name, nodeId]) => [name, nodeId]);
303
+ return {
304
+ addedEntries: new Map(addedEntries),
305
+ deletedNames: new Set(parsed.deletedNames)
306
+ };
307
+ }
308
+ function readBlobColumn(raw, column) {
309
+ if (raw === null) return;
310
+ if (!(raw instanceof Uint8Array)) throw new Error(`Invalid SQLite workdir ${column} column type`);
311
+ return Buffer.from(raw);
312
+ }
313
+ function readBaseTreeValue(raw) {
314
+ if (typeof raw !== "string") throw new Error("Invalid SQLite workdir session base_tree");
315
+ try {
316
+ return sha1(raw);
317
+ } catch {
318
+ throw new Error("Invalid SQLite workdir session base_tree");
319
+ }
320
+ }
321
+ function isDirectoryOverlayPayload(value) {
322
+ if (typeof value !== "object" || value === null) return false;
323
+ const maybe = value;
324
+ if (!Array.isArray(maybe.addedEntries) || !Array.isArray(maybe.deletedNames)) return false;
325
+ const hasValidAddedEntries = maybe.addedEntries.every((entry) => Array.isArray(entry) && entry.length === 2 && typeof entry[0] === "string" && typeof entry[1] === "string");
326
+ const hasValidDeletedNames = maybe.deletedNames.every((name) => typeof name === "string");
327
+ return hasValidAddedEntries && hasValidDeletedNames;
328
+ }
329
+ function getRecordPath(record) {
330
+ switch (record.op) {
331
+ case "add":
332
+ case "modify":
333
+ case "delete":
334
+ case "revert": return record.path;
335
+ case "rename":
336
+ case "copy": return record.to;
337
+ default: return record;
338
+ }
339
+ }
340
+ function getRecordOldPath(record) {
341
+ if (record.op === "rename" || record.op === "copy") return record.from;
342
+ return null;
343
+ }
344
+ function readChangeRecord(row) {
345
+ switch (row.op) {
346
+ case "add":
347
+ case "modify":
348
+ case "delete":
349
+ case "revert": return {
350
+ op: row.op,
351
+ path: row.path
352
+ };
353
+ case "rename":
354
+ case "copy": return {
355
+ op: row.op,
356
+ from: row.old_path,
357
+ to: row.path
358
+ };
359
+ default: throw new Error(`Unknown workdir change op: ${row.op}`);
360
+ }
361
+ }
362
+ //#endregion
363
+ export { createSqliteVirtualWorkdirBackend };
@@ -0,0 +1,2 @@
1
+ import { CreateSqliteVirtualWorkdirBackendOptions, SqliteVirtualWorkdirBackend, createSqliteVirtualWorkdirBackend } from "./sqlite-backend.mjs";
2
+ export { type CreateSqliteVirtualWorkdirBackendOptions, type SqliteVirtualWorkdirBackend, createSqliteVirtualWorkdirBackend };
@@ -0,0 +1,2 @@
1
+ import { createSqliteVirtualWorkdirBackend } from "./sqlite-backend.mjs";
2
+ export { createSqliteVirtualWorkdirBackend };
@@ -0,0 +1,44 @@
1
+ import { SHA1 } from "../core/types.mjs";
2
+ import { InternalChangeRecord } from "./change-log.mjs";
3
+ import { NodeId } from "./ids.mjs";
4
+ import { SessionNode } from "./nodes.mjs";
5
+
6
+ //#region src/workdir/state-store.d.ts
7
+ /**
8
+ * Virtual Workdir 内部状态存储接口
9
+ */
10
+ interface VirtualWorkdirStateStore {
11
+ /** 后端类型 */
12
+ readonly kind: "memory" | "file" | "sqlite";
13
+ /**
14
+ * 在单次提交边界内执行状态变更
15
+ *
16
+ * 用于把一次 session 写操作封装为单个内部事务。
17
+ * 若回调抛错,store 应尽力恢复到调用前状态。
18
+ */
19
+ transact<T>(fn: () => T): T;
20
+ /** 读取当前基线 tree */
21
+ readBaseTree(): SHA1;
22
+ /** 覆盖当前基线 tree */
23
+ writeBaseTree(baseTree: SHA1): void;
24
+ /** 读取节点,不存在时返回 null */
25
+ getNode(id: NodeId): SessionNode | null;
26
+ /** 写入或覆盖节点 */
27
+ setNode(node: SessionNode): void;
28
+ /** 删除节点 */
29
+ deleteNode(id: NodeId): void;
30
+ /** 追加内部变更记录 */
31
+ appendChange(record: InternalChangeRecord): void;
32
+ /** 列出内部变更记录快照 */
33
+ listChangeRecords(): readonly InternalChangeRecord[];
34
+ /** 清空变更记录 */
35
+ clearChanges(): void;
36
+ /**
37
+ * 重置为新的基线 tree
38
+ *
39
+ * 需要同时清空节点状态与变更记录,并重新建立根节点。
40
+ */
41
+ reset(baseTree: SHA1): void;
42
+ }
43
+ //#endregion
44
+ export { VirtualWorkdirStateStore };
@@ -26,8 +26,8 @@ import { listDirectoryChildren } from "./session-internal.mjs";
26
26
  * ```
27
27
  */
28
28
  function writeTreeFromSession(source, state) {
29
- const root = state.nodes.get("root");
30
- if (!root || root.state.kind !== "directory") throw new Error("Virtual workdir: root node is missing or not a directory");
29
+ const root = state.getNode("root");
30
+ if (root === null || root.state.kind !== "directory") throw new Error("Virtual workdir: root node is missing or not a directory");
31
31
  return compileDirectory(source, source, state, root);
32
32
  }
33
33
  /**
@@ -41,8 +41,8 @@ function compileDirectory(writeSource, readSource, state, dirNode) {
41
41
  let anyChanged = false;
42
42
  const newEntries = [];
43
43
  for (const child of children) {
44
- const node = state.nodes.get(child.nodeId);
45
- if (!node) continue;
44
+ const node = state.getNode(child.nodeId);
45
+ if (node === null) continue;
46
46
  if (node.state.kind === "directory") {
47
47
  const newHash = compileDirectory(writeSource, readSource, state, node);
48
48
  if (newHash !== (node.origin.kind === "repo-tree" ? node.origin.hash : null)) anyChanged = true;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nano-git",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "files": [
5
5
  "dist"
6
6
  ],
@@ -43,47 +43,168 @@
43
43
  "./transport/server/upload-pack": "./src/transport/server/upload-pack/index.ts",
44
44
  "./transport/upload-pack": "./src/transport/upload-pack.ts",
45
45
  "./workdir/core": "./src/workdir/core.ts",
46
- "./workdir/memory": "./src/workdir/memory.ts"
46
+ "./workdir/file": "./src/workdir/file.ts",
47
+ "./workdir/memory": "./src/workdir/memory.ts",
48
+ "./workdir/sqlite": "./src/workdir/sqlite.ts"
47
49
  },
48
50
  "publishConfig": {
49
51
  "exports": {
50
- ".": "./dist/index.mjs",
51
- "./backend": "./dist/backend/index.mjs",
52
- "./backend/file": "./dist/backend/file.mjs",
53
- "./backend/memory": "./dist/backend/memory.mjs",
54
- "./backend/sqlite": "./dist/backend/sqlite.mjs",
55
- "./errors": "./dist/errors.mjs",
56
- "./hash-file": "./dist/hash-file.mjs",
57
- "./log": "./dist/log/index.mjs",
58
- "./objects": "./dist/objects/index.mjs",
59
- "./odb/file": "./dist/odb/file.mjs",
60
- "./odb/memory": "./dist/odb/memory.mjs",
61
- "./odb/sqlite": "./dist/odb/sqlite.mjs",
62
- "./pack": "./dist/pack/index.mjs",
63
- "./refs/file": "./dist/refs/file.mjs",
64
- "./refs/memory": "./dist/refs/memory.mjs",
65
- "./refs/names": "./dist/refs/names.mjs",
66
- "./refs/resolve": "./dist/refs/resolve.mjs",
67
- "./refs/shallow/file": "./dist/refs/shallow/file.mjs",
68
- "./refs/shallow/memory": "./dist/refs/shallow/memory.mjs",
69
- "./refs/shallow/sqlite": "./dist/refs/shallow/sqlite.mjs",
70
- "./refs/sqlite": "./dist/refs/sqlite.mjs",
71
- "./remote/http": "./dist/remote/http.mjs",
72
- "./repository/core": "./dist/repository/core.mjs",
73
- "./repository/file": "./dist/repository/file.mjs",
74
- "./repository/memory": "./dist/repository/memory.mjs",
75
- "./repository/sqlite": "./dist/repository/sqlite.mjs",
76
- "./repository/tree/tree-patch": "./dist/repository/tree/tree-patch.mjs",
77
- "./repository/tree/tree-walk": "./dist/repository/tree/tree-walk.mjs",
78
- "./sha1": "./dist/sha1.mjs",
79
- "./transport": "./dist/transport/index.mjs",
80
- "./transport/http": "./dist/transport/http/index.mjs",
81
- "./transport/receive-pack": "./dist/transport/receive-pack.mjs",
82
- "./transport/server/receive-pack": "./dist/transport/server/receive-pack/index.mjs",
83
- "./transport/server/upload-pack": "./dist/transport/server/upload-pack/index.mjs",
84
- "./transport/upload-pack": "./dist/transport/upload-pack.mjs",
85
- "./workdir/core": "./dist/workdir/core.mjs",
86
- "./workdir/memory": "./dist/workdir/memory.mjs"
52
+ ".": {
53
+ "types": "./dist/index.d.mts",
54
+ "default": "./dist/index.mjs"
55
+ },
56
+ "./backend": {
57
+ "types": "./dist/backend/index.d.mts",
58
+ "default": "./dist/backend/index.mjs"
59
+ },
60
+ "./backend/file": {
61
+ "types": "./dist/backend/file.d.mts",
62
+ "default": "./dist/backend/file.mjs"
63
+ },
64
+ "./backend/memory": {
65
+ "types": "./dist/backend/memory.d.mts",
66
+ "default": "./dist/backend/memory.mjs"
67
+ },
68
+ "./backend/sqlite": {
69
+ "types": "./dist/backend/sqlite.d.mts",
70
+ "default": "./dist/backend/sqlite.mjs"
71
+ },
72
+ "./errors": {
73
+ "types": "./dist/errors.d.mts",
74
+ "default": "./dist/errors.mjs"
75
+ },
76
+ "./hash-file": {
77
+ "types": "./dist/hash-file.d.mts",
78
+ "default": "./dist/hash-file.mjs"
79
+ },
80
+ "./log": {
81
+ "types": "./dist/log/index.d.mts",
82
+ "default": "./dist/log/index.mjs"
83
+ },
84
+ "./objects": {
85
+ "types": "./dist/objects/index.d.mts",
86
+ "default": "./dist/objects/index.mjs"
87
+ },
88
+ "./odb/file": {
89
+ "types": "./dist/odb/file.d.mts",
90
+ "default": "./dist/odb/file.mjs"
91
+ },
92
+ "./odb/memory": {
93
+ "types": "./dist/odb/memory.d.mts",
94
+ "default": "./dist/odb/memory.mjs"
95
+ },
96
+ "./odb/sqlite": {
97
+ "types": "./dist/odb/sqlite.d.mts",
98
+ "default": "./dist/odb/sqlite.mjs"
99
+ },
100
+ "./pack": {
101
+ "types": "./dist/pack/index.d.mts",
102
+ "default": "./dist/pack/index.mjs"
103
+ },
104
+ "./refs/file": {
105
+ "types": "./dist/refs/file.d.mts",
106
+ "default": "./dist/refs/file.mjs"
107
+ },
108
+ "./refs/memory": {
109
+ "types": "./dist/refs/memory.d.mts",
110
+ "default": "./dist/refs/memory.mjs"
111
+ },
112
+ "./refs/names": {
113
+ "types": "./dist/refs/names.d.mts",
114
+ "default": "./dist/refs/names.mjs"
115
+ },
116
+ "./refs/resolve": {
117
+ "types": "./dist/refs/resolve.d.mts",
118
+ "default": "./dist/refs/resolve.mjs"
119
+ },
120
+ "./refs/shallow/file": {
121
+ "types": "./dist/refs/shallow/file.d.mts",
122
+ "default": "./dist/refs/shallow/file.mjs"
123
+ },
124
+ "./refs/shallow/memory": {
125
+ "types": "./dist/refs/shallow/memory.d.mts",
126
+ "default": "./dist/refs/shallow/memory.mjs"
127
+ },
128
+ "./refs/shallow/sqlite": {
129
+ "types": "./dist/refs/shallow/sqlite.d.mts",
130
+ "default": "./dist/refs/shallow/sqlite.mjs"
131
+ },
132
+ "./refs/sqlite": {
133
+ "types": "./dist/refs/sqlite.d.mts",
134
+ "default": "./dist/refs/sqlite.mjs"
135
+ },
136
+ "./remote/http": {
137
+ "types": "./dist/remote/http.d.mts",
138
+ "default": "./dist/remote/http.mjs"
139
+ },
140
+ "./repository/core": {
141
+ "types": "./dist/repository/core.d.mts",
142
+ "default": "./dist/repository/core.mjs"
143
+ },
144
+ "./repository/file": {
145
+ "types": "./dist/repository/file.d.mts",
146
+ "default": "./dist/repository/file.mjs"
147
+ },
148
+ "./repository/memory": {
149
+ "types": "./dist/repository/memory.d.mts",
150
+ "default": "./dist/repository/memory.mjs"
151
+ },
152
+ "./repository/sqlite": {
153
+ "types": "./dist/repository/sqlite.d.mts",
154
+ "default": "./dist/repository/sqlite.mjs"
155
+ },
156
+ "./repository/tree/tree-patch": {
157
+ "types": "./dist/repository/tree/tree-patch.d.mts",
158
+ "default": "./dist/repository/tree/tree-patch.mjs"
159
+ },
160
+ "./repository/tree/tree-walk": {
161
+ "types": "./dist/repository/tree/tree-walk.d.mts",
162
+ "default": "./dist/repository/tree/tree-walk.mjs"
163
+ },
164
+ "./sha1": {
165
+ "types": "./dist/sha1.d.mts",
166
+ "default": "./dist/sha1.mjs"
167
+ },
168
+ "./transport": {
169
+ "types": "./dist/transport/index.d.mts",
170
+ "default": "./dist/transport/index.mjs"
171
+ },
172
+ "./transport/http": {
173
+ "types": "./dist/transport/http/index.d.mts",
174
+ "default": "./dist/transport/http/index.mjs"
175
+ },
176
+ "./transport/receive-pack": {
177
+ "types": "./dist/transport/receive-pack.d.mts",
178
+ "default": "./dist/transport/receive-pack.mjs"
179
+ },
180
+ "./transport/server/receive-pack": {
181
+ "types": "./dist/transport/server/receive-pack/index.d.mts",
182
+ "default": "./dist/transport/server/receive-pack/index.mjs"
183
+ },
184
+ "./transport/server/upload-pack": {
185
+ "types": "./dist/transport/server/upload-pack/index.d.mts",
186
+ "default": "./dist/transport/server/upload-pack/index.mjs"
187
+ },
188
+ "./transport/upload-pack": {
189
+ "types": "./dist/transport/upload-pack.d.mts",
190
+ "default": "./dist/transport/upload-pack.mjs"
191
+ },
192
+ "./workdir/core": {
193
+ "types": "./dist/workdir/core.d.mts",
194
+ "default": "./dist/workdir/core.mjs"
195
+ },
196
+ "./workdir/file": {
197
+ "types": "./dist/workdir/file.d.mts",
198
+ "default": "./dist/workdir/file.mjs"
199
+ },
200
+ "./workdir/memory": {
201
+ "types": "./dist/workdir/memory.d.mts",
202
+ "default": "./dist/workdir/memory.mjs"
203
+ },
204
+ "./workdir/sqlite": {
205
+ "types": "./dist/workdir/sqlite.d.mts",
206
+ "default": "./dist/workdir/sqlite.mjs"
207
+ }
87
208
  }
88
209
  },
89
210
  "scripts": {