nano-git 0.1.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 (227) hide show
  1. package/README.md +407 -0
  2. package/dist/backend/file-backend.d.mts +26 -0
  3. package/dist/backend/file-backend.mjs +83 -0
  4. package/dist/backend/file.d.mts +2 -0
  5. package/dist/backend/file.mjs +2 -0
  6. package/dist/backend/index.d.mts +2 -0
  7. package/dist/backend/index.mjs +1 -0
  8. package/dist/backend/memory-backend.d.mts +25 -0
  9. package/dist/backend/memory-backend.mjs +33 -0
  10. package/dist/backend/memory.d.mts +2 -0
  11. package/dist/backend/memory.mjs +2 -0
  12. package/dist/backend/types.d.mts +90 -0
  13. package/dist/core/errors.d.mts +124 -0
  14. package/dist/core/errors.mjs +168 -0
  15. package/dist/core/hash-digest.d.mts +35 -0
  16. package/dist/core/hash-digest.mjs +50 -0
  17. package/dist/core/hash-file.d.mts +20 -0
  18. package/dist/core/hash-file.mjs +27 -0
  19. package/dist/core/hash-path.d.mts +17 -0
  20. package/dist/core/hash-path.mjs +35 -0
  21. package/dist/core/types/odb.d.mts +63 -0
  22. package/dist/core/types/refs.d.mts +140 -0
  23. package/dist/core/types/refs.mjs +19 -0
  24. package/dist/core/types/shallow.d.mts +52 -0
  25. package/dist/core/types.d.mts +154 -0
  26. package/dist/core/types.mjs +43 -0
  27. package/dist/errors.d.mts +2 -0
  28. package/dist/errors.mjs +2 -0
  29. package/dist/hash-file.d.mts +2 -0
  30. package/dist/hash-file.mjs +2 -0
  31. package/dist/index.d.mts +16 -0
  32. package/dist/index.mjs +14 -0
  33. package/dist/objects/author.d.mts +25 -0
  34. package/dist/objects/author.mjs +45 -0
  35. package/dist/objects/blob.d.mts +15 -0
  36. package/dist/objects/blob.mjs +20 -0
  37. package/dist/objects/codec.d.mts +46 -0
  38. package/dist/objects/codec.mjs +84 -0
  39. package/dist/objects/commit.d.mts +26 -0
  40. package/dist/objects/commit.mjs +160 -0
  41. package/dist/objects/index.d.mts +8 -0
  42. package/dist/objects/index.mjs +8 -0
  43. package/dist/objects/raw.d.mts +85 -0
  44. package/dist/objects/raw.mjs +111 -0
  45. package/dist/objects/tag.d.mts +26 -0
  46. package/dist/objects/tag.mjs +148 -0
  47. package/dist/objects/tree.d.mts +22 -0
  48. package/dist/objects/tree.mjs +66 -0
  49. package/dist/odb/file-utils.mjs +136 -0
  50. package/dist/odb/file.d.mts +22 -0
  51. package/dist/odb/file.mjs +66 -0
  52. package/dist/odb/memory.d.mts +22 -0
  53. package/dist/odb/memory.mjs +54 -0
  54. package/dist/pack/composite-store.d.mts +76 -0
  55. package/dist/pack/composite-store.mjs +133 -0
  56. package/dist/pack/constants.mjs +48 -0
  57. package/dist/pack/crc32.mjs +38 -0
  58. package/dist/pack/delta-apply.d.mts +21 -0
  59. package/dist/pack/delta-apply.mjs +71 -0
  60. package/dist/pack/delta-create.d.mts +28 -0
  61. package/dist/pack/delta-create.mjs +151 -0
  62. package/dist/pack/index.d.mts +16 -0
  63. package/dist/pack/index.mjs +13 -0
  64. package/dist/pack/object-header.d.mts +36 -0
  65. package/dist/pack/object-header.mjs +72 -0
  66. package/dist/pack/ofs-delta-offset.d.mts +35 -0
  67. package/dist/pack/ofs-delta-offset.mjs +59 -0
  68. package/dist/pack/pack-builder-types.d.mts +19 -0
  69. package/dist/pack/pack-builder.d.mts +52 -0
  70. package/dist/pack/pack-builder.mjs +80 -0
  71. package/dist/pack/pack-encoding.mjs +76 -0
  72. package/dist/pack/pack-index-reader.d.mts +57 -0
  73. package/dist/pack/pack-index-reader.mjs +90 -0
  74. package/dist/pack/pack-index-types.d.mts +16 -0
  75. package/dist/pack/pack-index-writer.d.mts +45 -0
  76. package/dist/pack/pack-index-writer.mjs +106 -0
  77. package/dist/pack/pack-reader-resolver.mjs +104 -0
  78. package/dist/pack/pack-reader-types.d.mts +31 -0
  79. package/dist/pack/pack-reader-types.mjs +22 -0
  80. package/dist/pack/pack-reader-utils.mjs +61 -0
  81. package/dist/pack/pack-reader.d.mts +81 -0
  82. package/dist/pack/pack-reader.mjs +171 -0
  83. package/dist/pack/pack-store-loader.mjs +79 -0
  84. package/dist/pack/pack-store-types.d.mts +16 -0
  85. package/dist/pack/pack-store.d.mts +55 -0
  86. package/dist/pack/pack-store.mjs +114 -0
  87. package/dist/pack/pack-writer.mjs +96 -0
  88. package/dist/pack/varint.d.mts +34 -0
  89. package/dist/pack/varint.mjs +57 -0
  90. package/dist/refs/file.d.mts +6 -0
  91. package/dist/refs/file.mjs +222 -0
  92. package/dist/refs/fs-utils.mjs +30 -0
  93. package/dist/refs/memory.d.mts +14 -0
  94. package/dist/refs/memory.mjs +104 -0
  95. package/dist/refs/names.d.mts +57 -0
  96. package/dist/refs/names.mjs +80 -0
  97. package/dist/refs/resolve.d.mts +33 -0
  98. package/dist/refs/resolve.mjs +55 -0
  99. package/dist/refs/shallow/file.d.mts +17 -0
  100. package/dist/refs/shallow/file.mjs +61 -0
  101. package/dist/refs/shallow/memory.d.mts +18 -0
  102. package/dist/refs/shallow/memory.mjs +33 -0
  103. package/dist/repository/core.d.mts +3 -0
  104. package/dist/repository/core.mjs +2 -0
  105. package/dist/repository/create.d.mts +22 -0
  106. package/dist/repository/create.mjs +43 -0
  107. package/dist/repository/file.d.mts +43 -0
  108. package/dist/repository/file.mjs +82 -0
  109. package/dist/repository/import/import-glob.mjs +44 -0
  110. package/dist/repository/import/import-plan-builder.mjs +625 -0
  111. package/dist/repository/import/import-session-types.d.mts +280 -0
  112. package/dist/repository/import/import-session.mjs +96 -0
  113. package/dist/repository/import/import-view.mjs +133 -0
  114. package/dist/repository/memory.d.mts +17 -0
  115. package/dist/repository/memory.mjs +33 -0
  116. package/dist/repository/ops/fetch-operations.mjs +20 -0
  117. package/dist/repository/ops/fetch-types.d.mts +82 -0
  118. package/dist/repository/ops/fetch-url.mjs +82 -0
  119. package/dist/repository/ops/fs-object-operations.mjs +31 -0
  120. package/dist/repository/ops/maintenance-operations.mjs +62 -0
  121. package/dist/repository/ops/maintenance-types.d.mts +42 -0
  122. package/dist/repository/ops/object-operations.mjs +65 -0
  123. package/dist/repository/ops/object-types.d.mts +109 -0
  124. package/dist/repository/ops/push-operations.mjs +16 -0
  125. package/dist/repository/ops/push-resolution.mjs +17 -0
  126. package/dist/repository/ops/push-types.d.mts +72 -0
  127. package/dist/repository/ops/push-url.mjs +45 -0
  128. package/dist/repository/ops/reachability.mjs +60 -0
  129. package/dist/repository/ops/ref-operations.mjs +86 -0
  130. package/dist/repository/ops/ref-types.d.mts +70 -0
  131. package/dist/repository/tree/tree-patch.d.mts +64 -0
  132. package/dist/repository/tree/tree-patch.mjs +268 -0
  133. package/dist/repository/tree/tree-walk.d.mts +46 -0
  134. package/dist/repository/tree/tree-walk.mjs +65 -0
  135. package/dist/repository/tree/tree-writer.mjs +68 -0
  136. package/dist/repository/types.d.mts +36 -0
  137. package/dist/sha1.d.mts +4 -0
  138. package/dist/sha1.mjs +4 -0
  139. package/dist/transport/client/receive-pack/http.d.mts +33 -0
  140. package/dist/transport/client/receive-pack/http.mjs +99 -0
  141. package/dist/transport/client/receive-pack/push-error.d.mts +23 -0
  142. package/dist/transport/client/receive-pack/push-error.mjs +32 -0
  143. package/dist/transport/client/receive-pack/push-pack-plan.d.mts +28 -0
  144. package/dist/transport/client/receive-pack/push-pack-plan.mjs +60 -0
  145. package/dist/transport/client/receive-pack/push-policy.d.mts +19 -0
  146. package/dist/transport/client/receive-pack/push-policy.mjs +64 -0
  147. package/dist/transport/client/receive-pack/push-ref-plan.d.mts +45 -0
  148. package/dist/transport/client/receive-pack/push-ref-plan.mjs +108 -0
  149. package/dist/transport/client/receive-pack/push-report.d.mts +28 -0
  150. package/dist/transport/client/receive-pack/push-report.mjs +84 -0
  151. package/dist/transport/client/receive-pack/push-request-plan.mjs +52 -0
  152. package/dist/transport/client/receive-pack/push.d.mts +32 -0
  153. package/dist/transport/client/receive-pack/push.mjs +97 -0
  154. package/dist/transport/client/receive-pack/request.d.mts +39 -0
  155. package/dist/transport/client/receive-pack/request.mjs +46 -0
  156. package/dist/transport/client/receive-pack/response.d.mts +26 -0
  157. package/dist/transport/client/receive-pack/response.mjs +52 -0
  158. package/dist/transport/client/receive-pack/result.d.mts +34 -0
  159. package/dist/transport/client/receive-pack/result.mjs +100 -0
  160. package/dist/transport/client/upload-pack/capability-advertisement.d.mts +56 -0
  161. package/dist/transport/client/upload-pack/capability-advertisement.mjs +130 -0
  162. package/dist/transport/client/upload-pack/fetch.d.mts +109 -0
  163. package/dist/transport/client/upload-pack/fetch.mjs +392 -0
  164. package/dist/transport/client/upload-pack/http.d.mts +29 -0
  165. package/dist/transport/client/upload-pack/http.mjs +79 -0
  166. package/dist/transport/client/upload-pack/ls-refs.d.mts +75 -0
  167. package/dist/transport/client/upload-pack/ls-refs.mjs +150 -0
  168. package/dist/transport/client/upload-pack/object-info.d.mts +65 -0
  169. package/dist/transport/client/upload-pack/object-info.mjs +111 -0
  170. package/dist/transport/client/upload-pack/types.d.mts +153 -0
  171. package/dist/transport/http/index.d.mts +3 -0
  172. package/dist/transport/http/index.mjs +2 -0
  173. package/dist/transport/http/smart-http.d.mts +46 -0
  174. package/dist/transport/http/smart-http.mjs +176 -0
  175. package/dist/transport/http/types.d.mts +27 -0
  176. package/dist/transport/index.d.mts +9 -0
  177. package/dist/transport/index.mjs +8 -0
  178. package/dist/transport/protocol/object-graph.d.mts +63 -0
  179. package/dist/transport/protocol/object-graph.mjs +149 -0
  180. package/dist/transport/protocol/pkt-line.d.mts +109 -0
  181. package/dist/transport/protocol/pkt-line.mjs +195 -0
  182. package/dist/transport/protocol/ref-advertisement.mjs +185 -0
  183. package/dist/transport/protocol/ref-collection.d.mts +38 -0
  184. package/dist/transport/protocol/ref-collection.mjs +63 -0
  185. package/dist/transport/protocol/ref-match.d.mts +39 -0
  186. package/dist/transport/protocol/ref-match.mjs +42 -0
  187. package/dist/transport/protocol/refspec.d.mts +44 -0
  188. package/dist/transport/protocol/refspec.mjs +79 -0
  189. package/dist/transport/protocol/side-band.d.mts +65 -0
  190. package/dist/transport/protocol/side-band.mjs +142 -0
  191. package/dist/transport/protocol/transport-capabilities.mjs +46 -0
  192. package/dist/transport/protocol/types.d.mts +148 -0
  193. package/dist/transport/protocol/update-refs.d.mts +68 -0
  194. package/dist/transport/protocol/update-refs.mjs +126 -0
  195. package/dist/transport/receive-pack.d.mts +11 -0
  196. package/dist/transport/receive-pack.mjs +11 -0
  197. package/dist/transport/server/receive-pack/advertise.d.mts +28 -0
  198. package/dist/transport/server/receive-pack/advertise.mjs +88 -0
  199. package/dist/transport/server/receive-pack/handler.d.mts +30 -0
  200. package/dist/transport/server/receive-pack/handler.mjs +156 -0
  201. package/dist/transport/server/receive-pack/index.d.mts +6 -0
  202. package/dist/transport/server/receive-pack/index.mjs +6 -0
  203. package/dist/transport/server/receive-pack/parse.d.mts +17 -0
  204. package/dist/transport/server/receive-pack/parse.mjs +80 -0
  205. package/dist/transport/server/receive-pack/report-status.mjs +64 -0
  206. package/dist/transport/server/receive-pack/service.d.mts +41 -0
  207. package/dist/transport/server/receive-pack/service.mjs +39 -0
  208. package/dist/transport/server/receive-pack/types.d.mts +56 -0
  209. package/dist/transport/server/receive-pack/types.mjs +25 -0
  210. package/dist/transport/server/receive-pack/unpack.mjs +119 -0
  211. package/dist/transport/server/upload-pack/advertise.d.mts +20 -0
  212. package/dist/transport/server/upload-pack/advertise.mjs +30 -0
  213. package/dist/transport/server/upload-pack/command.d.mts +43 -0
  214. package/dist/transport/server/upload-pack/command.mjs +56 -0
  215. package/dist/transport/server/upload-pack/fetch.d.mts +43 -0
  216. package/dist/transport/server/upload-pack/fetch.mjs +217 -0
  217. package/dist/transport/server/upload-pack/index.d.mts +7 -0
  218. package/dist/transport/server/upload-pack/index.mjs +7 -0
  219. package/dist/transport/server/upload-pack/ls-refs.d.mts +38 -0
  220. package/dist/transport/server/upload-pack/ls-refs.mjs +113 -0
  221. package/dist/transport/server/upload-pack/service.d.mts +40 -0
  222. package/dist/transport/server/upload-pack/service.mjs +51 -0
  223. package/dist/transport/server/upload-pack/types.d.mts +11 -0
  224. package/dist/transport/server/upload-pack/types.mjs +21 -0
  225. package/dist/transport/upload-pack.d.mts +7 -0
  226. package/dist/transport/upload-pack.mjs +6 -0
  227. package/package.json +98 -0
@@ -0,0 +1,52 @@
1
+ import { SHA1 } from "../types.mjs";
2
+
3
+ //#region src/core/types/shallow.d.ts
4
+ /**
5
+ * Shallow 边界更新
6
+ *
7
+ * 表示一次 fetch 操作中 shallow 边界集合的增减变化。
8
+ */
9
+ interface ShallowUpdate {
10
+ /** 新增的 shallow 边界 commit 哈希列表 */
11
+ readonly shallow: SHA1[];
12
+ /** 从 shallow 边界移除的 commit 哈希列表(变为完整) */
13
+ readonly unshallow: SHA1[];
14
+ }
15
+ /**
16
+ * Shallow 存储接口
17
+ *
18
+ * 提供 Git shallow 边界集合的读写能力。
19
+ */
20
+ interface ShallowStore {
21
+ /**
22
+ * 读取当前 shallow 边界集合
23
+ *
24
+ * 返回当前仓库标记为 shallow 边界(即只拉取了部分历史)的 commit 哈希列表。
25
+ * 非 shallow 仓库返回空数组。
26
+ * 返回值为排序后的新数组副本,修改不影响内部状态。
27
+ */
28
+ read(): SHA1[];
29
+ /**
30
+ * 完全替换 shallow 边界集合
31
+ *
32
+ * 将 shallow 边界集合替换为给定列表。
33
+ * 传空数组表示移除此仓库的 shallow 状态(转为完整仓库)。
34
+ */
35
+ write(boundaries: SHA1[]): void;
36
+ /**
37
+ * 增量更新 shallow 边界
38
+ *
39
+ * 根据 fetch 操作返回的 shallow/unshallow 信息,做集合变换:
40
+ * - 加入 server 新返回的 shallow 边界
41
+ * - 删除 server 返回的 unshallow 边界
42
+ */
43
+ applyUpdate(update: ShallowUpdate): void;
44
+ /**
45
+ * 判断指定哈希是否为 shallow boundary commit
46
+ *
47
+ * 若哈希在当前 shallow 边界集合中返回 true,否则返回 false。
48
+ */
49
+ isShallow(hash: SHA1): boolean;
50
+ }
51
+ //#endregion
52
+ export { ShallowStore };
@@ -0,0 +1,154 @@
1
+ //#region src/core/types.d.ts
2
+ /**
3
+ * nano-git 核心类型定义
4
+ *
5
+ * Git 的对象模型:
6
+ * - 所有对象通过 SHA-1 哈希寻址(40 个十六进制字符)
7
+ * - 四种对象类型:blob, tree, commit, tag
8
+ * - 对象以 "<type> <size>\0<content>" 格式存储
9
+ */
10
+ /** SHA-1 哈希值(40 个十六进制字符) */
11
+ type SHA1 = string & {
12
+ readonly __brand: "SHA1";
13
+ };
14
+ /** Git 对象类型 */
15
+ type ObjectType = "blob" | "tree" | "commit" | "tag";
16
+ /**
17
+ * 底层原始 Git 对象(ODB 的真实边界)
18
+ *
19
+ * 直接对应 Git 存储格式中的 "<type> <size>\0<content>",
20
+ * ODB 的 read/ingest 操作均以此为单元,不再直接操作 GitObject。
21
+ *
22
+ * @see GitObject - 语义层 AST,供查看、遍历、构造新对象使用
23
+ */
24
+ interface RawGitObject {
25
+ /** SHA-1 哈希(由 type + content 计算得出) */
26
+ readonly hash: SHA1;
27
+ /** 对象类型 */
28
+ readonly type: ObjectType;
29
+ /** 去 header 后的原始内容 */
30
+ readonly content: Buffer;
31
+ }
32
+ /**
33
+ * 验证并转换字符串为 ObjectType
34
+ *
35
+ * @throws InvalidObjectError 如果字符串不是合法的 ObjectType
36
+ *
37
+ * @example
38
+ * ```ts
39
+ * assertObjectType("blob"); // => "blob"
40
+ * assertObjectType("invalid"); // throws InvalidObjectError
41
+ * ```
42
+ */
43
+ declare function assertObjectType(value: string): ObjectType;
44
+ /** Blob 对象 — 存储文件内容 */
45
+ interface GitBlob {
46
+ type: "blob";
47
+ content: Buffer;
48
+ }
49
+ /** Tree 条目 — 目录中的一个文件或子目录 */
50
+ interface TreeEntry {
51
+ /** 文件模式(如 "100644" 普通文件, "100755" 可执行文件, "40000" 目录) */
52
+ mode: string;
53
+ /** 文件/目录名 */
54
+ name: string;
55
+ /** 指向的 SHA-1 哈希 */
56
+ hash: SHA1;
57
+ }
58
+ /** Tree 对象 — 存储目录结构 */
59
+ interface GitTree {
60
+ type: "tree";
61
+ entries: TreeEntry[];
62
+ }
63
+ /** Commit 自定义 header */
64
+ interface GitCommitExtraHeader {
65
+ /**
66
+ * Header 名称
67
+ *
68
+ * 不能与内建字段重名。
69
+ */
70
+ name: string;
71
+ /** Header 值(多行 header 使用 `\n` 表示续行) */
72
+ value: string;
73
+ }
74
+ /** Commit 对象 — 存储快照信息 */
75
+ interface GitCommit {
76
+ type: "commit";
77
+ /** 指向的 tree 对象哈希 */
78
+ tree: SHA1;
79
+ /** 父 commit 哈希列表(merge commit 有多个父节点) */
80
+ parents: SHA1[];
81
+ /** 作者信息 */
82
+ author: GitAuthor;
83
+ /** 提交者信息 */
84
+ committer: GitAuthor;
85
+ /** 可选字符编码声明 */
86
+ encoding?: string;
87
+ /** GPG 签名块(不含 continuation 行前导空格) */
88
+ gpgsig?: string;
89
+ /** merge tag 块列表(不含 continuation 行前导空格) */
90
+ mergetag?: string[];
91
+ /**
92
+ * 自定义 header 列表
93
+ *
94
+ * 序列化时会按数组顺序输出在内建 header 之后。
95
+ */
96
+ extraHeaders?: GitCommitExtraHeader[];
97
+ /** 提交信息 */
98
+ message: string;
99
+ }
100
+ /** 作者/提交者信息 */
101
+ interface GitAuthor {
102
+ name: string;
103
+ email: string;
104
+ /** Unix 时间戳(秒) */
105
+ timestamp: number;
106
+ /** 时区偏移(如 "+0800") */
107
+ timezone: string;
108
+ }
109
+ /** Tag 对象 — 带注释的标签 */
110
+ interface GitTag {
111
+ type: "tag";
112
+ /** 指向的对象哈希 */
113
+ object: SHA1;
114
+ /** 被标记对象的类型 */
115
+ objectType: ObjectType;
116
+ /** 标签名 */
117
+ tag: string;
118
+ /** 标签创建者 */
119
+ tagger: GitAuthor;
120
+ /** GPG 签名块(不含 continuation 行前导空格) */
121
+ gpgsig?: string;
122
+ /**
123
+ * 自定义 header 列表
124
+ *
125
+ * 序列化时会按数组顺序输出在内建 header 之后。
126
+ */
127
+ extraHeaders?: GitCommitExtraHeader[];
128
+ /** 标签信息 */
129
+ message: string;
130
+ }
131
+ /**
132
+ * 所有 Git 对象的联合类型(语义层 AST)
133
+ *
134
+ * 用于查看、遍历和构造新对象。不直接作为 ODB 的存储边界。
135
+ * ODB 的真实边界是 RawGitObject。
136
+ *
137
+ * @see RawGitObject - ODB 层使用的底层原始对象
138
+ */
139
+ type GitObject = GitBlob | GitTree | GitCommit | GitTag;
140
+ /**
141
+ * 创建 SHA1 类型的辅助函数
142
+ *
143
+ * @param value - 待校验的哈希字符串
144
+ * @returns 带品牌的 SHA1 字符串
145
+ *
146
+ * @example
147
+ * ```ts
148
+ * const hash = sha1("95d09f2b10159347eece71399a7e2e907ea3df4f");
149
+ * console.log(hash);
150
+ * ```
151
+ */
152
+ declare function sha1(value: string): SHA1;
153
+ //#endregion
154
+ export { GitAuthor, GitBlob, GitCommit, GitCommitExtraHeader, GitObject, GitTag, GitTree, ObjectType, RawGitObject, SHA1, TreeEntry, assertObjectType, sha1 };
@@ -0,0 +1,43 @@
1
+ import { InvalidObjectError, InvalidSHA1Error } from "./errors.mjs";
2
+ //#region src/core/types.ts
3
+ /**
4
+ * nano-git 核心类型定义
5
+ *
6
+ * Git 的对象模型:
7
+ * - 所有对象通过 SHA-1 哈希寻址(40 个十六进制字符)
8
+ * - 四种对象类型:blob, tree, commit, tag
9
+ * - 对象以 "<type> <size>\0<content>" 格式存储
10
+ */
11
+ /**
12
+ * 验证并转换字符串为 ObjectType
13
+ *
14
+ * @throws InvalidObjectError 如果字符串不是合法的 ObjectType
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * assertObjectType("blob"); // => "blob"
19
+ * assertObjectType("invalid"); // throws InvalidObjectError
20
+ * ```
21
+ */
22
+ function assertObjectType(value) {
23
+ if (value === "blob" || value === "tree" || value === "commit" || value === "tag") return value;
24
+ throw new InvalidObjectError(`unknown object type: ${value}`);
25
+ }
26
+ /**
27
+ * 创建 SHA1 类型的辅助函数
28
+ *
29
+ * @param value - 待校验的哈希字符串
30
+ * @returns 带品牌的 SHA1 字符串
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * const hash = sha1("95d09f2b10159347eece71399a7e2e907ea3df4f");
35
+ * console.log(hash);
36
+ * ```
37
+ */
38
+ function sha1(value) {
39
+ if (!/^[0-9a-f]{40}$/.test(value)) throw new InvalidSHA1Error(value);
40
+ return value;
41
+ }
42
+ //#endregion
43
+ export { assertObjectType, sha1 };
@@ -0,0 +1,2 @@
1
+ import { CircularReferenceError, DeltaError, GitError, InvalidObjectError, InvalidPackError, InvalidSHA1Error, ObjectNotFoundError, PackError, PackIndexError, PreconditionCheckError, RefNotFoundError, RepositoryError, TransactionError } from "./core/errors.mjs";
2
+ export { CircularReferenceError, DeltaError, GitError, InvalidObjectError, InvalidPackError, InvalidSHA1Error, ObjectNotFoundError, PackError, PackIndexError, PreconditionCheckError, RefNotFoundError, RepositoryError, TransactionError };
@@ -0,0 +1,2 @@
1
+ import { CircularReferenceError, DeltaError, GitError, InvalidObjectError, InvalidPackError, InvalidSHA1Error, ObjectNotFoundError, PackError, PackIndexError, PreconditionCheckError, RefNotFoundError, RepositoryError, TransactionError } from "./core/errors.mjs";
2
+ export { CircularReferenceError, DeltaError, GitError, InvalidObjectError, InvalidPackError, InvalidSHA1Error, ObjectNotFoundError, PackError, PackIndexError, PreconditionCheckError, RefNotFoundError, RepositoryError, TransactionError };
@@ -0,0 +1,2 @@
1
+ import { hashFile } from "./core/hash-file.mjs";
2
+ export { hashFile };
@@ -0,0 +1,2 @@
1
+ import { hashFile } from "./core/hash-file.mjs";
2
+ export { hashFile };
@@ -0,0 +1,16 @@
1
+ import { GitAuthor, GitBlob, GitCommit, GitCommitExtraHeader, GitObject, GitTag, GitTree, ObjectType, RawGitObject, SHA1, TreeEntry, assertObjectType, sha1 } from "./core/types.mjs";
2
+ import { PackRepackOptions, RepositoryBackend, RepositoryGCOptions, RepositoryPackSupport, RepositoryRepackOptions } from "./backend/types.mjs";
3
+ import { CircularReferenceError, DeltaError, GitError, InvalidObjectError, InvalidPackError, InvalidSHA1Error, ObjectNotFoundError, PackError, PackIndexError, PreconditionCheckError, RefNotFoundError, RepositoryError, TransactionError } from "./core/errors.mjs";
4
+ import { FileRepository, Repository } from "./repository/types.mjs";
5
+ import { hashData, hashObject } from "./core/hash-digest.mjs";
6
+ import { isValidSHA1 } from "./core/hash-path.mjs";
7
+ import { deserializeBlob, serializeBlob } from "./objects/blob.mjs";
8
+ import { deserializeTree, serializeTree } from "./objects/tree.mjs";
9
+ import { deserializeCommit, serializeCommit } from "./objects/commit.mjs";
10
+ import { deserializeTag, serializeTag } from "./objects/tag.mjs";
11
+ import { formatAuthor, parseAuthor } from "./objects/author.mjs";
12
+ import { deserialize, deserializeContent, serialize, serializeContent } from "./objects/codec.mjs";
13
+ import { decodeObject, encodeObject, readObject, tryReadObject, writeObject } from "./objects/raw.mjs";
14
+ import { branchNameToRef, normalizeShortRefName, tagNameToRef, validateRefName, validateRefPrefix } from "./refs/names.mjs";
15
+ import { resolveRefHash, resolveSymbolicRef, resolveTargetHash } from "./refs/resolve.mjs";
16
+ export { CircularReferenceError, DeltaError, type FileRepository, type GitAuthor, type GitBlob, type GitCommit, type GitCommitExtraHeader, GitError, type GitObject, type GitTag, type GitTree, InvalidObjectError, InvalidPackError, InvalidSHA1Error, ObjectNotFoundError, type ObjectType, PackError, PackIndexError, type PackRepackOptions, PreconditionCheckError, type RawGitObject, RefNotFoundError, type Repository, type RepositoryBackend, RepositoryError, type RepositoryGCOptions, type RepositoryPackSupport, type RepositoryRepackOptions, type SHA1, TransactionError, type TreeEntry, assertObjectType, branchNameToRef, decodeObject, deserialize, deserializeBlob, deserializeCommit, deserializeContent, deserializeTag, deserializeTree, encodeObject, formatAuthor, hashData, hashObject, isValidSHA1, normalizeShortRefName, parseAuthor, readObject, resolveRefHash, resolveSymbolicRef, resolveTargetHash, serialize, serializeBlob, serializeCommit, serializeContent, serializeTag, serializeTree, sha1, tagNameToRef, tryReadObject, validateRefName, validateRefPrefix, writeObject };
package/dist/index.mjs ADDED
@@ -0,0 +1,14 @@
1
+ import { CircularReferenceError, DeltaError, GitError, InvalidObjectError, InvalidPackError, InvalidSHA1Error, ObjectNotFoundError, PackError, PackIndexError, PreconditionCheckError, RefNotFoundError, RepositoryError, TransactionError } from "./core/errors.mjs";
2
+ import { assertObjectType, sha1 } from "./core/types.mjs";
3
+ import { hashData, hashObject } from "./core/hash-digest.mjs";
4
+ import { isValidSHA1 } from "./core/hash-path.mjs";
5
+ import { deserializeBlob, serializeBlob } from "./objects/blob.mjs";
6
+ import { deserializeTree, serializeTree } from "./objects/tree.mjs";
7
+ import { formatAuthor, parseAuthor } from "./objects/author.mjs";
8
+ import { deserializeCommit, serializeCommit } from "./objects/commit.mjs";
9
+ import { deserializeTag, serializeTag } from "./objects/tag.mjs";
10
+ import { deserialize, deserializeContent, serialize, serializeContent } from "./objects/codec.mjs";
11
+ import { decodeObject, encodeObject, readObject, tryReadObject, writeObject } from "./objects/raw.mjs";
12
+ import { branchNameToRef, normalizeShortRefName, tagNameToRef, validateRefName, validateRefPrefix } from "./refs/names.mjs";
13
+ import { resolveRefHash, resolveSymbolicRef, resolveTargetHash } from "./refs/resolve.mjs";
14
+ export { CircularReferenceError, DeltaError, GitError, InvalidObjectError, InvalidPackError, InvalidSHA1Error, ObjectNotFoundError, PackError, PackIndexError, PreconditionCheckError, RefNotFoundError, RepositoryError, TransactionError, assertObjectType, branchNameToRef, decodeObject, deserialize, deserializeBlob, deserializeCommit, deserializeContent, deserializeTag, deserializeTree, encodeObject, formatAuthor, hashData, hashObject, isValidSHA1, normalizeShortRefName, parseAuthor, readObject, resolveRefHash, resolveSymbolicRef, resolveTargetHash, serialize, serializeBlob, serializeCommit, serializeContent, serializeTag, serializeTree, sha1, tagNameToRef, tryReadObject, validateRefName, validateRefPrefix, writeObject };
@@ -0,0 +1,25 @@
1
+ import { GitAuthor } from "../core/types.mjs";
2
+
3
+ //#region src/objects/author.d.ts
4
+ /**
5
+ * 格式化作者信息为 Git 标准格式
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * formatAuthor({ name: "John", email: "j@e.com", timestamp: 123, timezone: "+0800" })
10
+ * // => "John <j@e.com> 123 +0800"
11
+ * ```
12
+ */
13
+ declare function formatAuthor(author: GitAuthor): string;
14
+ /**
15
+ * 解析 Git 标准格式的作者信息
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * parseAuthor("John <j@e.com> 123 +0800")
20
+ * // => { name: "John", email: "j@e.com", timestamp: 123, timezone: "+0800" }
21
+ * ```
22
+ */
23
+ declare function parseAuthor(text: string): GitAuthor;
24
+ //#endregion
25
+ export { formatAuthor, parseAuthor };
@@ -0,0 +1,45 @@
1
+ import { InvalidObjectError } from "../core/errors.mjs";
2
+ //#region src/objects/author.ts
3
+ /**
4
+ * 作者信息格式化与解析
5
+ *
6
+ * Git 中作者信息的格式:
7
+ * "<name> <<email>> <timestamp> <timezone>"
8
+ *
9
+ * 例如: "John Doe <john@example.com> 1234567890 +0800"
10
+ *
11
+ * 此格式在 commit 和 tag 对象中共享使用。
12
+ */
13
+ /**
14
+ * 格式化作者信息为 Git 标准格式
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * formatAuthor({ name: "John", email: "j@e.com", timestamp: 123, timezone: "+0800" })
19
+ * // => "John <j@e.com> 123 +0800"
20
+ * ```
21
+ */
22
+ function formatAuthor(author) {
23
+ return `${author.name} <${author.email}> ${author.timestamp} ${author.timezone}`;
24
+ }
25
+ /**
26
+ * 解析 Git 标准格式的作者信息
27
+ *
28
+ * @example
29
+ * ```ts
30
+ * parseAuthor("John <j@e.com> 123 +0800")
31
+ * // => { name: "John", email: "j@e.com", timestamp: 123, timezone: "+0800" }
32
+ * ```
33
+ */
34
+ function parseAuthor(text) {
35
+ const match = text.match(/^(.+?) <(.+?)> (\d+) ([+-]\d{4})$/);
36
+ if (!match) throw new InvalidObjectError(`invalid author format: ${text}`);
37
+ return {
38
+ name: match[1],
39
+ email: match[2],
40
+ timestamp: parseInt(match[3], 10),
41
+ timezone: match[4]
42
+ };
43
+ }
44
+ //#endregion
45
+ export { formatAuthor, parseAuthor };
@@ -0,0 +1,15 @@
1
+ import { GitBlob } from "../core/types.mjs";
2
+
3
+ //#region src/objects/blob.d.ts
4
+ /**
5
+ * 序列化 Blob 对象
6
+ *
7
+ * Blob 的内容就是原始文件数据,无需额外处理。
8
+ */
9
+ declare function serializeBlob(blob: GitBlob): Buffer;
10
+ /**
11
+ * 反序列化 Blob 对象
12
+ */
13
+ declare function deserializeBlob(content: Buffer): GitBlob;
14
+ //#endregion
15
+ export { deserializeBlob, serializeBlob };
@@ -0,0 +1,20 @@
1
+ //#region src/objects/blob.ts
2
+ /**
3
+ * 序列化 Blob 对象
4
+ *
5
+ * Blob 的内容就是原始文件数据,无需额外处理。
6
+ */
7
+ function serializeBlob(blob) {
8
+ return blob.content;
9
+ }
10
+ /**
11
+ * 反序列化 Blob 对象
12
+ */
13
+ function deserializeBlob(content) {
14
+ return {
15
+ type: "blob",
16
+ content
17
+ };
18
+ }
19
+ //#endregion
20
+ export { deserializeBlob, serializeBlob };
@@ -0,0 +1,46 @@
1
+ import { GitObject, ObjectType } from "../core/types.mjs";
2
+
3
+ //#region src/objects/codec.d.ts
4
+ /**
5
+ * 序列化 Git 对象为完整的存储格式
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * const blob: GitBlob = { type: "blob", content: Buffer.from("hello") };
10
+ * const data = serialize(blob);
11
+ * // => Buffer("blob 5\0hello")
12
+ * ```
13
+ */
14
+ declare function serialize(obj: GitObject): Buffer;
15
+ /**
16
+ * 反序列化完整的存储格式为 Git 对象
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * const obj = deserialize(Buffer.from("blob 5\0hello"));
21
+ * console.log(obj.type); // => "blob"
22
+ * ```
23
+ */
24
+ declare function deserialize(data: Buffer): GitObject;
25
+ /**
26
+ * 序列化对象内容(不含 header)
27
+ *
28
+ * @example
29
+ * ```ts
30
+ * const content = serializeContent({ type: "blob", content: Buffer.from("hello") });
31
+ * console.log(content.toString("utf-8")); // => "hello"
32
+ * ```
33
+ */
34
+ declare function serializeContent(obj: GitObject): Buffer;
35
+ /**
36
+ * 反序列化对象内容(不含 header)
37
+ *
38
+ * @example
39
+ * ```ts
40
+ * const obj = deserializeContent("blob", Buffer.from("hello"));
41
+ * console.log(obj.type); // => "blob"
42
+ * ```
43
+ */
44
+ declare function deserializeContent(type: ObjectType, content: Buffer): GitObject;
45
+ //#endregion
46
+ export { deserialize, deserializeContent, serialize, serializeContent };
@@ -0,0 +1,84 @@
1
+ import { InvalidObjectError } from "../core/errors.mjs";
2
+ import { assertObjectType } from "../core/types.mjs";
3
+ import { deserializeBlob, serializeBlob } from "./blob.mjs";
4
+ import { deserializeTree, serializeTree } from "./tree.mjs";
5
+ import { deserializeCommit, serializeCommit } from "./commit.mjs";
6
+ import { deserializeTag, serializeTag } from "./tag.mjs";
7
+ //#region src/objects/codec.ts
8
+ /**
9
+ * Git 对象编解码
10
+ *
11
+ * 提供完整对象格式与对象内容格式之间的转换能力。
12
+ */
13
+ /**
14
+ * 序列化 Git 对象为完整的存储格式
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * const blob: GitBlob = { type: "blob", content: Buffer.from("hello") };
19
+ * const data = serialize(blob);
20
+ * // => Buffer("blob 5\0hello")
21
+ * ```
22
+ */
23
+ function serialize(obj) {
24
+ const content = serializeContent(obj);
25
+ const header = `${obj.type} ${content.length}\0`;
26
+ return Buffer.concat([Buffer.from(header), content]);
27
+ }
28
+ /**
29
+ * 反序列化完整的存储格式为 Git 对象
30
+ *
31
+ * @example
32
+ * ```ts
33
+ * const obj = deserialize(Buffer.from("blob 5\0hello"));
34
+ * console.log(obj.type); // => "blob"
35
+ * ```
36
+ */
37
+ function deserialize(data) {
38
+ const nullIndex = data.indexOf(0);
39
+ if (nullIndex === -1) throw new InvalidObjectError("missing null byte");
40
+ const header = data.subarray(0, nullIndex).toString("utf-8");
41
+ const match = header.match(/^(blob|tree|commit|tag) (\d+)$/);
42
+ if (!match) throw new InvalidObjectError(`invalid header: ${header}`);
43
+ const type = assertObjectType(match[1]);
44
+ const size = parseInt(match[2], 10);
45
+ const content = data.subarray(nullIndex + 1);
46
+ if (content.length !== size) throw new InvalidObjectError(`size mismatch: header says ${size}, got ${content.length}`);
47
+ return deserializeContent(type, content);
48
+ }
49
+ /**
50
+ * 序列化对象内容(不含 header)
51
+ *
52
+ * @example
53
+ * ```ts
54
+ * const content = serializeContent({ type: "blob", content: Buffer.from("hello") });
55
+ * console.log(content.toString("utf-8")); // => "hello"
56
+ * ```
57
+ */
58
+ function serializeContent(obj) {
59
+ switch (obj.type) {
60
+ case "blob": return serializeBlob(obj);
61
+ case "tree": return serializeTree(obj);
62
+ case "commit": return serializeCommit(obj);
63
+ case "tag": return serializeTag(obj);
64
+ }
65
+ }
66
+ /**
67
+ * 反序列化对象内容(不含 header)
68
+ *
69
+ * @example
70
+ * ```ts
71
+ * const obj = deserializeContent("blob", Buffer.from("hello"));
72
+ * console.log(obj.type); // => "blob"
73
+ * ```
74
+ */
75
+ function deserializeContent(type, content) {
76
+ switch (type) {
77
+ case "blob": return deserializeBlob(content);
78
+ case "tree": return deserializeTree(content);
79
+ case "commit": return deserializeCommit(content);
80
+ case "tag": return deserializeTag(content);
81
+ }
82
+ }
83
+ //#endregion
84
+ export { deserialize, deserializeContent, serialize, serializeContent };
@@ -0,0 +1,26 @@
1
+ import { GitCommit } from "../core/types.mjs";
2
+
3
+ //#region src/objects/commit.d.ts
4
+ /**
5
+ * 序列化 Commit 对象
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * const commit: GitCommit = {
10
+ * type: "commit",
11
+ * tree: sha1("abc..."),
12
+ * parents: [],
13
+ * author: { name: "John", email: "j@e.com", timestamp: 123, timezone: "+0800" },
14
+ * committer: { name: "John", email: "j@e.com", timestamp: 123, timezone: "+0800" },
15
+ * message: "Initial commit",
16
+ * };
17
+ * const buf = serializeCommit(commit);
18
+ * ```
19
+ */
20
+ declare function serializeCommit(commit: GitCommit): Buffer;
21
+ /**
22
+ * 反序列化 Commit 对象
23
+ */
24
+ declare function deserializeCommit(content: Buffer): GitCommit;
25
+ //#endregion
26
+ export { deserializeCommit, serializeCommit };