neozipkit 1.0.2 → 1.5.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/NEOZIP_APPNOTE.md +625 -0
- package/README.md +44 -11
- package/WHATS_NEW.md +153 -10
- package/dist/browser/ZipkitBrowser.d.ts.map +1 -1
- package/dist/browser/ZipkitBrowser.js +4 -6
- package/dist/browser/ZipkitBrowser.js.map +1 -1
- package/dist/browser/zstd-browser-shim.d.ts +17 -9
- package/dist/browser/zstd-browser-shim.d.ts.map +1 -1
- package/dist/browser/zstd-browser-shim.js +99 -21
- package/dist/browser/zstd-browser-shim.js.map +1 -1
- package/dist/browser-esm/index.js +6534 -1275
- package/dist/browser-esm/index.js.map +4 -4
- package/dist/browser-umd/index.js +6534 -1275
- package/dist/browser-umd/index.js.map +4 -4
- package/dist/browser-umd/index.min.js +6 -3
- package/dist/core/ZipCompress.d.ts +6 -0
- package/dist/core/ZipCompress.d.ts.map +1 -1
- package/dist/core/ZipCompress.js +12 -11
- package/dist/core/ZipCompress.js.map +1 -1
- package/dist/core/ZipCopy.d.ts.map +1 -1
- package/dist/core/ZipCopy.js +33 -25
- package/dist/core/ZipCopy.js.map +1 -1
- package/dist/core/ZipDecompress.d.ts.map +1 -1
- package/dist/core/ZipDecompress.js +13 -8
- package/dist/core/ZipDecompress.js.map +1 -1
- package/dist/core/ZipEntry.d.ts +24 -0
- package/dist/core/ZipEntry.d.ts.map +1 -1
- package/dist/core/ZipEntry.js +146 -14
- package/dist/core/ZipEntry.js.map +1 -1
- package/dist/core/Zipkit.d.ts +43 -11
- package/dist/core/Zipkit.d.ts.map +1 -1
- package/dist/core/Zipkit.js +132 -82
- package/dist/core/Zipkit.js.map +1 -1
- package/dist/core/components/HashCalculator.d.ts +22 -1
- package/dist/core/components/HashCalculator.d.ts.map +1 -1
- package/dist/core/components/HashCalculator.js +49 -6
- package/dist/core/components/HashCalculator.js.map +1 -1
- package/dist/core/components/Util.d.ts +3 -4
- package/dist/core/components/Util.d.ts.map +1 -1
- package/dist/core/components/Util.js +10 -8
- package/dist/core/components/Util.js.map +1 -1
- package/dist/core/constants/Headers.d.ts +2 -3
- package/dist/core/constants/Headers.d.ts.map +1 -1
- package/dist/core/constants/Headers.js +15 -5
- package/dist/core/constants/Headers.js.map +1 -1
- package/dist/core/constants/MetaPaths.d.ts +38 -0
- package/dist/core/constants/MetaPaths.d.ts.map +1 -0
- package/dist/core/constants/MetaPaths.js +79 -0
- package/dist/core/constants/MetaPaths.js.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +18 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/inflateZipPayload.d.ts +6 -0
- package/dist/core/inflateZipPayload.d.ts.map +1 -0
- package/dist/core/inflateZipPayload.js +28 -0
- package/dist/core/inflateZipPayload.js.map +1 -0
- package/dist/core/merkle/MerkleRoot.d.ts +109 -0
- package/dist/core/merkle/MerkleRoot.d.ts.map +1 -0
- package/dist/core/merkle/MerkleRoot.js +275 -0
- package/dist/core/merkle/MerkleRoot.js.map +1 -0
- package/dist/core/origin/OriginExtra.d.ts +43 -0
- package/dist/core/origin/OriginExtra.d.ts.map +1 -0
- package/dist/core/origin/OriginExtra.js +187 -0
- package/dist/core/origin/OriginExtra.js.map +1 -0
- package/dist/core/version.js +1 -1
- package/dist/core/zip64/Zip64.d.ts +138 -0
- package/dist/core/zip64/Zip64.d.ts.map +1 -0
- package/dist/core/zip64/Zip64.js +353 -0
- package/dist/core/zip64/Zip64.js.map +1 -0
- package/dist/node/ZipCompressNode.d.ts.map +1 -1
- package/dist/node/ZipCompressNode.js +40 -49
- package/dist/node/ZipCompressNode.js.map +1 -1
- package/dist/node/ZipCopyNode.d.ts.map +1 -1
- package/dist/node/ZipCopyNode.js +26 -26
- package/dist/node/ZipCopyNode.js.map +1 -1
- package/dist/node/ZipDecompressNode.d.ts.map +1 -1
- package/dist/node/ZipDecompressNode.js +21 -3
- package/dist/node/ZipDecompressNode.js.map +1 -1
- package/dist/node/ZipkitNode.d.ts +23 -1
- package/dist/node/ZipkitNode.d.ts.map +1 -1
- package/dist/node/ZipkitNode.js +158 -57
- package/dist/node/ZipkitNode.js.map +1 -1
- package/dist/node/ZstdNode.d.ts +14 -4
- package/dist/node/ZstdNode.d.ts.map +1 -1
- package/dist/node/ZstdNode.js +28 -4
- package/dist/node/ZstdNode.js.map +1 -1
- package/dist/node/buildZipBuffer.d.ts +49 -0
- package/dist/node/buildZipBuffer.d.ts.map +1 -0
- package/dist/node/buildZipBuffer.js +146 -0
- package/dist/node/buildZipBuffer.js.map +1 -0
- package/dist/node/index.d.ts +3 -0
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +6 -1
- package/dist/node/index.js.map +1 -1
- package/dist/node/inflateZipPayload.d.ts +5 -0
- package/dist/node/inflateZipPayload.d.ts.map +1 -0
- package/dist/node/inflateZipPayload.js +21 -0
- package/dist/node/inflateZipPayload.js.map +1 -0
- package/dist/types/index.js +2 -2
- package/node-esm.mjs +32 -0
- package/package.json +13 -6
- package/src/browser/ZipkitBrowser.ts +4 -6
- package/src/browser/zstd-browser-shim.ts +110 -28
- package/src/core/ZipCompress.ts +20 -13
- package/src/core/ZipCopy.ts +56 -27
- package/src/core/ZipDecompress.ts +14 -8
- package/src/core/ZipEntry.ts +200 -14
- package/src/core/Zipkit.ts +189 -98
- package/src/core/components/HashCalculator.ts +58 -6
- package/src/core/components/Util.ts +16 -7
- package/src/core/constants/Headers.ts +15 -4
- package/src/core/constants/MetaPaths.ts +86 -0
- package/src/core/index.ts +17 -0
- package/src/core/inflateZipPayload.ts +27 -0
- package/src/core/merkle/MerkleRoot.ts +312 -0
- package/src/core/origin/OriginExtra.ts +209 -0
- package/src/core/version.ts +1 -1
- package/src/core/zip64/Zip64.ts +473 -0
- package/src/node/ZipCompressNode.ts +40 -49
- package/src/node/ZipCopyNode.ts +31 -29
- package/src/node/ZipDecompressNode.ts +16 -3
- package/src/node/ZipkitNode.ts +203 -72
- package/src/node/ZstdNode.ts +33 -8
- package/src/node/buildZipBuffer.ts +221 -0
- package/src/node/index.ts +7 -0
- package/src/node/inflateZipPayload.ts +19 -0
- package/src/types/index.ts +2 -2
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ======================================
|
|
3
|
+
// MerkleRoot.ts — NeoZip APPNOTE §6
|
|
4
|
+
// v0 (legacy Bitcoin-style) and v1 (RFC 6962–style domain separation)
|
|
5
|
+
// ======================================
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.normalizeMerklePath = normalizeMerklePath;
|
|
41
|
+
exports.contentDigest = contentDigest;
|
|
42
|
+
exports.leafHashV0 = leafHashV0;
|
|
43
|
+
exports.leafHashV1 = leafHashV1;
|
|
44
|
+
exports.parentHash = parentHash;
|
|
45
|
+
exports.merkleRootFromLeaves = merkleRootFromLeaves;
|
|
46
|
+
exports.computeArchiveMerkleRoot = computeArchiveMerkleRoot;
|
|
47
|
+
exports.computeMerkleRootV0FromDigests = computeMerkleRootV0FromDigests;
|
|
48
|
+
exports.computeMerkleRootV1FromContents = computeMerkleRootV1FromContents;
|
|
49
|
+
exports.computeMerkleRootV1FromLeaves = computeMerkleRootV1FromLeaves;
|
|
50
|
+
exports.matchMerkleRoot = matchMerkleRoot;
|
|
51
|
+
const crypto = __importStar(require("crypto"));
|
|
52
|
+
const MetaPaths_1 = require("../constants/MetaPaths");
|
|
53
|
+
const LEAF_DOMAIN = Buffer.from([0x00]);
|
|
54
|
+
const NODE_DOMAIN = Buffer.from([0x01]);
|
|
55
|
+
function sha256(data) {
|
|
56
|
+
const h = crypto.createHash('sha256');
|
|
57
|
+
if (Array.isArray(data)) {
|
|
58
|
+
for (const part of data) {
|
|
59
|
+
h.update(part);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
h.update(data);
|
|
64
|
+
}
|
|
65
|
+
return h.digest();
|
|
66
|
+
}
|
|
67
|
+
function asBuffer(data, encoding) {
|
|
68
|
+
if (typeof data === 'string') {
|
|
69
|
+
return Buffer.from(data, encoding ?? 'hex');
|
|
70
|
+
}
|
|
71
|
+
return Buffer.isBuffer(data) ? data : Buffer.from(data);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Normalize a ZIP entry path for v1 leaf ordering (APPNOTE §6.3):
|
|
75
|
+
* POSIX separators, strip leading `./` and `/`, Unicode NFC, UTF-8 byte order when compared.
|
|
76
|
+
*/
|
|
77
|
+
function normalizeMerklePath(path) {
|
|
78
|
+
let p = path.replace(/\\/g, '/');
|
|
79
|
+
if (p.startsWith('./')) {
|
|
80
|
+
p = p.slice(2);
|
|
81
|
+
}
|
|
82
|
+
while (p.startsWith('/')) {
|
|
83
|
+
p = p.slice(1);
|
|
84
|
+
}
|
|
85
|
+
if (typeof p.normalize === 'function') {
|
|
86
|
+
p = p.normalize('NFC');
|
|
87
|
+
}
|
|
88
|
+
return p;
|
|
89
|
+
}
|
|
90
|
+
/** Sort key for path comparison (UTF-8 byte order). */
|
|
91
|
+
function pathSortKey(path, algorithm) {
|
|
92
|
+
const normalized = algorithm === 'v1' ? normalizeMerklePath(path) : path;
|
|
93
|
+
return Buffer.from(normalized, 'utf8');
|
|
94
|
+
}
|
|
95
|
+
/** Bare content digest (= 0x014E value). */
|
|
96
|
+
function contentDigest(content) {
|
|
97
|
+
return sha256(asBuffer(content));
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* v0 leaf: SHA-256(uncompressed bytes) — same as Extra Field 0x014E.
|
|
101
|
+
*/
|
|
102
|
+
function leafHashV0(contentOrDigest, isDigest = false) {
|
|
103
|
+
const buf = asBuffer(contentOrDigest);
|
|
104
|
+
return isDigest ? buf : sha256(buf);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* v1 leaf: SHA-256(0x00 ‖ uncompressed_bytes).
|
|
108
|
+
* Must not be confused with the bare 0x014E digest (APPNOTE §6.3).
|
|
109
|
+
*/
|
|
110
|
+
function leafHashV1(content) {
|
|
111
|
+
return sha256([LEAF_DOMAIN, asBuffer(content)]);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Parent node hashes.
|
|
115
|
+
* v0: SHA-256(H_left ‖ H_right) — order preserved, no pair sorting.
|
|
116
|
+
* v1: SHA-256(0x01 ‖ H_left ‖ H_right).
|
|
117
|
+
*/
|
|
118
|
+
function parentHash(left, right, algorithm) {
|
|
119
|
+
if (algorithm === 'v1') {
|
|
120
|
+
return sha256([NODE_DOMAIN, left, right]);
|
|
121
|
+
}
|
|
122
|
+
return sha256([left, right]);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Fold an ordered list of leaf hashes into a single root (hex lowercase).
|
|
126
|
+
* Odd-count rule:
|
|
127
|
+
* - v0: duplicate last leaf (Bitcoin-style)
|
|
128
|
+
* - v1: promote last node unhashed (RFC 6962–style)
|
|
129
|
+
*/
|
|
130
|
+
function merkleRootFromLeaves(leaves, algorithm) {
|
|
131
|
+
if (leaves.length === 0) {
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
let level = leaves.map((l) => Buffer.from(l));
|
|
135
|
+
while (level.length > 1) {
|
|
136
|
+
const next = [];
|
|
137
|
+
for (let i = 0; i + 1 < level.length; i += 2) {
|
|
138
|
+
next.push(parentHash(level[i], level[i + 1], algorithm));
|
|
139
|
+
}
|
|
140
|
+
if (level.length % 2 === 1) {
|
|
141
|
+
const last = level[level.length - 1];
|
|
142
|
+
if (algorithm === 'v0') {
|
|
143
|
+
// Duplicate last leaf, then hash the pair
|
|
144
|
+
next.push(parentHash(last, last, algorithm));
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
// Promote unhashed
|
|
148
|
+
next.push(last);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
level = next;
|
|
152
|
+
}
|
|
153
|
+
return level[0].toString('hex');
|
|
154
|
+
}
|
|
155
|
+
function resolveLeaf(entry, algorithm) {
|
|
156
|
+
if (algorithm === 'v0') {
|
|
157
|
+
if (entry.contentSha256) {
|
|
158
|
+
const d = asBuffer(entry.contentSha256, typeof entry.contentSha256 === 'string' ? 'hex' : undefined);
|
|
159
|
+
if (d.length !== 32) {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
return d;
|
|
163
|
+
}
|
|
164
|
+
if (entry.content) {
|
|
165
|
+
return contentDigest(entry.content);
|
|
166
|
+
}
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
// v1: prefer precomputed domain-separated leaf from the same hashing pass as 0x014E
|
|
170
|
+
if (entry.merkleLeafV1) {
|
|
171
|
+
const d = asBuffer(entry.merkleLeafV1, typeof entry.merkleLeafV1 === 'string' ? 'hex' : undefined);
|
|
172
|
+
if (d.length !== 32) {
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
return d;
|
|
176
|
+
}
|
|
177
|
+
// Domain-separated hash of uncompressed payload (re-hash only if leaf not available)
|
|
178
|
+
if (entry.content) {
|
|
179
|
+
return leafHashV1(entry.content);
|
|
180
|
+
}
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Compute archive Merkle root per APPNOTE §6 from content entries
|
|
185
|
+
* (caller already excluded META-INF/** if desired).
|
|
186
|
+
*
|
|
187
|
+
* @returns lowercase hex root, or null if no usable leaves
|
|
188
|
+
*/
|
|
189
|
+
function computeArchiveMerkleRoot(entries, algorithm = 'v1') {
|
|
190
|
+
const prepared = [];
|
|
191
|
+
for (const entry of entries) {
|
|
192
|
+
if ((0, MetaPaths_1.isMetaInfPath)(entry.path || '')) {
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
const leaf = resolveLeaf(entry, algorithm);
|
|
196
|
+
if (!leaf) {
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
prepared.push({
|
|
200
|
+
key: pathSortKey(entry.path || '', algorithm),
|
|
201
|
+
leaf,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
if (prepared.length === 0) {
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
prepared.sort((a, b) => Buffer.compare(a.key, b.key));
|
|
208
|
+
return merkleRootFromLeaves(prepared.map((p) => p.leaf), algorithm);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Build v0 root from path + bare content digests only (0x014E extras).
|
|
212
|
+
* Path order: central-directory bytes as stored (no NFC / strip).
|
|
213
|
+
*/
|
|
214
|
+
function computeMerkleRootV0FromDigests(entries) {
|
|
215
|
+
return computeArchiveMerkleRoot(entries.map((e) => ({ path: e.path, contentSha256: e.sha256 })), 'v0');
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Build v1 root from path + uncompressed payloads (APPNOTE §6.3).
|
|
219
|
+
* Paths are normalized before sorting.
|
|
220
|
+
*/
|
|
221
|
+
function computeMerkleRootV1FromContents(entries) {
|
|
222
|
+
return computeArchiveMerkleRoot(entries.map((e) => ({ path: e.path, content: e.content })), 'v1');
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Build v1 root from path + precomputed domain-separated leaves (APPNOTE §6.3).
|
|
226
|
+
* Prefer this after create/extract when HashCalculator produced merkleLeafV1 in one stream pass.
|
|
227
|
+
*/
|
|
228
|
+
function computeMerkleRootV1FromLeaves(entries) {
|
|
229
|
+
return computeArchiveMerkleRoot(entries.map((e) => ({ path: e.path, merkleLeafV1: e.merkleLeafV1 })), 'v1');
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Verify a declared root (APPNOTE §6.4): try v1 first (when content or leaves available),
|
|
233
|
+
* then v0 digests. Returns which algorithm matched, or null on failure.
|
|
234
|
+
*
|
|
235
|
+
* When only bare 0x014E digests are available, only v0 can match APPNOTE correctly.
|
|
236
|
+
* Pass `merkleLeafV1` or content for full v1 verification without re-hashing from scratch
|
|
237
|
+
* when leaves were computed in the decompress stream.
|
|
238
|
+
*/
|
|
239
|
+
function matchMerkleRoot(entries, declaredRoot) {
|
|
240
|
+
const expected = declaredRoot.toLowerCase().replace(/^0x/, '');
|
|
241
|
+
if (!/^[0-9a-f]{64}$/.test(expected)) {
|
|
242
|
+
return null;
|
|
243
|
+
}
|
|
244
|
+
const hasV1Material = entries.some((e) => !(0, MetaPaths_1.isMetaInfPath)(e.path || '') &&
|
|
245
|
+
(!!e.merkleLeafV1 || !!e.content));
|
|
246
|
+
if (hasV1Material) {
|
|
247
|
+
const v1 = computeArchiveMerkleRoot(entries, 'v1');
|
|
248
|
+
if (v1 && v1 === expected) {
|
|
249
|
+
return { algorithm: 'v1', security: 'high' };
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
const v0 = computeArchiveMerkleRoot(entries, 'v0');
|
|
253
|
+
if (v0 && v0 === expected) {
|
|
254
|
+
return { algorithm: 'v0', security: 'legacy' };
|
|
255
|
+
}
|
|
256
|
+
// If v1 was not tried (no leaves/content), v0 was the only attempt.
|
|
257
|
+
if (hasV1Material) {
|
|
258
|
+
return null;
|
|
259
|
+
}
|
|
260
|
+
return null;
|
|
261
|
+
}
|
|
262
|
+
exports.default = {
|
|
263
|
+
normalizeMerklePath,
|
|
264
|
+
contentDigest,
|
|
265
|
+
leafHashV0,
|
|
266
|
+
leafHashV1,
|
|
267
|
+
parentHash,
|
|
268
|
+
merkleRootFromLeaves,
|
|
269
|
+
computeArchiveMerkleRoot,
|
|
270
|
+
computeMerkleRootV0FromDigests,
|
|
271
|
+
computeMerkleRootV1FromContents,
|
|
272
|
+
computeMerkleRootV1FromLeaves,
|
|
273
|
+
matchMerkleRoot,
|
|
274
|
+
};
|
|
275
|
+
//# sourceMappingURL=MerkleRoot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MerkleRoot.js","sourceRoot":"","sources":["../../../src/core/merkle/MerkleRoot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** Payload version byte. Stays 0x01 until first release. */
|
|
2
|
+
export declare const ORIGIN_EXTRA_VERSION = 1;
|
|
3
|
+
/** Soft cap on URI byte length (well under uint16 extra size). */
|
|
4
|
+
export declare const ORIGIN_URI_MAX_BYTES = 2048;
|
|
5
|
+
/** Registered v1 TLV tags. Unknown tags are skipped (forward compatible). */
|
|
6
|
+
export declare const ORIGIN_TAG: {
|
|
7
|
+
readonly URI: 1;
|
|
8
|
+
readonly CRC32: 2;
|
|
9
|
+
readonly SIZE: 3;
|
|
10
|
+
readonly MTIME: 4;
|
|
11
|
+
readonly SHA256: 5;
|
|
12
|
+
};
|
|
13
|
+
export type OriginLocator = {
|
|
14
|
+
/** Absolute RFC 3986 URI (`https:` / `http:` / `file:`). */
|
|
15
|
+
uri?: string;
|
|
16
|
+
/** ZIP/IEEE CRC-32 of original uncompressed bytes. */
|
|
17
|
+
crc32?: number;
|
|
18
|
+
/** Original uncompressed byte length. */
|
|
19
|
+
size?: number;
|
|
20
|
+
/** Original modification time: Unix seconds (UTC, signed). */
|
|
21
|
+
mtime?: number;
|
|
22
|
+
/** SHA-256 of original uncompressed bytes (32 bytes or hex). */
|
|
23
|
+
sha256?: Buffer | string;
|
|
24
|
+
};
|
|
25
|
+
export declare function originLocatorPresent(loc: OriginLocator | null | undefined): loc is OriginLocator;
|
|
26
|
+
/** ZIP/IEEE CRC-32 of uncompressed original bytes. */
|
|
27
|
+
export declare function originCrc32Of(buf: Buffer): number;
|
|
28
|
+
/** SHA-256 of uncompressed original bytes (32-byte Buffer). */
|
|
29
|
+
export declare function originSha256Of(buf: Buffer): Buffer;
|
|
30
|
+
/** Truncate a Date to Unix seconds (UTC). */
|
|
31
|
+
export declare function unixTimeSeconds(date: Date): number;
|
|
32
|
+
/**
|
|
33
|
+
* Build Extra Field 0x014F (v1 TLV). Throws if no attribute is present,
|
|
34
|
+
* if URI is empty when provided, or if URI exceeds max bytes.
|
|
35
|
+
*/
|
|
36
|
+
export declare function makeOriginExtra(loc: OriginLocator): Buffer;
|
|
37
|
+
/** Walk a ZIP Extra Field blob for NeoZip 0x014F (v1 TLV). */
|
|
38
|
+
export declare function parseOriginFromExtra(extra: Buffer | null | undefined): OriginLocator | null;
|
|
39
|
+
/** Read origin locator from a ZipEntry's preserved caller extras. */
|
|
40
|
+
export declare function parseOriginFromEntry(entry: {
|
|
41
|
+
additionalExtra?: Buffer | null;
|
|
42
|
+
}): OriginLocator | null;
|
|
43
|
+
//# sourceMappingURL=OriginExtra.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OriginExtra.d.ts","sourceRoot":"","sources":["../../../src/core/origin/OriginExtra.ts"],"names":[],"mappings":"AAWA,4DAA4D;AAC5D,eAAO,MAAM,oBAAoB,IAAO,CAAC;AAEzC,kEAAkE;AAClE,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAEzC,6EAA6E;AAC7E,eAAO,MAAM,UAAU;;;;;;CAMb,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG;IAC1B,4DAA4D;IAC5D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1B,CAAC;AAwBF,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,GACpC,GAAG,IAAI,aAAa,CAStB;AAED,sDAAsD;AACtD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,+DAA+D;AAC/D,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,6CAA6C;AAC7C,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAElD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CA4D1D;AA4BD,8DAA8D;AAC9D,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,aAAa,GAAG,IAAI,CAmB3F;AAED,qEAAqE;AACrE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC,GAAG,aAAa,GAAG,IAAI,CAEvB"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ======================================
|
|
3
|
+
// OriginExtra.ts — NeoZip Extra Field 0x014F (original locator)
|
|
4
|
+
// Copyright (c) 2026 NeoWare, Inc. All rights reserved.
|
|
5
|
+
// ======================================
|
|
6
|
+
// APPNOTE §7.1.1 / ZipWiki §6.7 — v1 TLV (URI, CRC-32, size, mtime, SHA-256).
|
|
7
|
+
// The kit stores opaque caller extras on ZipEntry.additionalExtra; these helpers
|
|
8
|
+
// build and parse the 0x014F wire form.
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.ORIGIN_TAG = exports.ORIGIN_URI_MAX_BYTES = exports.ORIGIN_EXTRA_VERSION = void 0;
|
|
11
|
+
exports.originLocatorPresent = originLocatorPresent;
|
|
12
|
+
exports.originCrc32Of = originCrc32Of;
|
|
13
|
+
exports.originSha256Of = originSha256Of;
|
|
14
|
+
exports.unixTimeSeconds = unixTimeSeconds;
|
|
15
|
+
exports.makeOriginExtra = makeOriginExtra;
|
|
16
|
+
exports.parseOriginFromExtra = parseOriginFromExtra;
|
|
17
|
+
exports.parseOriginFromEntry = parseOriginFromEntry;
|
|
18
|
+
const Headers_1 = require("../constants/Headers");
|
|
19
|
+
const ZipCrypto_1 = require("../encryption/ZipCrypto");
|
|
20
|
+
/** Payload version byte. Stays 0x01 until first release. */
|
|
21
|
+
exports.ORIGIN_EXTRA_VERSION = 0x01;
|
|
22
|
+
/** Soft cap on URI byte length (well under uint16 extra size). */
|
|
23
|
+
exports.ORIGIN_URI_MAX_BYTES = 2048;
|
|
24
|
+
/** Registered v1 TLV tags. Unknown tags are skipped (forward compatible). */
|
|
25
|
+
exports.ORIGIN_TAG = {
|
|
26
|
+
URI: 0x01,
|
|
27
|
+
CRC32: 0x02,
|
|
28
|
+
SIZE: 0x03,
|
|
29
|
+
MTIME: 0x04,
|
|
30
|
+
SHA256: 0x05,
|
|
31
|
+
};
|
|
32
|
+
function originSha256Bytes(value) {
|
|
33
|
+
const buf = typeof value === 'string' ? Buffer.from(value, 'hex') : value;
|
|
34
|
+
if (buf.length !== 32) {
|
|
35
|
+
throw new Error('0x014F sha256 must be 32 bytes');
|
|
36
|
+
}
|
|
37
|
+
return buf;
|
|
38
|
+
}
|
|
39
|
+
function tlv(tag, value) {
|
|
40
|
+
const rec = Buffer.alloc(3 + value.length);
|
|
41
|
+
rec.writeUInt8(tag, 0);
|
|
42
|
+
rec.writeUInt16LE(value.length, 1);
|
|
43
|
+
value.copy(rec, 3);
|
|
44
|
+
return rec;
|
|
45
|
+
}
|
|
46
|
+
function assertInteger(name, value) {
|
|
47
|
+
if (!Number.isFinite(value) || !Number.isInteger(value)) {
|
|
48
|
+
throw new Error(`0x014F ${name} must be an integer`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function originLocatorPresent(loc) {
|
|
52
|
+
if (!loc)
|
|
53
|
+
return false;
|
|
54
|
+
return ((typeof loc.uri === 'string' && loc.uri.length > 0) ||
|
|
55
|
+
loc.crc32 !== undefined ||
|
|
56
|
+
loc.size !== undefined ||
|
|
57
|
+
loc.mtime !== undefined ||
|
|
58
|
+
loc.sha256 !== undefined);
|
|
59
|
+
}
|
|
60
|
+
/** ZIP/IEEE CRC-32 of uncompressed original bytes. */
|
|
61
|
+
function originCrc32Of(buf) {
|
|
62
|
+
return (0, ZipCrypto_1.crc32)(buf) >>> 0;
|
|
63
|
+
}
|
|
64
|
+
/** SHA-256 of uncompressed original bytes (32-byte Buffer). */
|
|
65
|
+
function originSha256Of(buf) {
|
|
66
|
+
return Buffer.from((0, ZipCrypto_1.sha256)(buf), 'hex');
|
|
67
|
+
}
|
|
68
|
+
/** Truncate a Date to Unix seconds (UTC). */
|
|
69
|
+
function unixTimeSeconds(date) {
|
|
70
|
+
return Math.floor(date.getTime() / 1000);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Build Extra Field 0x014F (v1 TLV). Throws if no attribute is present,
|
|
74
|
+
* if URI is empty when provided, or if URI exceeds max bytes.
|
|
75
|
+
*/
|
|
76
|
+
function makeOriginExtra(loc) {
|
|
77
|
+
const records = [];
|
|
78
|
+
const uri = loc.uri?.trim();
|
|
79
|
+
if (uri !== undefined && uri.length === 0) {
|
|
80
|
+
throw new Error('0x014F URI must be non-empty when present');
|
|
81
|
+
}
|
|
82
|
+
if (uri) {
|
|
83
|
+
const uriBuf = Buffer.from(uri, 'utf8');
|
|
84
|
+
if (uriBuf.length > exports.ORIGIN_URI_MAX_BYTES) {
|
|
85
|
+
throw new Error(`0x014F URI exceeds ${exports.ORIGIN_URI_MAX_BYTES} bytes (${uriBuf.length})`);
|
|
86
|
+
}
|
|
87
|
+
records.push(tlv(exports.ORIGIN_TAG.URI, uriBuf));
|
|
88
|
+
}
|
|
89
|
+
if (loc.crc32 !== undefined) {
|
|
90
|
+
assertInteger('crc32', loc.crc32);
|
|
91
|
+
const b = Buffer.alloc(4);
|
|
92
|
+
b.writeUInt32LE(loc.crc32 >>> 0, 0);
|
|
93
|
+
records.push(tlv(exports.ORIGIN_TAG.CRC32, b));
|
|
94
|
+
}
|
|
95
|
+
if (loc.size !== undefined) {
|
|
96
|
+
assertInteger('size', loc.size);
|
|
97
|
+
if (loc.size < 0) {
|
|
98
|
+
throw new Error('0x014F size must be >= 0');
|
|
99
|
+
}
|
|
100
|
+
const b = Buffer.alloc(8);
|
|
101
|
+
b.writeBigUInt64LE(BigInt(loc.size), 0);
|
|
102
|
+
records.push(tlv(exports.ORIGIN_TAG.SIZE, b));
|
|
103
|
+
}
|
|
104
|
+
if (loc.mtime !== undefined) {
|
|
105
|
+
assertInteger('mtime', loc.mtime);
|
|
106
|
+
const b = Buffer.alloc(8);
|
|
107
|
+
b.writeBigInt64LE(BigInt(loc.mtime), 0);
|
|
108
|
+
records.push(tlv(exports.ORIGIN_TAG.MTIME, b));
|
|
109
|
+
}
|
|
110
|
+
if (loc.sha256 !== undefined) {
|
|
111
|
+
records.push(tlv(exports.ORIGIN_TAG.SHA256, originSha256Bytes(loc.sha256)));
|
|
112
|
+
}
|
|
113
|
+
if (records.length === 0) {
|
|
114
|
+
throw new Error('0x014F requires at least one attribute');
|
|
115
|
+
}
|
|
116
|
+
const dataSize = 1 + records.reduce((n, r) => n + r.length, 0);
|
|
117
|
+
const extra = Buffer.alloc(4 + dataSize);
|
|
118
|
+
extra.writeUInt16LE(Headers_1.HDR_ID.ORIGIN, 0);
|
|
119
|
+
extra.writeUInt16LE(dataSize, 2);
|
|
120
|
+
extra.writeUInt8(exports.ORIGIN_EXTRA_VERSION, 4);
|
|
121
|
+
let off = 5;
|
|
122
|
+
for (const rec of records) {
|
|
123
|
+
rec.copy(extra, off);
|
|
124
|
+
off += rec.length;
|
|
125
|
+
}
|
|
126
|
+
return extra;
|
|
127
|
+
}
|
|
128
|
+
function parseOriginTlv(data) {
|
|
129
|
+
const loc = {};
|
|
130
|
+
let i = 0;
|
|
131
|
+
while (i + 3 <= data.length) {
|
|
132
|
+
const tag = data.readUInt8(i);
|
|
133
|
+
const len = data.readUInt16LE(i + 1);
|
|
134
|
+
i += 3;
|
|
135
|
+
if (i + len > data.length)
|
|
136
|
+
break;
|
|
137
|
+
const value = data.subarray(i, i + len);
|
|
138
|
+
i += len;
|
|
139
|
+
if (tag === exports.ORIGIN_TAG.URI && len > 0) {
|
|
140
|
+
const u = value.toString('utf8');
|
|
141
|
+
if (u.length > 0)
|
|
142
|
+
loc.uri = u;
|
|
143
|
+
}
|
|
144
|
+
else if (tag === exports.ORIGIN_TAG.CRC32 && len === 4) {
|
|
145
|
+
loc.crc32 = value.readUInt32LE(0) >>> 0;
|
|
146
|
+
}
|
|
147
|
+
else if (tag === exports.ORIGIN_TAG.SIZE && len === 8) {
|
|
148
|
+
loc.size = Number(value.readBigUInt64LE(0));
|
|
149
|
+
}
|
|
150
|
+
else if (tag === exports.ORIGIN_TAG.MTIME && len === 8) {
|
|
151
|
+
loc.mtime = Number(value.readBigInt64LE(0));
|
|
152
|
+
}
|
|
153
|
+
else if (tag === exports.ORIGIN_TAG.SHA256 && len === 32) {
|
|
154
|
+
loc.sha256 = Buffer.from(value);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return originLocatorPresent(loc) ? loc : null;
|
|
158
|
+
}
|
|
159
|
+
/** Walk a ZIP Extra Field blob for NeoZip 0x014F (v1 TLV). */
|
|
160
|
+
function parseOriginFromExtra(extra) {
|
|
161
|
+
if (!extra || extra.length < 4)
|
|
162
|
+
return null;
|
|
163
|
+
let i = 0;
|
|
164
|
+
while (i + 4 <= extra.length) {
|
|
165
|
+
const id = extra.readUInt16LE(i);
|
|
166
|
+
const size = extra.readUInt16LE(i + 2);
|
|
167
|
+
i += 4;
|
|
168
|
+
if (i + size > extra.length)
|
|
169
|
+
break;
|
|
170
|
+
if (id === Headers_1.HDR_ID.ORIGIN && size >= 1) {
|
|
171
|
+
const version = extra.readUInt8(i);
|
|
172
|
+
const payload = extra.subarray(i + 1, i + size);
|
|
173
|
+
if (version === exports.ORIGIN_EXTRA_VERSION) {
|
|
174
|
+
const loc = parseOriginTlv(payload);
|
|
175
|
+
if (loc)
|
|
176
|
+
return loc;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
i += size;
|
|
180
|
+
}
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
/** Read origin locator from a ZipEntry's preserved caller extras. */
|
|
184
|
+
function parseOriginFromEntry(entry) {
|
|
185
|
+
return parseOriginFromExtra(entry.additionalExtra ?? null);
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=OriginExtra.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OriginExtra.js","sourceRoot":"","sources":["../../../src/core/origin/OriginExtra.ts"],"names":[],"mappings":";AAAA,yCAAyC;AACzC,gEAAgE;AAChE,yDAAyD;AACzD,yCAAyC;AACzC,8EAA8E;AAC9E,iFAAiF;AACjF,wCAAwC;;;AAuDxC,oDAWC;AAGD,sCAEC;AAGD,wCAEC;AAGD,0CAEC;AAMD,0CA4DC;AA6BD,oDAmBC;AAGD,oDAIC;AAxMD,kDAA8C;AAC9C,uDAAwD;AAExD,4DAA4D;AAC/C,QAAA,oBAAoB,GAAG,IAAI,CAAC;AAEzC,kEAAkE;AACrD,QAAA,oBAAoB,GAAG,IAAI,CAAC;AAEzC,6EAA6E;AAChE,QAAA,UAAU,GAAG;IACxB,GAAG,EAAE,IAAI;IACT,KAAK,EAAE,IAAI;IACX,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;CACJ,CAAC;AAeX,SAAS,iBAAiB,CAAC,KAAsB;IAC/C,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC1E,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,GAAG,CAAC,GAAW,EAAE,KAAa;IACrC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3C,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACvB,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACnC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACnB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,KAAa;IAChD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,qBAAqB,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,SAAgB,oBAAoB,CAClC,GAAqC;IAErC,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,OAAO,CACL,CAAC,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;QACnD,GAAG,CAAC,KAAK,KAAK,SAAS;QACvB,GAAG,CAAC,IAAI,KAAK,SAAS;QACtB,GAAG,CAAC,KAAK,KAAK,SAAS;QACvB,GAAG,CAAC,MAAM,KAAK,SAAS,CACzB,CAAC;AACJ,CAAC;AAED,sDAAsD;AACtD,SAAgB,aAAa,CAAC,GAAW;IACvC,OAAO,IAAA,iBAAK,EAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC;AAED,+DAA+D;AAC/D,SAAgB,cAAc,CAAC,GAAW;IACxC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAA,kBAAM,EAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;AACzC,CAAC;AAED,6CAA6C;AAC7C,SAAgB,eAAe,CAAC,IAAU;IACxC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe,CAAC,GAAkB;IAChD,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IAC5B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACxC,IAAI,MAAM,CAAC,MAAM,GAAG,4BAAoB,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CACb,sBAAsB,4BAAoB,WAAW,MAAM,CAAC,MAAM,GAAG,CACtE,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC5B,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC3B,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC5B,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAU,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;IACzC,KAAK,CAAC,aAAa,CAAC,gBAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACtC,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACjC,KAAK,CAAC,UAAU,CAAC,4BAAoB,EAAE,CAAC,CAAC,CAAC;IAC1C,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACrB,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC;IACpB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACrC,CAAC,IAAI,CAAC,CAAC;QACP,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM;YAAE,MAAM;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;QACxC,CAAC,IAAI,GAAG,CAAC;QACT,IAAI,GAAG,KAAK,kBAAU,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;YACtC,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACjC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;gBAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;QAChC,CAAC;aAAM,IAAI,GAAG,KAAK,kBAAU,CAAC,KAAK,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;YACjD,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC;aAAM,IAAI,GAAG,KAAK,kBAAU,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;YAChD,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,GAAG,KAAK,kBAAU,CAAC,KAAK,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;YACjD,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,GAAG,KAAK,kBAAU,CAAC,MAAM,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;YACnD,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IACD,OAAO,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC;AAED,8DAA8D;AAC9D,SAAgB,oBAAoB,CAAC,KAAgC;IACnE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACvC,CAAC,IAAI,CAAC,CAAC;QACP,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC,MAAM;YAAE,MAAM;QACnC,IAAI,EAAE,KAAK,gBAAM,CAAC,MAAM,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;YACtC,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;YAChD,IAAI,OAAO,KAAK,4BAAoB,EAAE,CAAC;gBACrC,MAAM,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;gBACpC,IAAI,GAAG;oBAAE,OAAO,GAAG,CAAC;YACtB,CAAC;QACH,CAAC;QACD,CAAC,IAAI,IAAI,CAAC;IACZ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,qEAAqE;AACrE,SAAgB,oBAAoB,CAAC,KAEpC;IACC,OAAO,oBAAoB,CAAC,KAAK,CAAC,eAAe,IAAI,IAAI,CAAC,CAAC;AAC7D,CAAC"}
|
package/dist/core/version.js
CHANGED
|
@@ -25,7 +25,7 @@ exports.VERSION = void 0;
|
|
|
25
25
|
const currentDate = new Date();
|
|
26
26
|
const releaseDate = `${String(currentDate.getMonth() + 1).padStart(2, '0')}-${String(currentDate.getDate()).padStart(2, '0')}-${currentDate.getFullYear()}`;
|
|
27
27
|
exports.VERSION = {
|
|
28
|
-
number: '1.0
|
|
28
|
+
number: '1.5.0', // packageJson.version
|
|
29
29
|
date: releaseDate
|
|
30
30
|
};
|
|
31
31
|
//# sourceMappingURL=version.js.map
|