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.
- package/README.md +407 -0
- package/dist/backend/file-backend.d.mts +26 -0
- package/dist/backend/file-backend.mjs +83 -0
- package/dist/backend/file.d.mts +2 -0
- package/dist/backend/file.mjs +2 -0
- package/dist/backend/index.d.mts +2 -0
- package/dist/backend/index.mjs +1 -0
- package/dist/backend/memory-backend.d.mts +25 -0
- package/dist/backend/memory-backend.mjs +33 -0
- package/dist/backend/memory.d.mts +2 -0
- package/dist/backend/memory.mjs +2 -0
- package/dist/backend/types.d.mts +90 -0
- package/dist/core/errors.d.mts +124 -0
- package/dist/core/errors.mjs +168 -0
- package/dist/core/hash-digest.d.mts +35 -0
- package/dist/core/hash-digest.mjs +50 -0
- package/dist/core/hash-file.d.mts +20 -0
- package/dist/core/hash-file.mjs +27 -0
- package/dist/core/hash-path.d.mts +17 -0
- package/dist/core/hash-path.mjs +35 -0
- package/dist/core/types/odb.d.mts +63 -0
- package/dist/core/types/refs.d.mts +140 -0
- package/dist/core/types/refs.mjs +19 -0
- package/dist/core/types/shallow.d.mts +52 -0
- package/dist/core/types.d.mts +154 -0
- package/dist/core/types.mjs +43 -0
- package/dist/errors.d.mts +2 -0
- package/dist/errors.mjs +2 -0
- package/dist/hash-file.d.mts +2 -0
- package/dist/hash-file.mjs +2 -0
- package/dist/index.d.mts +16 -0
- package/dist/index.mjs +14 -0
- package/dist/objects/author.d.mts +25 -0
- package/dist/objects/author.mjs +45 -0
- package/dist/objects/blob.d.mts +15 -0
- package/dist/objects/blob.mjs +20 -0
- package/dist/objects/codec.d.mts +46 -0
- package/dist/objects/codec.mjs +84 -0
- package/dist/objects/commit.d.mts +26 -0
- package/dist/objects/commit.mjs +160 -0
- package/dist/objects/index.d.mts +8 -0
- package/dist/objects/index.mjs +8 -0
- package/dist/objects/raw.d.mts +85 -0
- package/dist/objects/raw.mjs +111 -0
- package/dist/objects/tag.d.mts +26 -0
- package/dist/objects/tag.mjs +148 -0
- package/dist/objects/tree.d.mts +22 -0
- package/dist/objects/tree.mjs +66 -0
- package/dist/odb/file-utils.mjs +136 -0
- package/dist/odb/file.d.mts +22 -0
- package/dist/odb/file.mjs +66 -0
- package/dist/odb/memory.d.mts +22 -0
- package/dist/odb/memory.mjs +54 -0
- package/dist/pack/composite-store.d.mts +76 -0
- package/dist/pack/composite-store.mjs +133 -0
- package/dist/pack/constants.mjs +48 -0
- package/dist/pack/crc32.mjs +38 -0
- package/dist/pack/delta-apply.d.mts +21 -0
- package/dist/pack/delta-apply.mjs +71 -0
- package/dist/pack/delta-create.d.mts +28 -0
- package/dist/pack/delta-create.mjs +151 -0
- package/dist/pack/index.d.mts +16 -0
- package/dist/pack/index.mjs +13 -0
- package/dist/pack/object-header.d.mts +36 -0
- package/dist/pack/object-header.mjs +72 -0
- package/dist/pack/ofs-delta-offset.d.mts +35 -0
- package/dist/pack/ofs-delta-offset.mjs +59 -0
- package/dist/pack/pack-builder-types.d.mts +19 -0
- package/dist/pack/pack-builder.d.mts +52 -0
- package/dist/pack/pack-builder.mjs +80 -0
- package/dist/pack/pack-encoding.mjs +76 -0
- package/dist/pack/pack-index-reader.d.mts +57 -0
- package/dist/pack/pack-index-reader.mjs +90 -0
- package/dist/pack/pack-index-types.d.mts +16 -0
- package/dist/pack/pack-index-writer.d.mts +45 -0
- package/dist/pack/pack-index-writer.mjs +106 -0
- package/dist/pack/pack-reader-resolver.mjs +104 -0
- package/dist/pack/pack-reader-types.d.mts +31 -0
- package/dist/pack/pack-reader-types.mjs +22 -0
- package/dist/pack/pack-reader-utils.mjs +61 -0
- package/dist/pack/pack-reader.d.mts +81 -0
- package/dist/pack/pack-reader.mjs +171 -0
- package/dist/pack/pack-store-loader.mjs +79 -0
- package/dist/pack/pack-store-types.d.mts +16 -0
- package/dist/pack/pack-store.d.mts +55 -0
- package/dist/pack/pack-store.mjs +114 -0
- package/dist/pack/pack-writer.mjs +96 -0
- package/dist/pack/varint.d.mts +34 -0
- package/dist/pack/varint.mjs +57 -0
- package/dist/refs/file.d.mts +6 -0
- package/dist/refs/file.mjs +222 -0
- package/dist/refs/fs-utils.mjs +30 -0
- package/dist/refs/memory.d.mts +14 -0
- package/dist/refs/memory.mjs +104 -0
- package/dist/refs/names.d.mts +57 -0
- package/dist/refs/names.mjs +80 -0
- package/dist/refs/resolve.d.mts +33 -0
- package/dist/refs/resolve.mjs +55 -0
- package/dist/refs/shallow/file.d.mts +17 -0
- package/dist/refs/shallow/file.mjs +61 -0
- package/dist/refs/shallow/memory.d.mts +18 -0
- package/dist/refs/shallow/memory.mjs +33 -0
- package/dist/repository/core.d.mts +3 -0
- package/dist/repository/core.mjs +2 -0
- package/dist/repository/create.d.mts +22 -0
- package/dist/repository/create.mjs +43 -0
- package/dist/repository/file.d.mts +43 -0
- package/dist/repository/file.mjs +82 -0
- package/dist/repository/import/import-glob.mjs +44 -0
- package/dist/repository/import/import-plan-builder.mjs +625 -0
- package/dist/repository/import/import-session-types.d.mts +280 -0
- package/dist/repository/import/import-session.mjs +96 -0
- package/dist/repository/import/import-view.mjs +133 -0
- package/dist/repository/memory.d.mts +17 -0
- package/dist/repository/memory.mjs +33 -0
- package/dist/repository/ops/fetch-operations.mjs +20 -0
- package/dist/repository/ops/fetch-types.d.mts +82 -0
- package/dist/repository/ops/fetch-url.mjs +82 -0
- package/dist/repository/ops/fs-object-operations.mjs +31 -0
- package/dist/repository/ops/maintenance-operations.mjs +62 -0
- package/dist/repository/ops/maintenance-types.d.mts +42 -0
- package/dist/repository/ops/object-operations.mjs +65 -0
- package/dist/repository/ops/object-types.d.mts +109 -0
- package/dist/repository/ops/push-operations.mjs +16 -0
- package/dist/repository/ops/push-resolution.mjs +17 -0
- package/dist/repository/ops/push-types.d.mts +72 -0
- package/dist/repository/ops/push-url.mjs +45 -0
- package/dist/repository/ops/reachability.mjs +60 -0
- package/dist/repository/ops/ref-operations.mjs +86 -0
- package/dist/repository/ops/ref-types.d.mts +70 -0
- package/dist/repository/tree/tree-patch.d.mts +64 -0
- package/dist/repository/tree/tree-patch.mjs +268 -0
- package/dist/repository/tree/tree-walk.d.mts +46 -0
- package/dist/repository/tree/tree-walk.mjs +65 -0
- package/dist/repository/tree/tree-writer.mjs +68 -0
- package/dist/repository/types.d.mts +36 -0
- package/dist/sha1.d.mts +4 -0
- package/dist/sha1.mjs +4 -0
- package/dist/transport/client/receive-pack/http.d.mts +33 -0
- package/dist/transport/client/receive-pack/http.mjs +99 -0
- package/dist/transport/client/receive-pack/push-error.d.mts +23 -0
- package/dist/transport/client/receive-pack/push-error.mjs +32 -0
- package/dist/transport/client/receive-pack/push-pack-plan.d.mts +28 -0
- package/dist/transport/client/receive-pack/push-pack-plan.mjs +60 -0
- package/dist/transport/client/receive-pack/push-policy.d.mts +19 -0
- package/dist/transport/client/receive-pack/push-policy.mjs +64 -0
- package/dist/transport/client/receive-pack/push-ref-plan.d.mts +45 -0
- package/dist/transport/client/receive-pack/push-ref-plan.mjs +108 -0
- package/dist/transport/client/receive-pack/push-report.d.mts +28 -0
- package/dist/transport/client/receive-pack/push-report.mjs +84 -0
- package/dist/transport/client/receive-pack/push-request-plan.mjs +52 -0
- package/dist/transport/client/receive-pack/push.d.mts +32 -0
- package/dist/transport/client/receive-pack/push.mjs +97 -0
- package/dist/transport/client/receive-pack/request.d.mts +39 -0
- package/dist/transport/client/receive-pack/request.mjs +46 -0
- package/dist/transport/client/receive-pack/response.d.mts +26 -0
- package/dist/transport/client/receive-pack/response.mjs +52 -0
- package/dist/transport/client/receive-pack/result.d.mts +34 -0
- package/dist/transport/client/receive-pack/result.mjs +100 -0
- package/dist/transport/client/upload-pack/capability-advertisement.d.mts +56 -0
- package/dist/transport/client/upload-pack/capability-advertisement.mjs +130 -0
- package/dist/transport/client/upload-pack/fetch.d.mts +109 -0
- package/dist/transport/client/upload-pack/fetch.mjs +392 -0
- package/dist/transport/client/upload-pack/http.d.mts +29 -0
- package/dist/transport/client/upload-pack/http.mjs +79 -0
- package/dist/transport/client/upload-pack/ls-refs.d.mts +75 -0
- package/dist/transport/client/upload-pack/ls-refs.mjs +150 -0
- package/dist/transport/client/upload-pack/object-info.d.mts +65 -0
- package/dist/transport/client/upload-pack/object-info.mjs +111 -0
- package/dist/transport/client/upload-pack/types.d.mts +153 -0
- package/dist/transport/http/index.d.mts +3 -0
- package/dist/transport/http/index.mjs +2 -0
- package/dist/transport/http/smart-http.d.mts +46 -0
- package/dist/transport/http/smart-http.mjs +176 -0
- package/dist/transport/http/types.d.mts +27 -0
- package/dist/transport/index.d.mts +9 -0
- package/dist/transport/index.mjs +8 -0
- package/dist/transport/protocol/object-graph.d.mts +63 -0
- package/dist/transport/protocol/object-graph.mjs +149 -0
- package/dist/transport/protocol/pkt-line.d.mts +109 -0
- package/dist/transport/protocol/pkt-line.mjs +195 -0
- package/dist/transport/protocol/ref-advertisement.mjs +185 -0
- package/dist/transport/protocol/ref-collection.d.mts +38 -0
- package/dist/transport/protocol/ref-collection.mjs +63 -0
- package/dist/transport/protocol/ref-match.d.mts +39 -0
- package/dist/transport/protocol/ref-match.mjs +42 -0
- package/dist/transport/protocol/refspec.d.mts +44 -0
- package/dist/transport/protocol/refspec.mjs +79 -0
- package/dist/transport/protocol/side-band.d.mts +65 -0
- package/dist/transport/protocol/side-band.mjs +142 -0
- package/dist/transport/protocol/transport-capabilities.mjs +46 -0
- package/dist/transport/protocol/types.d.mts +148 -0
- package/dist/transport/protocol/update-refs.d.mts +68 -0
- package/dist/transport/protocol/update-refs.mjs +126 -0
- package/dist/transport/receive-pack.d.mts +11 -0
- package/dist/transport/receive-pack.mjs +11 -0
- package/dist/transport/server/receive-pack/advertise.d.mts +28 -0
- package/dist/transport/server/receive-pack/advertise.mjs +88 -0
- package/dist/transport/server/receive-pack/handler.d.mts +30 -0
- package/dist/transport/server/receive-pack/handler.mjs +156 -0
- package/dist/transport/server/receive-pack/index.d.mts +6 -0
- package/dist/transport/server/receive-pack/index.mjs +6 -0
- package/dist/transport/server/receive-pack/parse.d.mts +17 -0
- package/dist/transport/server/receive-pack/parse.mjs +80 -0
- package/dist/transport/server/receive-pack/report-status.mjs +64 -0
- package/dist/transport/server/receive-pack/service.d.mts +41 -0
- package/dist/transport/server/receive-pack/service.mjs +39 -0
- package/dist/transport/server/receive-pack/types.d.mts +56 -0
- package/dist/transport/server/receive-pack/types.mjs +25 -0
- package/dist/transport/server/receive-pack/unpack.mjs +119 -0
- package/dist/transport/server/upload-pack/advertise.d.mts +20 -0
- package/dist/transport/server/upload-pack/advertise.mjs +30 -0
- package/dist/transport/server/upload-pack/command.d.mts +43 -0
- package/dist/transport/server/upload-pack/command.mjs +56 -0
- package/dist/transport/server/upload-pack/fetch.d.mts +43 -0
- package/dist/transport/server/upload-pack/fetch.mjs +217 -0
- package/dist/transport/server/upload-pack/index.d.mts +7 -0
- package/dist/transport/server/upload-pack/index.mjs +7 -0
- package/dist/transport/server/upload-pack/ls-refs.d.mts +38 -0
- package/dist/transport/server/upload-pack/ls-refs.mjs +113 -0
- package/dist/transport/server/upload-pack/service.d.mts +40 -0
- package/dist/transport/server/upload-pack/service.mjs +51 -0
- package/dist/transport/server/upload-pack/types.d.mts +11 -0
- package/dist/transport/server/upload-pack/types.mjs +21 -0
- package/dist/transport/upload-pack.d.mts +7 -0
- package/dist/transport/upload-pack.mjs +6 -0
- package/package.json +98 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
//#region src/core/errors.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* nano-git 错误类型体系
|
|
4
|
+
*
|
|
5
|
+
* 提供统一的错误类型,便于错误处理和调试。
|
|
6
|
+
* 所有错误都继承自 GitError 基类。
|
|
7
|
+
*
|
|
8
|
+
* 注意:本模块不导入 types.ts,避免循环依赖。
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Git 错误基类
|
|
12
|
+
*
|
|
13
|
+
* 所有 nano-git 抛出的错误都继承自此类。
|
|
14
|
+
*/
|
|
15
|
+
declare class GitError extends Error {
|
|
16
|
+
constructor(message: string);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 对象未找到错误
|
|
20
|
+
*
|
|
21
|
+
* 当尝试读取不存在的 Git 对象时抛出。
|
|
22
|
+
*/
|
|
23
|
+
declare class ObjectNotFoundError extends GitError {
|
|
24
|
+
/** 缺失对象的哈希 */
|
|
25
|
+
hash: string;
|
|
26
|
+
constructor(hash: string, message?: string);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 无效的 Git 对象错误
|
|
30
|
+
*
|
|
31
|
+
* 当对象格式不符合 Git 规范时抛出。
|
|
32
|
+
*/
|
|
33
|
+
declare class InvalidObjectError extends GitError {
|
|
34
|
+
constructor(message: string);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 无效的 SHA-1 哈希错误
|
|
38
|
+
*
|
|
39
|
+
* 当字符串不符合 SHA-1 格式(40 个十六进制字符)时抛出。
|
|
40
|
+
*/
|
|
41
|
+
declare class InvalidSHA1Error extends GitError {
|
|
42
|
+
/** 无效的 SHA-1 字符串 */
|
|
43
|
+
value: string;
|
|
44
|
+
constructor(value: string);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 仓库错误
|
|
48
|
+
*
|
|
49
|
+
* 与仓库操作相关的错误。
|
|
50
|
+
*/
|
|
51
|
+
declare class RepositoryError extends GitError {
|
|
52
|
+
constructor(message: string);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 循环引用错误
|
|
56
|
+
*
|
|
57
|
+
* 当检测到符号引用形成循环时抛出。
|
|
58
|
+
*/
|
|
59
|
+
declare class CircularReferenceError extends GitError {
|
|
60
|
+
/** 形成循环的引用名称 */
|
|
61
|
+
ref: string;
|
|
62
|
+
constructor(ref: string);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* 引用未找到错误
|
|
66
|
+
*
|
|
67
|
+
* 当尝试读取不存在的引用时抛出。
|
|
68
|
+
*/
|
|
69
|
+
declare class RefNotFoundError extends GitError {
|
|
70
|
+
/** 不存在的引用名称 */
|
|
71
|
+
ref: string;
|
|
72
|
+
constructor(ref: string);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Packfile 错误
|
|
76
|
+
*
|
|
77
|
+
* 与 Packfile 操作相关的错误。
|
|
78
|
+
*/
|
|
79
|
+
declare class PackError extends GitError {
|
|
80
|
+
constructor(message: string);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 无效的 Packfile 错误
|
|
84
|
+
*
|
|
85
|
+
* 当 Packfile 格式不符合 Git 规范时抛出。
|
|
86
|
+
*/
|
|
87
|
+
declare class InvalidPackError extends PackError {
|
|
88
|
+
constructor(message: string);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Packfile 索引错误
|
|
92
|
+
*
|
|
93
|
+
* 当 Packfile 索引(.idx)文件格式不正确时抛出。
|
|
94
|
+
*/
|
|
95
|
+
declare class PackIndexError extends PackError {
|
|
96
|
+
constructor(message: string);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Delta 解码错误
|
|
100
|
+
*
|
|
101
|
+
* 当 delta 对象解码失败时抛出。
|
|
102
|
+
*/
|
|
103
|
+
declare class DeltaError extends PackError {
|
|
104
|
+
constructor(message: string);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* 事务错误
|
|
108
|
+
*
|
|
109
|
+
* 当事务操作(commit / rollback / write / delete)被非法调用时抛出。
|
|
110
|
+
*/
|
|
111
|
+
declare class TransactionError extends GitError {
|
|
112
|
+
constructor(message: string);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* 前置条件校验错误
|
|
116
|
+
*
|
|
117
|
+
* 当 import session 在 apply() 阶段检测到 preview() 之后
|
|
118
|
+
* 前置条件(ref 值、期望哈希等)已变化时抛出。
|
|
119
|
+
*/
|
|
120
|
+
declare class PreconditionCheckError extends GitError {
|
|
121
|
+
constructor(message: string);
|
|
122
|
+
}
|
|
123
|
+
//#endregion
|
|
124
|
+
export { CircularReferenceError, DeltaError, GitError, InvalidObjectError, InvalidPackError, InvalidSHA1Error, ObjectNotFoundError, PackError, PackIndexError, PreconditionCheckError, RefNotFoundError, RepositoryError, TransactionError };
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
//#region src/core/errors.ts
|
|
2
|
+
/**
|
|
3
|
+
* nano-git 错误类型体系
|
|
4
|
+
*
|
|
5
|
+
* 提供统一的错误类型,便于错误处理和调试。
|
|
6
|
+
* 所有错误都继承自 GitError 基类。
|
|
7
|
+
*
|
|
8
|
+
* 注意:本模块不导入 types.ts,避免循环依赖。
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Git 错误基类
|
|
12
|
+
*
|
|
13
|
+
* 所有 nano-git 抛出的错误都继承自此类。
|
|
14
|
+
*/
|
|
15
|
+
var GitError = class extends Error {
|
|
16
|
+
constructor(message) {
|
|
17
|
+
super(message);
|
|
18
|
+
this.name = "GitError";
|
|
19
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* 对象未找到错误
|
|
24
|
+
*
|
|
25
|
+
* 当尝试读取不存在的 Git 对象时抛出。
|
|
26
|
+
*/
|
|
27
|
+
var ObjectNotFoundError = class extends GitError {
|
|
28
|
+
/** 缺失对象的哈希 */
|
|
29
|
+
hash;
|
|
30
|
+
constructor(hash, message) {
|
|
31
|
+
super(message ?? `Object not found: ${hash}`);
|
|
32
|
+
this.name = "ObjectNotFoundError";
|
|
33
|
+
this.hash = hash;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* 无效的 Git 对象错误
|
|
38
|
+
*
|
|
39
|
+
* 当对象格式不符合 Git 规范时抛出。
|
|
40
|
+
*/
|
|
41
|
+
var InvalidObjectError = class extends GitError {
|
|
42
|
+
constructor(message) {
|
|
43
|
+
super(`Invalid Git object: ${message}`);
|
|
44
|
+
this.name = "InvalidObjectError";
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* 无效的 SHA-1 哈希错误
|
|
49
|
+
*
|
|
50
|
+
* 当字符串不符合 SHA-1 格式(40 个十六进制字符)时抛出。
|
|
51
|
+
*/
|
|
52
|
+
var InvalidSHA1Error = class extends GitError {
|
|
53
|
+
/** 无效的 SHA-1 字符串 */
|
|
54
|
+
value;
|
|
55
|
+
constructor(value) {
|
|
56
|
+
super(`Invalid SHA-1 hash: ${value}`);
|
|
57
|
+
this.name = "InvalidSHA1Error";
|
|
58
|
+
this.value = value;
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* 仓库错误
|
|
63
|
+
*
|
|
64
|
+
* 与仓库操作相关的错误。
|
|
65
|
+
*/
|
|
66
|
+
var RepositoryError = class extends GitError {
|
|
67
|
+
constructor(message) {
|
|
68
|
+
super(message);
|
|
69
|
+
this.name = "RepositoryError";
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* 循环引用错误
|
|
74
|
+
*
|
|
75
|
+
* 当检测到符号引用形成循环时抛出。
|
|
76
|
+
*/
|
|
77
|
+
var CircularReferenceError = class extends GitError {
|
|
78
|
+
/** 形成循环的引用名称 */
|
|
79
|
+
ref;
|
|
80
|
+
constructor(ref) {
|
|
81
|
+
super(`Circular reference detected: ${ref}`);
|
|
82
|
+
this.name = "CircularReferenceError";
|
|
83
|
+
this.ref = ref;
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* 引用未找到错误
|
|
88
|
+
*
|
|
89
|
+
* 当尝试读取不存在的引用时抛出。
|
|
90
|
+
*/
|
|
91
|
+
var RefNotFoundError = class extends GitError {
|
|
92
|
+
/** 不存在的引用名称 */
|
|
93
|
+
ref;
|
|
94
|
+
constructor(ref) {
|
|
95
|
+
super(`Reference not found: ${ref}`);
|
|
96
|
+
this.name = "RefNotFoundError";
|
|
97
|
+
this.ref = ref;
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* Packfile 错误
|
|
102
|
+
*
|
|
103
|
+
* 与 Packfile 操作相关的错误。
|
|
104
|
+
*/
|
|
105
|
+
var PackError = class extends GitError {
|
|
106
|
+
constructor(message) {
|
|
107
|
+
super(`Packfile error: ${message}`);
|
|
108
|
+
this.name = "PackError";
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* 无效的 Packfile 错误
|
|
113
|
+
*
|
|
114
|
+
* 当 Packfile 格式不符合 Git 规范时抛出。
|
|
115
|
+
*/
|
|
116
|
+
var InvalidPackError = class extends PackError {
|
|
117
|
+
constructor(message) {
|
|
118
|
+
super(`Invalid packfile: ${message}`);
|
|
119
|
+
this.name = "InvalidPackError";
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
/**
|
|
123
|
+
* Packfile 索引错误
|
|
124
|
+
*
|
|
125
|
+
* 当 Packfile 索引(.idx)文件格式不正确时抛出。
|
|
126
|
+
*/
|
|
127
|
+
var PackIndexError = class extends PackError {
|
|
128
|
+
constructor(message) {
|
|
129
|
+
super(`Pack index error: ${message}`);
|
|
130
|
+
this.name = "PackIndexError";
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
/**
|
|
134
|
+
* Delta 解码错误
|
|
135
|
+
*
|
|
136
|
+
* 当 delta 对象解码失败时抛出。
|
|
137
|
+
*/
|
|
138
|
+
var DeltaError = class extends PackError {
|
|
139
|
+
constructor(message) {
|
|
140
|
+
super(`Delta decode error: ${message}`);
|
|
141
|
+
this.name = "DeltaError";
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
/**
|
|
145
|
+
* 事务错误
|
|
146
|
+
*
|
|
147
|
+
* 当事务操作(commit / rollback / write / delete)被非法调用时抛出。
|
|
148
|
+
*/
|
|
149
|
+
var TransactionError = class extends GitError {
|
|
150
|
+
constructor(message) {
|
|
151
|
+
super(`Transaction error: ${message}`);
|
|
152
|
+
this.name = "TransactionError";
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
/**
|
|
156
|
+
* 前置条件校验错误
|
|
157
|
+
*
|
|
158
|
+
* 当 import session 在 apply() 阶段检测到 preview() 之后
|
|
159
|
+
* 前置条件(ref 值、期望哈希等)已变化时抛出。
|
|
160
|
+
*/
|
|
161
|
+
var PreconditionCheckError = class extends GitError {
|
|
162
|
+
constructor(message) {
|
|
163
|
+
super(message);
|
|
164
|
+
this.name = "PreconditionCheckError";
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
//#endregion
|
|
168
|
+
export { CircularReferenceError, DeltaError, GitError, InvalidObjectError, InvalidPackError, InvalidSHA1Error, ObjectNotFoundError, PackError, PackIndexError, PreconditionCheckError, RefNotFoundError, RepositoryError, TransactionError };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ObjectType, SHA1 } from "./types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/core/hash-digest.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* 计算原始数据的 SHA-1 哈希
|
|
6
|
+
*
|
|
7
|
+
* @param data - 原始数据
|
|
8
|
+
* @returns SHA-1 哈希
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* const hash = hashData("hello");
|
|
13
|
+
* console.log(hash);
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
declare function hashData(data: Buffer | string): SHA1;
|
|
17
|
+
/**
|
|
18
|
+
* 计算 Git 对象的 SHA-1 哈希
|
|
19
|
+
*
|
|
20
|
+
* Git 对象的哈希格式: "<type> <size>\0<content>"
|
|
21
|
+
* 这是 Git 寻址的核心,相同内容总是产生相同的哈希。
|
|
22
|
+
*
|
|
23
|
+
* @param type - 对象类型
|
|
24
|
+
* @param content - 对象内容
|
|
25
|
+
* @returns 对象哈希
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```ts
|
|
29
|
+
* const hash = hashObject("blob", Buffer.from("hello world"));
|
|
30
|
+
* console.log(hash);
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
declare function hashObject(type: ObjectType, content: Buffer): SHA1;
|
|
34
|
+
//#endregion
|
|
35
|
+
export { hashData, hashObject };
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { sha1 } from "./types.mjs";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
//#region src/core/hash-digest.ts
|
|
4
|
+
/**
|
|
5
|
+
* SHA-1 摘要计算
|
|
6
|
+
*
|
|
7
|
+
* 提供原始数据与 Git 对象格式的哈希计算能力。
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* 计算原始数据的 SHA-1 哈希
|
|
11
|
+
*
|
|
12
|
+
* @param data - 原始数据
|
|
13
|
+
* @returns SHA-1 哈希
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* const hash = hashData("hello");
|
|
18
|
+
* console.log(hash);
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
function hashData(data) {
|
|
22
|
+
const hash = createHash("sha1");
|
|
23
|
+
hash.update(data);
|
|
24
|
+
return sha1(hash.digest("hex"));
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 计算 Git 对象的 SHA-1 哈希
|
|
28
|
+
*
|
|
29
|
+
* Git 对象的哈希格式: "<type> <size>\0<content>"
|
|
30
|
+
* 这是 Git 寻址的核心,相同内容总是产生相同的哈希。
|
|
31
|
+
*
|
|
32
|
+
* @param type - 对象类型
|
|
33
|
+
* @param content - 对象内容
|
|
34
|
+
* @returns 对象哈希
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```ts
|
|
38
|
+
* const hash = hashObject("blob", Buffer.from("hello world"));
|
|
39
|
+
* console.log(hash);
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
function hashObject(type, content) {
|
|
43
|
+
const header = `${type} ${content.length}\0`;
|
|
44
|
+
const hash = createHash("sha1");
|
|
45
|
+
hash.update(header);
|
|
46
|
+
hash.update(content);
|
|
47
|
+
return sha1(hash.digest("hex"));
|
|
48
|
+
}
|
|
49
|
+
//#endregion
|
|
50
|
+
export { hashData, hashObject };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { SHA1 } from "./types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/core/hash-file.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* 计算文件的 SHA-1 哈希(作为 blob 对象)
|
|
6
|
+
*
|
|
7
|
+
* 等价于 `git hash-object <file>`。
|
|
8
|
+
*
|
|
9
|
+
* @param filePath - 文件路径
|
|
10
|
+
* @returns blob 哈希
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* const hash = hashFile("/tmp/demo.txt");
|
|
15
|
+
* console.log(hash);
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
declare function hashFile(filePath: string): SHA1;
|
|
19
|
+
//#endregion
|
|
20
|
+
export { hashFile };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { hashObject } from "./hash-digest.mjs";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
//#region src/core/hash-file.ts
|
|
4
|
+
/**
|
|
5
|
+
* 文件哈希入口
|
|
6
|
+
*
|
|
7
|
+
* 提供以 blob 语义计算文件哈希的辅助函数。
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* 计算文件的 SHA-1 哈希(作为 blob 对象)
|
|
11
|
+
*
|
|
12
|
+
* 等价于 `git hash-object <file>`。
|
|
13
|
+
*
|
|
14
|
+
* @param filePath - 文件路径
|
|
15
|
+
* @returns blob 哈希
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* const hash = hashFile("/tmp/demo.txt");
|
|
20
|
+
* console.log(hash);
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
function hashFile(filePath) {
|
|
24
|
+
return hashObject("blob", readFileSync(filePath));
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
27
|
+
export { hashFile };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { SHA1 } from "./types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/core/hash-path.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* 验证一个字符串是否是有效的 SHA-1 哈希
|
|
6
|
+
*
|
|
7
|
+
* @param value - 待校验字符串
|
|
8
|
+
* @returns 是否为合法 SHA-1
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* console.log(isValidSHA1("95d09f2b10159347eece71399a7e2e907ea3df4f"));
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
declare function isValidSHA1(value: string): value is SHA1;
|
|
16
|
+
//#endregion
|
|
17
|
+
export { isValidSHA1 };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
//#region src/core/hash-path.ts
|
|
2
|
+
/**
|
|
3
|
+
* 将 SHA-1 哈希转换为对象存储路径
|
|
4
|
+
*
|
|
5
|
+
* Git 将对象存储在 `.git/objects/` 目录下,
|
|
6
|
+
* 前 2 个字符作为目录名,剩余 38 个字符作为文件名。
|
|
7
|
+
*
|
|
8
|
+
* @param hash - 对象哈希
|
|
9
|
+
* @returns 相对对象路径
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* const path = hashToPath(sha1("95d09f2b10159347eece71399a7e2e907ea3df4f"));
|
|
14
|
+
* console.log(path);
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
function hashToPath(hash) {
|
|
18
|
+
return `${hash.slice(0, 2)}/${hash.slice(2)}`;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 验证一个字符串是否是有效的 SHA-1 哈希
|
|
22
|
+
*
|
|
23
|
+
* @param value - 待校验字符串
|
|
24
|
+
* @returns 是否为合法 SHA-1
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* console.log(isValidSHA1("95d09f2b10159347eece71399a7e2e907ea3df4f"));
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
function isValidSHA1(value) {
|
|
32
|
+
return /^[0-9a-f]{40}$/.test(value);
|
|
33
|
+
}
|
|
34
|
+
//#endregion
|
|
35
|
+
export { hashToPath, isValidSHA1 };
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { RawGitObject, SHA1 } from "../types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/core/types/odb.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* 只读对象源接口
|
|
6
|
+
*
|
|
7
|
+
* 提供 Git 原生原始对象的读取能力。
|
|
8
|
+
*/
|
|
9
|
+
interface ObjectSource {
|
|
10
|
+
/**
|
|
11
|
+
* 读取原始对象
|
|
12
|
+
*
|
|
13
|
+
* @throws 如果对象不存在
|
|
14
|
+
*/
|
|
15
|
+
read(hash: SHA1): RawGitObject;
|
|
16
|
+
/**
|
|
17
|
+
* 尝试读取原始对象,不存在时返回 undefined
|
|
18
|
+
*
|
|
19
|
+
* 相比 `read()` + `catch` 或 `exists()` + `read()` 模式,
|
|
20
|
+
* `tryRead` 避免了双重查找开销(N+1 问题)。
|
|
21
|
+
* 默认实现通过 `read()` + catch 回退,各后端可提供优化版本。
|
|
22
|
+
*/
|
|
23
|
+
tryRead(hash: SHA1): RawGitObject | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* 检查对象是否存在
|
|
26
|
+
*/
|
|
27
|
+
exists(hash: SHA1): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* 列出当前对象源中的所有对象哈希
|
|
30
|
+
*/
|
|
31
|
+
list(): SHA1[];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 对象数据库接口
|
|
35
|
+
*
|
|
36
|
+
* 在 ObjectSource 的基础上增加摄入和删除能力。
|
|
37
|
+
* 摄入 = 直接写入 canonical raw object,不做语义序列化。
|
|
38
|
+
*/
|
|
39
|
+
interface ObjectDatabase extends ObjectSource {
|
|
40
|
+
/**
|
|
41
|
+
* 摄入一个原始对象
|
|
42
|
+
*
|
|
43
|
+
* 直接按 canonical raw object 写入存储,不做语义序列化。
|
|
44
|
+
* 如果对象已存在则幂等跳过。
|
|
45
|
+
*/
|
|
46
|
+
ingest(raw: RawGitObject): void;
|
|
47
|
+
/**
|
|
48
|
+
* 批量摄入原始对象
|
|
49
|
+
*
|
|
50
|
+
* 默认实现逐条调用 ingest(),各后端可提供批量优化版本。
|
|
51
|
+
*/
|
|
52
|
+
ingestMany(objects: Iterable<RawGitObject>): void;
|
|
53
|
+
/**
|
|
54
|
+
* 删除指定对象
|
|
55
|
+
*
|
|
56
|
+
* 删除不存在的对象应静默成功(no-op)。
|
|
57
|
+
*
|
|
58
|
+
* @param hash - 要删除的对象哈希
|
|
59
|
+
*/
|
|
60
|
+
delete(hash: SHA1): void;
|
|
61
|
+
}
|
|
62
|
+
//#endregion
|
|
63
|
+
export { ObjectDatabase, ObjectSource };
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
//#region src/core/types/refs.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Refs 存储接口
|
|
4
|
+
*
|
|
5
|
+
* 提供 Git 引用的原始读写能力。
|
|
6
|
+
*/
|
|
7
|
+
interface RefStore {
|
|
8
|
+
/**
|
|
9
|
+
* 读取引用原始内容
|
|
10
|
+
*
|
|
11
|
+
* 返回去掉末尾换行后的引用内容,
|
|
12
|
+
* 可能包含 "ref: refs/heads/main" 这样的符号引用,
|
|
13
|
+
* 也可能直接是 SHA-1 哈希值。
|
|
14
|
+
*
|
|
15
|
+
* @param ref - 完整引用路径,如 "refs/heads/main"
|
|
16
|
+
* @returns 引用内容,不存在时返回 null
|
|
17
|
+
*/
|
|
18
|
+
read(ref: string): string | null;
|
|
19
|
+
/**
|
|
20
|
+
* 写入引用
|
|
21
|
+
*
|
|
22
|
+
* @param ref - 完整引用路径
|
|
23
|
+
* @param content - 引用内容(末尾换行会被自动规范化)
|
|
24
|
+
*/
|
|
25
|
+
write(ref: string, content: string): void;
|
|
26
|
+
/**
|
|
27
|
+
* 删除引用
|
|
28
|
+
*
|
|
29
|
+
* @param ref - 完整引用路径
|
|
30
|
+
* @throws 如果引用不存在
|
|
31
|
+
*/
|
|
32
|
+
delete(ref: string): void;
|
|
33
|
+
/**
|
|
34
|
+
* 列出指定前缀下的所有引用
|
|
35
|
+
*
|
|
36
|
+
* @param prefix - 引用前缀,如 "refs/heads/"
|
|
37
|
+
* @returns 完整的引用路径列表(已排序)
|
|
38
|
+
*/
|
|
39
|
+
list(prefix: string): string[];
|
|
40
|
+
/**
|
|
41
|
+
* 列出所有引用(不限命名空间)
|
|
42
|
+
*
|
|
43
|
+
* 返回 refs/ 下的所有引用完整路径。
|
|
44
|
+
* 此方法不做前缀校验,适用于需要扫描全部 refs 的场景。
|
|
45
|
+
*
|
|
46
|
+
* @returns 所有引用的完整路径列表(已排序)
|
|
47
|
+
*/
|
|
48
|
+
listAll(): string[];
|
|
49
|
+
/**
|
|
50
|
+
* 开启一个新的事务
|
|
51
|
+
*
|
|
52
|
+
* 事务中所有变更独立于事务外操作。
|
|
53
|
+
* 未提交的事务在调用 rollback() 或 GC 时丢弃。
|
|
54
|
+
*
|
|
55
|
+
* @param hooks - 可选的事务生命周期钩子
|
|
56
|
+
*/
|
|
57
|
+
beginTransaction(hooks?: RefTransactionHook[]): RefTransaction;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Reference Transaction
|
|
61
|
+
*
|
|
62
|
+
* 提供批量 ref 更新的原子性语义。
|
|
63
|
+
* 所有变更暂存于内部缓冲区,commit() 时一次性应用。
|
|
64
|
+
*/
|
|
65
|
+
interface RefTransaction {
|
|
66
|
+
/** 当前事务中暂存的变更数(write + delete) */
|
|
67
|
+
readonly pendingCount: number;
|
|
68
|
+
/**
|
|
69
|
+
* 暂存写入操作
|
|
70
|
+
*
|
|
71
|
+
* 不会立即写入存储,只记录 pending 变更。
|
|
72
|
+
* 事务内对同一 ref 多次 write 以最后一次为准。
|
|
73
|
+
*/
|
|
74
|
+
write(ref: string, content: string): void;
|
|
75
|
+
/**
|
|
76
|
+
* 暂存删除操作
|
|
77
|
+
*
|
|
78
|
+
* 不会立即删除,只记录 pending 变更。
|
|
79
|
+
* write + delete 同一 ref 以最后一次操作为准。
|
|
80
|
+
*/
|
|
81
|
+
delete(ref: string): void;
|
|
82
|
+
/**
|
|
83
|
+
* 提交事务,原子性应用所有变更
|
|
84
|
+
*
|
|
85
|
+
* 提交顺序:先 apply 所有 write,再 apply 所有 delete。
|
|
86
|
+
* 失败时整体回滚,不留下部分变更。
|
|
87
|
+
*
|
|
88
|
+
* @throws 如果任意写入失败,事务自动回滚并抛出异常
|
|
89
|
+
*/
|
|
90
|
+
commit(): void;
|
|
91
|
+
/**
|
|
92
|
+
* 回滚事务,丢弃所有 pending 变更
|
|
93
|
+
*
|
|
94
|
+
* 恢复至 beginTransaction() 时的状态。
|
|
95
|
+
* 多次调用或 commit 后调用无副作用。
|
|
96
|
+
*/
|
|
97
|
+
rollback(): void;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* 事务的只读快照,用于 Hook 回调
|
|
101
|
+
*/
|
|
102
|
+
interface ReadonlyRefTransaction {
|
|
103
|
+
readonly pendingCount: number;
|
|
104
|
+
readonly writes: ReadonlyArray<{
|
|
105
|
+
readonly ref: string;
|
|
106
|
+
readonly content: string;
|
|
107
|
+
}>;
|
|
108
|
+
readonly deletes: ReadonlyArray<{
|
|
109
|
+
readonly ref: string;
|
|
110
|
+
}>;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Reference Transaction Hook
|
|
114
|
+
*
|
|
115
|
+
* 类似 Git reference-transaction hook,
|
|
116
|
+
* 在事务生命周期三个阶段触发回调。
|
|
117
|
+
*/
|
|
118
|
+
interface RefTransactionHook {
|
|
119
|
+
/**
|
|
120
|
+
* 提交前准备阶段
|
|
121
|
+
*
|
|
122
|
+
* commit() 进行实际写入前调用。
|
|
123
|
+
* 抛异常可中止本次提交,事务自动回滚。
|
|
124
|
+
*/
|
|
125
|
+
onPrepare?(tx: ReadonlyRefTransaction): void;
|
|
126
|
+
/**
|
|
127
|
+
* 提交成功
|
|
128
|
+
*
|
|
129
|
+
* 所有变更已持久化后调用。
|
|
130
|
+
*/
|
|
131
|
+
onCommitted?(tx: ReadonlyRefTransaction): void;
|
|
132
|
+
/**
|
|
133
|
+
* 提交中止
|
|
134
|
+
*
|
|
135
|
+
* 事务被回滚后调用(含显式 rollback() 和 commit() 内失败自动回滚)。
|
|
136
|
+
*/
|
|
137
|
+
onAborted?(tx: ReadonlyRefTransaction): void;
|
|
138
|
+
}
|
|
139
|
+
//#endregion
|
|
140
|
+
export { RefStore, RefTransactionHook };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region src/core/types/refs.ts
|
|
2
|
+
/**
|
|
3
|
+
* Refs 存储接口定义
|
|
4
|
+
*
|
|
5
|
+
* 提供 Git 引用(refs)的持久化存储能力。
|
|
6
|
+
* 所有存储实现(文件系统、内存等)都遵循此接口。
|
|
7
|
+
*
|
|
8
|
+
* 此接口只做原始读写,不包含符号引用解析逻辑(解析逻辑在 utils.ts 中)。
|
|
9
|
+
*
|
|
10
|
+
* 扩展点:添加新存储后端时,只需实现此接口即可无缝集成。
|
|
11
|
+
*/
|
|
12
|
+
/** HEAD 引用名称 */
|
|
13
|
+
const HEAD_REF = "HEAD";
|
|
14
|
+
/** 分支引用前缀 */
|
|
15
|
+
const HEADS_PREFIX = "refs/heads/";
|
|
16
|
+
/** 标签引用前缀 */
|
|
17
|
+
const TAGS_PREFIX = "refs/tags/";
|
|
18
|
+
//#endregion
|
|
19
|
+
export { HEADS_PREFIX, HEAD_REF, TAGS_PREFIX };
|