@git.zone/tspack 1.2.0 → 1.3.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/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.tspack.d.ts +4 -0
- package/dist_ts/classes.tspack.js +93 -40
- package/dist_ts/interfaces.d.ts +12 -1
- package/dist_ts/tspack.cli.js +4 -2
- package/dist_ts/validation.d.ts +2 -1
- package/dist_ts/validation.js +41 -10
- package/package.json +2 -2
- package/readme.md +51 -6
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.tspack.ts +93 -37
- package/ts/interfaces.ts +13 -1
- package/ts/tspack.cli.ts +3 -1
- package/ts/validation.ts +42 -10
- package/readme.plan.md +0 -26
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@git.zone/tspack',
|
|
6
|
-
version: '1.
|
|
6
|
+
version: '1.3.0',
|
|
7
7
|
description: 'Verified executable and asset bundles for GitZone projects.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxrQkFBa0I7SUFDeEIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLDZEQUE2RDtDQUMzRSxDQUFBIn0=
|
|
@@ -4,14 +4,18 @@ export { TsPackError } from './validation.js';
|
|
|
4
4
|
export declare class TsPack {
|
|
5
5
|
private readonly cwd;
|
|
6
6
|
constructor(cwd?: string);
|
|
7
|
+
private copyInput;
|
|
7
8
|
private source;
|
|
8
9
|
pack(configArg?: ITsPackConfig, optionsArg?: ITsPackOptions): Promise<ITsPackResult>;
|
|
9
10
|
private checksums;
|
|
10
11
|
private readArtifactSet;
|
|
11
12
|
verify(directoryArg: string, optionsArg?: ITsPackVerifyOptions): Promise<ITsPackResult>;
|
|
13
|
+
private verifyRecord;
|
|
12
14
|
private readBundle;
|
|
13
15
|
/** Verify a selected-only download: complete metadata plus exactly one archive. */
|
|
14
16
|
verifyBundle(directoryArg: string, bundleIdArg: string, optionsArg: ITsPackBundleOptions): Promise<ITsPackBundleResult>;
|
|
17
|
+
/** Verify one selected archive or standalone file against the complete trusted release identity. */
|
|
18
|
+
verifyArtifact(directoryArg: string, artifactIdArg: string, optionsArg: ITsPackBundleOptions): Promise<ITsPackBundleResult>;
|
|
15
19
|
/** Extract code/assets into a fresh private directory. The caller owns installation and activation. */
|
|
16
20
|
extractBundle(directoryArg: string, bundleIdArg: string, parentArg: string, optionsArg: ITsPackBundleOptions): Promise<ITsPackExtractResult>;
|
|
17
21
|
}
|
|
@@ -14,6 +14,38 @@ export class TsPack {
|
|
|
14
14
|
constructor(cwd = process.cwd()) {
|
|
15
15
|
this.cwd = cwd;
|
|
16
16
|
}
|
|
17
|
+
async copyInput(root, source, destination, remaining, options) {
|
|
18
|
+
const input = await noSymlinks(root, source);
|
|
19
|
+
const handle = await plugins.fs.open(input, plugins.nodeFs.constants.O_RDONLY | plugins.nodeFs.constants.O_NOFOLLOW);
|
|
20
|
+
try {
|
|
21
|
+
const before = await handle.stat({ bigint: true });
|
|
22
|
+
requireValue(before.isFile() && before.size <= BigInt(limits.file), 'unsafe_input', 'Expected a bounded regular input file.');
|
|
23
|
+
requireValue(before.size <= BigInt(remaining), 'unsafe_input', 'Package inputs exceed the total byte limit.');
|
|
24
|
+
await plugins.fs.mkdir(plugins.path.dirname(destination), { recursive: true });
|
|
25
|
+
const hash = plugins.crypto.createHash('sha256');
|
|
26
|
+
let size = 0;
|
|
27
|
+
const meter = new plugins.stream.Transform({ transform(chunk, _encoding, callback) {
|
|
28
|
+
size += chunk.length;
|
|
29
|
+
if (size > Number(before.size)) {
|
|
30
|
+
callback(new Error('Input changed while copying.'));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
hash.update(chunk);
|
|
34
|
+
callback(null, chunk);
|
|
35
|
+
} });
|
|
36
|
+
await plugins.streamPromises.pipeline(handle.createReadStream({ autoClose: false }), meter, plugins.nodeFs.createWriteStream(destination, { flags: 'wx', mode: 0o600 }));
|
|
37
|
+
const after = await handle.stat({ bigint: true });
|
|
38
|
+
const current = await plugins.fs.lstat(input, { bigint: true });
|
|
39
|
+
requireValue(size === Number(before.size) && ['dev', 'ino', 'size', 'mtimeNs', 'ctimeNs'].every((key) => before[key] === after[key] &&
|
|
40
|
+
before[key] === current[key]), 'integrity', 'Input changed while copying.');
|
|
41
|
+
const record = { sha256: hash.digest('hex'), size, mode: options.executable ? 0o755 : 0o644 };
|
|
42
|
+
requireValue(!options.sha256 || options.sha256 === record.sha256, 'integrity', 'Input does not match its pinned digest.');
|
|
43
|
+
return record;
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
await handle.close();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
17
49
|
async source(root, version, release) {
|
|
18
50
|
const run = async (...args) => (await exec('git', args, { cwd: root, maxBuffer: 4 * 1024 ** 2 })).stdout.trim();
|
|
19
51
|
const commit = await run('rev-parse', 'HEAD');
|
|
@@ -35,6 +67,9 @@ export class TsPack {
|
|
|
35
67
|
requireValue(typeof packageJson.name === 'string' && packageJson.name.length <= 214 && isVersion(packageJson.version), 'invalid_config', 'Package metadata requires a name and version.');
|
|
36
68
|
const config = normalizeConfig(configArg ?? new plugins.smartconfig.Smartconfig(root).dataFor('@git.zone/tspack', {}), packageJson.name);
|
|
37
69
|
requireValue(config.bundles.every((bundle) => isPath(`${config.name}-${packageJson.version}-${bundle.id}.tar.gz`)), 'invalid_config', 'Archive names exceed the portable path limit.');
|
|
70
|
+
const names = [...config.bundles.map((bundle) => `${config.name}-${packageJson.version}-${bundle.id}.tar.gz`),
|
|
71
|
+
...(config.assets ?? []).map((asset) => asset.name)].map((name) => name.toLowerCase());
|
|
72
|
+
requireValue(new Set(names).size === names.length, 'invalid_config', 'Archive and standalone asset names collide.');
|
|
38
73
|
const configurationSha256 = sha256(jsonBytes(config));
|
|
39
74
|
const source = await this.source(root, packageJson.version, optionsArg.release === true);
|
|
40
75
|
const outputRoot = await noSymlinks(root, config.outputDirectory, true);
|
|
@@ -65,7 +100,7 @@ export class TsPack {
|
|
|
65
100
|
await plugins.fs.mkdir(plugins.path.join(stage, 'bundles'));
|
|
66
101
|
try {
|
|
67
102
|
const manifest = {
|
|
68
|
-
format: 'tspack.release.v1', packageName: packageJson.name, name: config.name, version: packageJson.version,
|
|
103
|
+
format: config.assets?.length ? 'tspack.release.v2' : 'tspack.release.v1', packageName: packageJson.name, name: config.name, version: packageJson.version,
|
|
69
104
|
sourceCommit: source.commit, sourceDirty: source.dirty, publishable: optionsArg.release === true,
|
|
70
105
|
configurationSha256, artifacts: [],
|
|
71
106
|
};
|
|
@@ -75,38 +110,9 @@ export class TsPack {
|
|
|
75
110
|
await plugins.fs.mkdir(directory);
|
|
76
111
|
const files = Object.create(null);
|
|
77
112
|
for (const file of bundle.files) {
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
const before = await handle.stat({ bigint: true });
|
|
82
|
-
requireValue(before.isFile() && before.size <= BigInt(limits.file), 'unsafe_input', 'Expected a bounded regular input file.');
|
|
83
|
-
total += Number(before.size);
|
|
84
|
-
requireValue(total <= limits.total, 'unsafe_input', 'Package inputs exceed the total byte limit.');
|
|
85
|
-
const destination = plugins.path.join(directory, file.path);
|
|
86
|
-
await plugins.fs.mkdir(plugins.path.dirname(destination), { recursive: true });
|
|
87
|
-
const hash = plugins.crypto.createHash('sha256');
|
|
88
|
-
let size = 0;
|
|
89
|
-
const meter = new plugins.stream.Transform({ transform(chunk, _encoding, callback) {
|
|
90
|
-
size += chunk.length;
|
|
91
|
-
if (size > Number(before.size)) {
|
|
92
|
-
callback(new Error('Input changed while copying.'));
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
hash.update(chunk);
|
|
96
|
-
callback(null, chunk);
|
|
97
|
-
} });
|
|
98
|
-
await plugins.streamPromises.pipeline(handle.createReadStream({ autoClose: false }), meter, plugins.nodeFs.createWriteStream(destination, { flags: 'wx', mode: 0o600 }));
|
|
99
|
-
const after = await handle.stat({ bigint: true });
|
|
100
|
-
const current = await plugins.fs.lstat(input, { bigint: true });
|
|
101
|
-
requireValue(size === Number(before.size) && ['dev', 'ino', 'size', 'mtimeNs', 'ctimeNs'].every((key) => before[key] === after[key] &&
|
|
102
|
-
before[key] === current[key]), 'integrity', 'Input changed while copying.');
|
|
103
|
-
const record = { sha256: hash.digest('hex'), size, mode: (file.executable ? 0o755 : 0o644) };
|
|
104
|
-
requireValue(!file.sha256 || file.sha256 === record.sha256, 'integrity', 'Input does not match its pinned digest.');
|
|
105
|
-
files[file.path] = record;
|
|
106
|
-
}
|
|
107
|
-
finally {
|
|
108
|
-
await handle.close();
|
|
109
|
-
}
|
|
113
|
+
const record = await this.copyInput(root, file.source, plugins.path.join(directory, file.path), limits.total - total, file);
|
|
114
|
+
total += record.size;
|
|
115
|
+
files[file.path] = record;
|
|
110
116
|
}
|
|
111
117
|
const metadata = jsonBytes(bundleMetadata(manifest, bundle.id, files));
|
|
112
118
|
requireValue(metadata.length <= limits.json, 'invalid_config', 'Bundle metadata exceeds its limit.');
|
|
@@ -116,6 +122,15 @@ export class TsPack {
|
|
|
116
122
|
await packArchive(directory, plugins.path.join(assets, name), files);
|
|
117
123
|
manifest.artifacts.push({ id: bundle.id, name, ...await digestFile(plugins.path.join(assets, name)), files });
|
|
118
124
|
}
|
|
125
|
+
for (const asset of config.assets ?? []) {
|
|
126
|
+
const file = plugins.path.join(assets, asset.name);
|
|
127
|
+
const record = await this.copyInput(root, asset.source, file, limits.total - total, asset);
|
|
128
|
+
total += record.size;
|
|
129
|
+
await plugins.fs.chmod(file, record.mode);
|
|
130
|
+
manifest.artifacts.push({ kind: 'file', id: asset.id, name: asset.name, sha256: record.sha256,
|
|
131
|
+
size: record.size, files: { [asset.name]: record } });
|
|
132
|
+
}
|
|
133
|
+
manifest.artifacts.sort((a, b) => a.id.localeCompare(b.id, 'en'));
|
|
119
134
|
const finalSource = await this.source(root, packageJson.version, optionsArg.release === true);
|
|
120
135
|
requireValue(finalSource.commit === source.commit && finalSource.dirty === source.dirty, 'source_state', 'Source identity changed while packaging.');
|
|
121
136
|
validateManifest(manifest);
|
|
@@ -168,19 +183,49 @@ export class TsPack {
|
|
|
168
183
|
requireValue(names.join('\n') === [...selected.map((artifact) => artifact.name), 'tspack-manifest.json', 'SHA256SUMS.txt'].sort().join('\n'), 'integrity', 'Artifact directory has an unexpected file set.');
|
|
169
184
|
const checksumPath = plugins.path.join(directory, 'SHA256SUMS.txt');
|
|
170
185
|
const checksumStat = await plugins.fs.lstat(checksumPath);
|
|
171
|
-
requireValue(checksumStat.isFile() && checksumStat.size <=
|
|
186
|
+
requireValue(checksumStat.isFile() && checksumStat.size <= 64 * 1024 &&
|
|
172
187
|
await plugins.fs.readFile(checksumPath, 'utf8') === this.checksums(manifest, manifestSha256), 'integrity', 'Artifact-set checksums disagree.');
|
|
173
188
|
return { directory, manifest, manifestSha256, reused: false };
|
|
174
189
|
}
|
|
175
190
|
async verify(directoryArg, optionsArg = {}) {
|
|
176
191
|
const result = await this.readArtifactSet(directoryArg, optionsArg);
|
|
177
192
|
for (const artifact of result.manifest.artifacts) {
|
|
178
|
-
|
|
179
|
-
const { ['tspack.json']: _metadata, ...files } = artifact.files;
|
|
180
|
-
await verifyArchive(file, artifact, bundleMetadata(result.manifest, artifact.id, files));
|
|
193
|
+
await this.verifyRecord(result.directory, result.manifest, artifact);
|
|
181
194
|
}
|
|
182
195
|
return result;
|
|
183
196
|
}
|
|
197
|
+
async verifyRecord(directory, manifest, artifact, signal) {
|
|
198
|
+
const file = plugins.path.join(directory, artifact.name);
|
|
199
|
+
if (artifact.kind !== 'file') {
|
|
200
|
+
const { ['tspack.json']: _metadata, ...files } = artifact.files;
|
|
201
|
+
await verifyArchive(file, artifact, bundleMetadata(manifest, artifact.id, files), { signal });
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
signal?.throwIfAborted();
|
|
205
|
+
requireValue((await plugins.fs.lstat(file)).isFile(), 'integrity', 'Expected a regular standalone artifact.');
|
|
206
|
+
const handle = await plugins.fs.open(file, plugins.nodeFs.constants.O_RDONLY | plugins.nodeFs.constants.O_NOFOLLOW);
|
|
207
|
+
try {
|
|
208
|
+
const before = await handle.stat({ bigint: true });
|
|
209
|
+
requireValue(before.isFile() && before.size === BigInt(artifact.size), 'integrity', 'Standalone artifact size differs.');
|
|
210
|
+
const hash = plugins.crypto.createHash('sha256');
|
|
211
|
+
let size = 0;
|
|
212
|
+
for await (const chunk of handle.createReadStream({ autoClose: false })) {
|
|
213
|
+
signal?.throwIfAborted();
|
|
214
|
+
size += chunk.length;
|
|
215
|
+
requireValue(size <= artifact.size, 'integrity', 'Standalone artifact grew while reading.');
|
|
216
|
+
hash.update(chunk);
|
|
217
|
+
}
|
|
218
|
+
const after = await handle.stat({ bigint: true });
|
|
219
|
+
const current = await plugins.fs.lstat(file, { bigint: true });
|
|
220
|
+
requireValue(size === artifact.size && hash.digest('hex') === artifact.sha256 && current.isFile() &&
|
|
221
|
+
['dev', 'ino', 'size', 'mtimeNs', 'ctimeNs'].every((key) => before[key] === after[key] &&
|
|
222
|
+
before[key] === current[key]), 'integrity', 'Standalone artifact changed or does not match its identity.');
|
|
223
|
+
signal?.throwIfAborted();
|
|
224
|
+
}
|
|
225
|
+
finally {
|
|
226
|
+
await handle.close();
|
|
227
|
+
}
|
|
228
|
+
}
|
|
184
229
|
async readBundle(directoryArg, bundleIdArg, optionsArg) {
|
|
185
230
|
object(optionsArg, ['expectedManifestSha256', 'expectedSourceCommit', 'requireRelease', 'signal']);
|
|
186
231
|
requireValue(isName(bundleIdArg) && isDigest(optionsArg.expectedManifestSha256) &&
|
|
@@ -195,14 +240,22 @@ export class TsPack {
|
|
|
195
240
|
async verifyBundle(directoryArg, bundleIdArg, optionsArg) {
|
|
196
241
|
const { result, signal } = await this.readBundle(directoryArg, bundleIdArg, optionsArg);
|
|
197
242
|
const { artifact } = result;
|
|
198
|
-
|
|
199
|
-
await
|
|
243
|
+
requireValue(artifact.kind !== 'file', 'invalid_config', 'Selected artifact is a standalone file, not an archive bundle.');
|
|
244
|
+
await this.verifyRecord(result.directory, result.manifest, artifact, signal);
|
|
245
|
+
signal?.throwIfAborted();
|
|
246
|
+
return result;
|
|
247
|
+
}
|
|
248
|
+
/** Verify one selected archive or standalone file against the complete trusted release identity. */
|
|
249
|
+
async verifyArtifact(directoryArg, artifactIdArg, optionsArg) {
|
|
250
|
+
const { result, signal } = await this.readBundle(directoryArg, artifactIdArg, optionsArg);
|
|
251
|
+
await this.verifyRecord(result.directory, result.manifest, result.artifact, signal);
|
|
200
252
|
signal?.throwIfAborted();
|
|
201
253
|
return result;
|
|
202
254
|
}
|
|
203
255
|
/** Extract code/assets into a fresh private directory. The caller owns installation and activation. */
|
|
204
256
|
async extractBundle(directoryArg, bundleIdArg, parentArg, optionsArg) {
|
|
205
257
|
const { result, signal } = await this.readBundle(directoryArg, bundleIdArg, optionsArg);
|
|
258
|
+
requireValue(result.artifact.kind !== 'file', 'invalid_config', 'Selected artifact is a standalone file, not an archive bundle.');
|
|
206
259
|
requireValue(typeof parentArg === 'string' && parentArg.length > 0, 'unsafe_input', 'An extraction parent is required.');
|
|
207
260
|
const parent = plugins.path.resolve(this.cwd, parentArg);
|
|
208
261
|
requireValue((await plugins.fs.lstat(parent)).isDirectory() && await plugins.fs.realpath(parent) === parent, 'unsafe_input', 'Extraction requires an existing canonical parent directory.');
|
|
@@ -225,4 +278,4 @@ export class TsPack {
|
|
|
225
278
|
}
|
|
226
279
|
}
|
|
227
280
|
}
|
|
228
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50c3BhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLnRzcGFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUd4QyxPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFDeEgsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFOUMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNuRSxNQUFNLGNBQWMsR0FBRyxDQUFDLFFBQTRDLEVBQUUsRUFBVSxFQUFFLEtBQXdDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDOUgsTUFBTSxFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztJQUN4RixFQUFFLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXO0lBQzFFLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxLQUFLO0NBQzVGLENBQUMsQ0FBQztBQUVILDRHQUE0RztBQUM1RyxNQUFNLE9BQU8sTUFBTTtJQUNZO0lBQTdCLFlBQTZCLE1BQU0sT0FBTyxDQUFD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
|
|
281
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50c3BhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLnRzcGFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUd4QyxPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFDeEgsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFOUMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNuRSxNQUFNLGNBQWMsR0FBRyxDQUFDLFFBQTRDLEVBQUUsRUFBVSxFQUFFLEtBQXdDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDOUgsTUFBTSxFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztJQUN4RixFQUFFLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXO0lBQzFFLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxLQUFLO0NBQzVGLENBQUMsQ0FBQztBQUVILDRHQUE0RztBQUM1RyxNQUFNLE9BQU8sTUFBTTtJQUNZO0lBQTdCLFlBQTZCLE1BQU0sT0FBTyxDQUFD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
|
package/dist_ts/interfaces.d.ts
CHANGED
|
@@ -11,12 +11,21 @@ export interface ITsPackBundle {
|
|
|
11
11
|
id: string;
|
|
12
12
|
files: ITsPackFile[];
|
|
13
13
|
}
|
|
14
|
+
/** A named release asset whose bytes are published without an archive wrapper. */
|
|
15
|
+
export interface ITsPackAsset {
|
|
16
|
+
id: string;
|
|
17
|
+
source: string;
|
|
18
|
+
name: string;
|
|
19
|
+
executable?: boolean;
|
|
20
|
+
sha256?: string;
|
|
21
|
+
}
|
|
14
22
|
export interface ITsPackConfig {
|
|
15
23
|
schemaVersion: 1;
|
|
16
24
|
/** Defaults to the package name with its scope separator replaced by a hyphen. */
|
|
17
25
|
name?: string;
|
|
18
26
|
outputDirectory?: string;
|
|
19
27
|
bundles: ITsPackBundle[];
|
|
28
|
+
assets?: ITsPackAsset[];
|
|
20
29
|
}
|
|
21
30
|
export interface ITsPackOptions {
|
|
22
31
|
/** Requires clean source at the package's vVERSION tag. */
|
|
@@ -30,6 +39,8 @@ export interface ITsPackFileRecord {
|
|
|
30
39
|
mode: 420 | 493;
|
|
31
40
|
}
|
|
32
41
|
export interface ITsPackArtifact {
|
|
42
|
+
/** Omitted for v1-compatible tar.gz bundles; explicit for standalone files in v2 sets. */
|
|
43
|
+
kind?: 'file';
|
|
33
44
|
id: string;
|
|
34
45
|
name: string;
|
|
35
46
|
sha256: string;
|
|
@@ -37,7 +48,7 @@ export interface ITsPackArtifact {
|
|
|
37
48
|
files: Record<string, ITsPackFileRecord>;
|
|
38
49
|
}
|
|
39
50
|
export interface ITsPackManifest {
|
|
40
|
-
format: 'tspack.release.v1';
|
|
51
|
+
format: 'tspack.release.v1' | 'tspack.release.v2';
|
|
41
52
|
packageName: string;
|
|
42
53
|
name: string;
|
|
43
54
|
version: string;
|
package/dist_ts/tspack.cli.js
CHANGED
|
@@ -43,11 +43,13 @@ export async function runCli(args = process.argv.slice(2)) {
|
|
|
43
43
|
? await pack.verify(directory, { requireRelease: release, expectedManifestSha256 })
|
|
44
44
|
: (() => { throw new TsPackError('arguments', 'Expected pack or verify with its required arguments.'); })();
|
|
45
45
|
console.log(JSON.stringify({ directory: result.directory, manifestSha256: result.manifestSha256,
|
|
46
|
-
publishable: result.manifest.publishable, reused: result.reused,
|
|
46
|
+
publishable: result.manifest.publishable, reused: result.reused,
|
|
47
|
+
bundles: result.manifest.artifacts.filter((artifact) => artifact.kind !== 'file').length,
|
|
48
|
+
assets: result.manifest.artifacts.filter((artifact) => artifact.kind === 'file').length }));
|
|
47
49
|
}
|
|
48
50
|
catch (error) {
|
|
49
51
|
console.error(error instanceof TsPackError ? `tspack: ${error.code}: ${error.message}` : 'tspack: operation failed.');
|
|
50
52
|
process.exitCode = 1;
|
|
51
53
|
}
|
|
52
54
|
}
|
|
53
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNwYWNrLmNsaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3RzcGFjay5jbGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRCxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFM0MsTUFBTSxDQUFDLEtBQUssVUFBVSxNQUFNLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN2RCxJQUFJLENBQUM7UUFDSCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3BFLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUlBQXVJLENBQUMsQ0FBQztZQUNySixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sU0FBUyxHQUFHLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3BFLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbEIsSUFBSSxVQUE4QixDQUFDO1FBQ25DLElBQUksc0JBQTBDLENBQUM7UUFDL0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN2QixPQUFPLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FB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
|
package/dist_ts/validation.d.ts
CHANGED
|
@@ -16,9 +16,10 @@ export declare const isCommit: (value: unknown) => value is string;
|
|
|
16
16
|
export declare const isName: (value: unknown) => value is string;
|
|
17
17
|
export declare const isVersion: (value: unknown) => value is string;
|
|
18
18
|
export declare const isPath: (value: unknown) => value is string;
|
|
19
|
+
export declare const isAssetName: (value: unknown) => value is string;
|
|
19
20
|
export declare const jsonBytes: (value: unknown) => Buffer<ArrayBuffer>;
|
|
20
21
|
export declare function object(value: unknown, allowed?: readonly string[]): asserts value is Record<string, unknown>;
|
|
21
|
-
export declare function normalizeConfig(value: unknown, packageName: string): Required<ITsPackConfig>;
|
|
22
|
+
export declare function normalizeConfig(value: unknown, packageName: string): Omit<Required<ITsPackConfig>, 'assets'> & Pick<ITsPackConfig, 'assets'>;
|
|
22
23
|
export declare function validateFileRecord(value: unknown): asserts value is ITsPackFileRecord;
|
|
23
24
|
export declare function validateManifest(value: unknown): asserts value is ITsPackManifest;
|
|
24
25
|
export declare function noSymlinks(root: string, relative: string, allowMissing?: boolean): Promise<string>;
|
package/dist_ts/validation.js
CHANGED
|
@@ -19,6 +19,8 @@ export const isName = (value) => typeof value === 'string' && /^[a-z0-9][a-z0-9.
|
|
|
19
19
|
export const isVersion = (value) => typeof value === 'string' && value.length <= 64 && /^\d+\.\d+\.\d+(?:-[a-zA-Z0-9.-]+)?$/.test(value);
|
|
20
20
|
export const isPath = (value) => typeof value === 'string' && value.length <= 240 &&
|
|
21
21
|
/^[a-zA-Z0-9@_+./-]+$/.test(value) && !value.startsWith('/') && value.split('/').every((part) => part && part !== '.' && part !== '..');
|
|
22
|
+
export const isAssetName = (value) => isPath(value) && !value.includes('/') &&
|
|
23
|
+
!['tspack-manifest.json', 'sha256sums.txt', 'tspack.json'].includes(value.toLowerCase());
|
|
22
24
|
export const jsonBytes = (value) => Buffer.from(JSON.stringify(value, null, 2) + '\n');
|
|
23
25
|
export function object(value, allowed) {
|
|
24
26
|
requireValue(value && typeof value === 'object' && !Array.isArray(value) && !plugins.util.types.isProxy(value) &&
|
|
@@ -28,11 +30,22 @@ export function object(value, allowed) {
|
|
|
28
30
|
'value' in Object.getOwnPropertyDescriptor(value, key)), 'invalid_config', 'Unexpected record property.');
|
|
29
31
|
}
|
|
30
32
|
export function normalizeConfig(value, packageName) {
|
|
31
|
-
object(value, ['schemaVersion', 'name', 'outputDirectory', 'bundles']);
|
|
33
|
+
object(value, ['schemaVersion', 'name', 'outputDirectory', 'bundles', 'assets']);
|
|
32
34
|
const name = value.name ?? packageName.replace(/^@/, '').replace('/', '-');
|
|
33
35
|
const outputDirectory = value.outputDirectory ?? 'dist_pack';
|
|
34
36
|
requireValue(value.schemaVersion === 1 && isName(name) && isPath(outputDirectory) &&
|
|
35
|
-
Array.isArray(value.bundles) && value.bundles.length
|
|
37
|
+
Array.isArray(value.bundles) && value.bundles.length <= 128 &&
|
|
38
|
+
(!Object.hasOwn(value, 'assets') || Array.isArray(value.assets)), 'invalid_config', 'Invalid tspack configuration.');
|
|
39
|
+
const assetInputs = (value.assets ?? []);
|
|
40
|
+
requireValue(assetInputs.length + value.bundles.length > 0 && assetInputs.length + value.bundles.length <= 128, 'invalid_config', 'A release requires between one and 128 artifacts.');
|
|
41
|
+
const assets = assetInputs.map((asset) => {
|
|
42
|
+
object(asset, ['id', 'source', 'name', 'executable', 'sha256']);
|
|
43
|
+
requireValue(isName(asset.id) && isPath(asset.source) && isAssetName(asset.name) &&
|
|
44
|
+
(!Object.hasOwn(asset, 'executable') || typeof asset.executable === 'boolean') &&
|
|
45
|
+
(!Object.hasOwn(asset, 'sha256') || isDigest(asset.sha256)), 'invalid_config', 'Invalid standalone asset.');
|
|
46
|
+
return { id: asset.id, source: asset.source, name: asset.name, executable: asset.executable === true,
|
|
47
|
+
...(asset.sha256 ? { sha256: asset.sha256 } : {}) };
|
|
48
|
+
}).sort((a, b) => a.id.localeCompare(b.id, 'en'));
|
|
36
49
|
let count = 0;
|
|
37
50
|
const bundles = value.bundles.map((bundle) => {
|
|
38
51
|
object(bundle, ['id', 'files']);
|
|
@@ -50,8 +63,11 @@ export function normalizeConfig(value, packageName) {
|
|
|
50
63
|
files.every((file) => !files.some((other) => other.path.startsWith(file.path + '/'))), 'invalid_config', 'Bundle paths collide.');
|
|
51
64
|
return { id: bundle.id, files };
|
|
52
65
|
}).sort((a, b) => a.id.localeCompare(b.id, 'en'));
|
|
53
|
-
|
|
54
|
-
|
|
66
|
+
const ids = [...bundles, ...assets].map((artifact) => artifact.id);
|
|
67
|
+
requireValue(count + assets.length <= limits.files && new Set(ids).size === ids.length &&
|
|
68
|
+
new Set(assets.map((asset) => asset.name.toLowerCase())).size === assets.length, 'invalid_config', 'Too many files or duplicate bundle identifiers.');
|
|
69
|
+
// Omit an empty extension so archive-only v1 configuration hashes remain unchanged.
|
|
70
|
+
return { schemaVersion: 1, name, outputDirectory, bundles, ...(assets.length ? { assets } : {}) };
|
|
55
71
|
}
|
|
56
72
|
export function validateFileRecord(value) {
|
|
57
73
|
object(value, ['sha256', 'size', 'mode']);
|
|
@@ -60,7 +76,7 @@ export function validateFileRecord(value) {
|
|
|
60
76
|
}
|
|
61
77
|
export function validateManifest(value) {
|
|
62
78
|
object(value, ['format', 'packageName', 'name', 'version', 'sourceCommit', 'sourceDirty', 'publishable', 'configurationSha256', 'artifacts']);
|
|
63
|
-
requireValue(
|
|
79
|
+
requireValue(['tspack.release.v1', 'tspack.release.v2'].includes(value.format) && typeof value.packageName === 'string' && value.packageName.length <= 214 &&
|
|
64
80
|
isName(value.name) && isVersion(value.version) && isCommit(value.sourceCommit) &&
|
|
65
81
|
typeof value.sourceDirty === 'boolean' && typeof value.publishable === 'boolean' &&
|
|
66
82
|
(!value.publishable || !value.sourceDirty) && isDigest(value.configurationSha256) &&
|
|
@@ -69,17 +85,31 @@ export function validateManifest(value) {
|
|
|
69
85
|
const names = new Set();
|
|
70
86
|
let total = 0;
|
|
71
87
|
let count = 0;
|
|
88
|
+
let standaloneCount = 0;
|
|
72
89
|
for (const artifact of value.artifacts) {
|
|
73
|
-
object(artifact, ['id', 'name', 'sha256', 'size', 'files']);
|
|
90
|
+
object(artifact, ['id', 'name', 'sha256', 'size', 'files', ...(value.format === 'tspack.release.v2' ? ['kind'] : [])]);
|
|
91
|
+
requireValue(!Object.hasOwn(artifact, 'kind') || artifact.kind === 'file', 'invalid_manifest', 'Invalid artifact kind.');
|
|
92
|
+
const standalone = artifact.kind === 'file';
|
|
74
93
|
requireValue(isName(artifact.id) && !ids.has(artifact.id) &&
|
|
75
|
-
isPath(artifact.name) && artifact.name === `${value.name}-${value.version}-${artifact.id}.tar.gz`
|
|
94
|
+
isPath(artifact.name) && (standalone ? isAssetName(artifact.name) : artifact.name === `${value.name}-${value.version}-${artifact.id}.tar.gz`) &&
|
|
95
|
+
!names.has(artifact.name.toLowerCase()) &&
|
|
76
96
|
isDigest(artifact.sha256) && typeof artifact.size === 'number' && Number.isSafeInteger(artifact.size) &&
|
|
77
|
-
artifact.size > 0 && artifact.size <= limits.total, 'invalid_manifest', 'Invalid
|
|
97
|
+
(standalone ? artifact.size >= 0 && artifact.size <= limits.file : artifact.size > 0 && artifact.size <= limits.total), 'invalid_manifest', 'Invalid artifact identity.');
|
|
78
98
|
ids.add(artifact.id);
|
|
79
|
-
names.add(artifact.name);
|
|
99
|
+
names.add(artifact.name.toLowerCase());
|
|
80
100
|
object(artifact.files);
|
|
81
101
|
const fileRecords = artifact.files;
|
|
82
102
|
const paths = Object.keys(fileRecords);
|
|
103
|
+
if (standalone) {
|
|
104
|
+
standaloneCount++;
|
|
105
|
+
requireValue(paths.length === 1 && paths[0] === artifact.name, 'invalid_manifest', 'A standalone asset requires its exact file record.');
|
|
106
|
+
const record = fileRecords[artifact.name];
|
|
107
|
+
validateFileRecord(record);
|
|
108
|
+
requireValue(record.sha256 === artifact.sha256 && record.size === artifact.size, 'invalid_manifest', 'Standalone file identities disagree.');
|
|
109
|
+
total += record.size;
|
|
110
|
+
count++;
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
83
113
|
requireValue(Object.hasOwn(artifact.files, 'tspack.json') && paths.length > 1, 'invalid_manifest', 'Bundle metadata or selected files are missing.');
|
|
84
114
|
requireValue(paths.every((name) => name.split('/').slice(0, -1).every((_part, index, parents) => !Object.hasOwn(fileRecords, parents.slice(0, index + 1).join('/')))), 'invalid_manifest', 'Archive member paths collide.');
|
|
85
115
|
for (const [name, record] of Object.entries(artifact.files)) {
|
|
@@ -89,6 +119,7 @@ export function validateManifest(value) {
|
|
|
89
119
|
count++;
|
|
90
120
|
}
|
|
91
121
|
}
|
|
122
|
+
requireValue(value.format === 'tspack.release.v1' || standaloneCount > 0, 'invalid_manifest', 'Manifest v2 requires a standalone asset.');
|
|
92
123
|
requireValue(total <= limits.total && count <= limits.files + 128, 'invalid_manifest', 'Artifact set exceeds its limits.');
|
|
93
124
|
}
|
|
94
125
|
export async function noSymlinks(root, relative, allowMissing = false) {
|
|
@@ -132,4 +163,4 @@ export async function digestFile(file) {
|
|
|
132
163
|
requireValue(size === stat.size, 'integrity', 'Artifact size changed while reading.');
|
|
133
164
|
return { sha256: hash.digest('hex'), size };
|
|
134
165
|
}
|
|
135
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3ZhbGlkYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFHeEMsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ3pHLE1BQU0sT0FBTyxXQUFZLFNBQVEsS0FBSztJQUNSO0lBQTVCLFlBQTRCLElBQVksRUFBRSxPQUFlO1FBQ3ZELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQURXLFNBQUksR0FBSixJQUFJLENBQVE7UUFFdEMsSUFBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUM7SUFDNUIsQ0FBQztDQUNGO0FBQ0QsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUFjLEVBQUUsSUFBWSxFQUFFLE9BQWU7SUFDeEUsSUFBSSxDQUFDLEtBQUs7UUFBRSxNQUFNLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBQ0QsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLENBQUMsS0FBc0IsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNsSCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxLQUFjLEVBQW1CLEVBQUUsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FB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
|
|
166
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3ZhbGlkYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFHeEMsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ3pHLE1BQU0sT0FBTyxXQUFZLFNBQVEsS0FBSztJQUNSO0lBQTVCLFlBQTRCLElBQVksRUFBRSxPQUFlO1FBQ3ZELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQURXLFNBQUksR0FBSixJQUFJLENBQVE7UUFFdEMsSUFBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUM7SUFDNUIsQ0FBQztDQUNGO0FBQ0QsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUFjLEVBQUUsSUFBWSxFQUFFLE9BQWU7SUFDeEUsSUFBSSxDQUFDLEtBQUs7UUFBRSxNQUFNLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBQ0QsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLENBQUMsS0FBc0IsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNsSCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxLQUFjLEVBQW1CLEVBQUUsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FB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RUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN0RCxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUN0QixZQUFZLENBQUMsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxNQUFNO1lBQ3hFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQ3ZGLGdCQUFnQixFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFDM0MsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ2xDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNsRCxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsT0FBTyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbkUsWUFBWSxDQUFDLEtBQUssR0FBRyxNQUFNLENB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@git.zone/tspack",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "Verified executable and asset bundles for GitZone projects.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist_ts/index.js",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"@git.zone/tsbuild": "4.4.2",
|
|
20
20
|
"@git.zone/tsrun": "2.0.6",
|
|
21
21
|
"@git.zone/tstest": "4.0.0",
|
|
22
|
-
"@types/node": "26.4.
|
|
22
|
+
"@types/node": "26.4.1"
|
|
23
23
|
},
|
|
24
24
|
"files": [
|
|
25
25
|
"ts/**/*",
|
package/readme.md
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
# @git.zone/tspack
|
|
2
2
|
|
|
3
3
|
TsPack packages compiled executables and supporting assets into verified tar.gz
|
|
4
|
-
bundles. It records each file's digest and executable
|
|
5
|
-
artifact set, and verifies archive contents without
|
|
4
|
+
bundles and named standalone files. It records each file's digest and executable
|
|
5
|
+
role, seals the complete artifact set, and verifies archive contents without
|
|
6
|
+
extracting filesystem paths.
|
|
6
7
|
TsDeno and TsRust own compilation; GitZone and CI own publication.
|
|
7
8
|
|
|
8
9
|
## Issue Reporting and Security
|
|
@@ -51,6 +52,42 @@ materials explicitly according to the component's distribution requirements.
|
|
|
51
52
|
TsPack does not automatically publish application source, vendor dependencies,
|
|
52
53
|
rebuild runtimes or reject accepted licenses such as LGPL.
|
|
53
54
|
|
|
55
|
+
### Standalone release assets
|
|
56
|
+
|
|
57
|
+
Add `assets` when an installer needs a bare executable or script with a fixed
|
|
58
|
+
download name. Each asset participates in the same sealed set as the archives:
|
|
59
|
+
|
|
60
|
+
```json
|
|
61
|
+
{
|
|
62
|
+
"schemaVersion": 1,
|
|
63
|
+
"bundles": [],
|
|
64
|
+
"assets": [
|
|
65
|
+
{
|
|
66
|
+
"id": "bootstrap-linux-amd64",
|
|
67
|
+
"source": "dist_binary/bootstrap",
|
|
68
|
+
"name": "app-linux-x64",
|
|
69
|
+
"executable": true
|
|
70
|
+
},
|
|
71
|
+
{ "id": "installer", "source": "install.sh", "name": "install.sh" }
|
|
72
|
+
]
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
You can combine `bundles` and `assets`, or leave `bundles` empty for a file-only
|
|
77
|
+
release. Asset IDs are unique across both kinds. Names are single portable path
|
|
78
|
+
components; metadata names, duplicate names differing only by case, and collisions
|
|
79
|
+
with generated archive names are rejected. Standalone inputs accept the same
|
|
80
|
+
optional `sha256` pin and executable role as bundle files. Their original bytes
|
|
81
|
+
are copied without an archive wrapper. Verification does not execute them.
|
|
82
|
+
|
|
83
|
+
Archive-only configurations retain their v1 manifest and configuration identity,
|
|
84
|
+
including when `assets` is empty. A set with standalone files uses
|
|
85
|
+
`tspack.release.v2`; each standalone artifact has `kind: "file"` and one exact
|
|
86
|
+
entry in `files`. Consumers must support v2 before such a release is published.
|
|
87
|
+
TsPack continues to verify and extract published v1 bundles. A downloader applies
|
|
88
|
+
the recorded role when installing a standalone file; retention services may discard
|
|
89
|
+
the downloaded file's filesystem executable bit without changing its identity.
|
|
90
|
+
|
|
54
91
|
## Package and verify
|
|
55
92
|
|
|
56
93
|
```sh
|
|
@@ -69,14 +106,15 @@ pnpm exec tspack verify dist_pack/example-control-1.2.3-COMMITPREFIX \
|
|
|
69
106
|
```
|
|
70
107
|
|
|
71
108
|
Commands return one JSON result with the output directory, manifest digest,
|
|
72
|
-
publishable state, reuse state and
|
|
109
|
+
publishable state, reuse state, bundle count and standalone asset count. Invalid arguments or failed
|
|
73
110
|
verification return a nonzero exit code.
|
|
74
111
|
|
|
75
112
|
Each artifact directory contains:
|
|
76
113
|
|
|
77
114
|
- One `NAME-VERSION-BUNDLE.tar.gz` per configured bundle.
|
|
115
|
+
- Each configured standalone asset under its exact `name`.
|
|
78
116
|
- `tspack-manifest.json`: package, source, configuration, archive and file identities.
|
|
79
|
-
- `SHA256SUMS.txt`: digests of the manifest and every archive.
|
|
117
|
+
- `SHA256SUMS.txt`: digests of the manifest and every archive or standalone file.
|
|
80
118
|
|
|
81
119
|
Each bundle includes its selected files plus `tspack.json`, which binds the same
|
|
82
120
|
source/configuration identity and selected file records. `tspack.json` is reserved.
|
|
@@ -92,7 +130,7 @@ packaging/compression toolchain; this does not claim the compilers themselves ar
|
|
|
92
130
|
reproducible. Failed packaging removes only its own temporary staging directory.
|
|
93
131
|
|
|
94
132
|
Limits are 2 GiB per selected file, 8 GiB total uncompressed content, 10,000 selected
|
|
95
|
-
files, 128
|
|
133
|
+
files, 128 artifacts, 64 KiB for the checksum list, and 16 MiB for JSON metadata. Paths are portable ASCII relative
|
|
96
134
|
names up to 240 characters. The source checkout, selected build tools and local
|
|
97
135
|
filesystem are trusted; these checks do not sandbox malicious project code or a
|
|
98
136
|
concurrent privileged writer. A checksum establishes content identity. Obtain the
|
|
@@ -144,7 +182,14 @@ await packer.verify(result.directory, {
|
|
|
144
182
|
For a platform-specific download, keep the complete `tspack-manifest.json` and
|
|
145
183
|
`SHA256SUMS.txt` alongside exactly the selected archive. `verifyBundle(directory,
|
|
146
184
|
bundleId, options)` checks this selected-only set, including the complete manifest
|
|
147
|
-
and checksum list. Ordinary `verify`
|
|
185
|
+
and checksum list. Ordinary `verify` requires every archive and standalone file.
|
|
186
|
+
|
|
187
|
+
`verifyArtifact(directory, artifactId, options)` accepts a selected-only archive
|
|
188
|
+
or standalone file with the same required trusted manifest pin, optional source
|
|
189
|
+
pin, release requirement and `AbortSignal`. Standalone verification holds the
|
|
190
|
+
actual file descriptor while checking its size, digest and identity. It returns
|
|
191
|
+
only after closing the descriptor, including on cancellation. `verifyBundle` and
|
|
192
|
+
`extractBundle` reject standalone selections; they never treat bare bytes as tar.
|
|
148
193
|
|
|
149
194
|
`extractBundle` verifies the selected archive and returns a fresh private directory
|
|
150
195
|
under an existing canonical staging parent:
|
package/ts/00_commitinfo_data.ts
CHANGED
package/ts/classes.tspack.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
|
-
import type { ITsPackConfig, ITsPackOptions, ITsPackResult, ITsPackVerifyOptions, ITsPackFileRecord, ITsPackManifest,
|
|
2
|
+
import type { ITsPackConfig, ITsPackOptions, ITsPackResult, ITsPackVerifyOptions, ITsPackFileRecord, ITsPackManifest, ITsPackArtifact,
|
|
3
3
|
ITsPackBundleOptions, ITsPackBundleResult, ITsPackExtractResult } from './interfaces.js';
|
|
4
4
|
import { packArchive, verifyArchive } from './archive.js';
|
|
5
5
|
import { digestFile, isCommit, isDigest, isName, isPath, isVersion, jsonBytes, limits, noSymlinks, normalizeConfig, object,
|
|
@@ -17,6 +17,36 @@ const bundleMetadata = (manifest: Omit<ITsPackManifest, 'artifacts'>, id: string
|
|
|
17
17
|
export class TsPack {
|
|
18
18
|
constructor(private readonly cwd = process.cwd()) {}
|
|
19
19
|
|
|
20
|
+
private async copyInput(root: string, source: string, destination: string, remaining: number,
|
|
21
|
+
options: { executable?: boolean; sha256?: string }): Promise<ITsPackFileRecord> {
|
|
22
|
+
const input = await noSymlinks(root, source);
|
|
23
|
+
const handle = await plugins.fs.open(input, plugins.nodeFs.constants.O_RDONLY | plugins.nodeFs.constants.O_NOFOLLOW);
|
|
24
|
+
try {
|
|
25
|
+
const before = await handle.stat({ bigint: true });
|
|
26
|
+
requireValue(before.isFile() && before.size <= BigInt(limits.file), 'unsafe_input', 'Expected a bounded regular input file.');
|
|
27
|
+
requireValue(before.size <= BigInt(remaining), 'unsafe_input', 'Package inputs exceed the total byte limit.');
|
|
28
|
+
await plugins.fs.mkdir(plugins.path.dirname(destination), { recursive: true });
|
|
29
|
+
const hash = plugins.crypto.createHash('sha256');
|
|
30
|
+
let size = 0;
|
|
31
|
+
const meter = new plugins.stream.Transform({ transform(chunk: Buffer, _encoding, callback) {
|
|
32
|
+
size += chunk.length;
|
|
33
|
+
if (size > Number(before.size)) { callback(new Error('Input changed while copying.')); return; }
|
|
34
|
+
hash.update(chunk); callback(null, chunk);
|
|
35
|
+
} });
|
|
36
|
+
await plugins.streamPromises.pipeline(handle.createReadStream({ autoClose: false }), meter,
|
|
37
|
+
plugins.nodeFs.createWriteStream(destination, { flags: 'wx', mode: 0o600 }));
|
|
38
|
+
const after = await handle.stat({ bigint: true });
|
|
39
|
+
const current = await plugins.fs.lstat(input, { bigint: true });
|
|
40
|
+
requireValue(size === Number(before.size) && ['dev', 'ino', 'size', 'mtimeNs', 'ctimeNs'].every((key) =>
|
|
41
|
+
before[key as keyof typeof before] === after[key as keyof typeof after] &&
|
|
42
|
+
before[key as keyof typeof before] === current[key as keyof typeof current]),
|
|
43
|
+
'integrity', 'Input changed while copying.');
|
|
44
|
+
const record: ITsPackFileRecord = { sha256: hash.digest('hex'), size, mode: options.executable ? 0o755 : 0o644 };
|
|
45
|
+
requireValue(!options.sha256 || options.sha256 === record.sha256, 'integrity', 'Input does not match its pinned digest.');
|
|
46
|
+
return record;
|
|
47
|
+
} finally { await handle.close(); }
|
|
48
|
+
}
|
|
49
|
+
|
|
20
50
|
private async source(root: string, version: string, release: boolean) {
|
|
21
51
|
const run = async (...args: string[]) => (await exec('git', args, { cwd: root, maxBuffer: 4 * 1024 ** 2 })).stdout.trim();
|
|
22
52
|
const commit = await run('rev-parse', 'HEAD');
|
|
@@ -42,6 +72,9 @@ export class TsPack {
|
|
|
42
72
|
const config = normalizeConfig(configArg ?? new plugins.smartconfig.Smartconfig(root).dataFor('@git.zone/tspack', {}), packageJson.name);
|
|
43
73
|
requireValue(config.bundles.every((bundle) => isPath(`${config.name}-${packageJson.version}-${bundle.id}.tar.gz`)),
|
|
44
74
|
'invalid_config', 'Archive names exceed the portable path limit.');
|
|
75
|
+
const names = [...config.bundles.map((bundle) => `${config.name}-${packageJson.version}-${bundle.id}.tar.gz`),
|
|
76
|
+
...(config.assets ?? []).map((asset) => asset.name)].map((name) => name.toLowerCase());
|
|
77
|
+
requireValue(new Set(names).size === names.length, 'invalid_config', 'Archive and standalone asset names collide.');
|
|
45
78
|
const configurationSha256 = sha256(jsonBytes(config));
|
|
46
79
|
const source = await this.source(root, packageJson.version, optionsArg.release === true);
|
|
47
80
|
const outputRoot = await noSymlinks(root, config.outputDirectory, true);
|
|
@@ -65,7 +98,7 @@ export class TsPack {
|
|
|
65
98
|
await plugins.fs.mkdir(plugins.path.join(stage, 'bundles'));
|
|
66
99
|
try {
|
|
67
100
|
const manifest: ITsPackManifest = {
|
|
68
|
-
format: 'tspack.release.v1', packageName: packageJson.name, name: config.name, version: packageJson.version,
|
|
101
|
+
format: config.assets?.length ? 'tspack.release.v2' : 'tspack.release.v1', packageName: packageJson.name, name: config.name, version: packageJson.version,
|
|
69
102
|
sourceCommit: source.commit, sourceDirty: source.dirty, publishable: optionsArg.release === true,
|
|
70
103
|
configurationSha256, artifacts: [],
|
|
71
104
|
};
|
|
@@ -75,34 +108,9 @@ export class TsPack {
|
|
|
75
108
|
await plugins.fs.mkdir(directory);
|
|
76
109
|
const files: Record<string, ITsPackFileRecord> = Object.create(null);
|
|
77
110
|
for (const file of bundle.files) {
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
const before = await handle.stat({ bigint: true });
|
|
82
|
-
requireValue(before.isFile() && before.size <= BigInt(limits.file), 'unsafe_input', 'Expected a bounded regular input file.');
|
|
83
|
-
total += Number(before.size);
|
|
84
|
-
requireValue(total <= limits.total, 'unsafe_input', 'Package inputs exceed the total byte limit.');
|
|
85
|
-
const destination = plugins.path.join(directory, file.path);
|
|
86
|
-
await plugins.fs.mkdir(plugins.path.dirname(destination), { recursive: true });
|
|
87
|
-
const hash = plugins.crypto.createHash('sha256');
|
|
88
|
-
let size = 0;
|
|
89
|
-
const meter = new plugins.stream.Transform({ transform(chunk: Buffer, _encoding, callback) {
|
|
90
|
-
size += chunk.length;
|
|
91
|
-
if (size > Number(before.size)) { callback(new Error('Input changed while copying.')); return; }
|
|
92
|
-
hash.update(chunk); callback(null, chunk);
|
|
93
|
-
} });
|
|
94
|
-
await plugins.streamPromises.pipeline(handle.createReadStream({ autoClose: false }), meter,
|
|
95
|
-
plugins.nodeFs.createWriteStream(destination, { flags: 'wx', mode: 0o600 }));
|
|
96
|
-
const after = await handle.stat({ bigint: true });
|
|
97
|
-
const current = await plugins.fs.lstat(input, { bigint: true });
|
|
98
|
-
requireValue(size === Number(before.size) && ['dev', 'ino', 'size', 'mtimeNs', 'ctimeNs'].every((key) =>
|
|
99
|
-
before[key as keyof typeof before] === after[key as keyof typeof after] &&
|
|
100
|
-
before[key as keyof typeof before] === current[key as keyof typeof current]),
|
|
101
|
-
'integrity', 'Input changed while copying.');
|
|
102
|
-
const record = { sha256: hash.digest('hex'), size, mode: (file.executable ? 0o755 : 0o644) as 493 | 420 };
|
|
103
|
-
requireValue(!file.sha256 || file.sha256 === record.sha256, 'integrity', 'Input does not match its pinned digest.');
|
|
104
|
-
files[file.path] = record;
|
|
105
|
-
} finally { await handle.close(); }
|
|
111
|
+
const record = await this.copyInput(root, file.source, plugins.path.join(directory, file.path), limits.total - total, file);
|
|
112
|
+
total += record.size;
|
|
113
|
+
files[file.path] = record;
|
|
106
114
|
}
|
|
107
115
|
const metadata = jsonBytes(bundleMetadata(manifest, bundle.id, files));
|
|
108
116
|
requireValue(metadata.length <= limits.json, 'invalid_config', 'Bundle metadata exceeds its limit.');
|
|
@@ -112,6 +120,15 @@ export class TsPack {
|
|
|
112
120
|
await packArchive(directory, plugins.path.join(assets, name), files);
|
|
113
121
|
manifest.artifacts.push({ id: bundle.id, name, ...await digestFile(plugins.path.join(assets, name)), files });
|
|
114
122
|
}
|
|
123
|
+
for (const asset of config.assets ?? []) {
|
|
124
|
+
const file = plugins.path.join(assets, asset.name);
|
|
125
|
+
const record = await this.copyInput(root, asset.source, file, limits.total - total, asset);
|
|
126
|
+
total += record.size;
|
|
127
|
+
await plugins.fs.chmod(file, record.mode);
|
|
128
|
+
manifest.artifacts.push({ kind: 'file', id: asset.id, name: asset.name, sha256: record.sha256,
|
|
129
|
+
size: record.size, files: { [asset.name]: record } });
|
|
130
|
+
}
|
|
131
|
+
manifest.artifacts.sort((a, b) => a.id.localeCompare(b.id, 'en'));
|
|
115
132
|
const finalSource = await this.source(root, packageJson.version, optionsArg.release === true);
|
|
116
133
|
requireValue(finalSource.commit === source.commit && finalSource.dirty === source.dirty, 'source_state', 'Source identity changed while packaging.');
|
|
117
134
|
validateManifest(manifest);
|
|
@@ -160,7 +177,7 @@ export class TsPack {
|
|
|
160
177
|
'integrity', 'Artifact directory has an unexpected file set.');
|
|
161
178
|
const checksumPath = plugins.path.join(directory, 'SHA256SUMS.txt');
|
|
162
179
|
const checksumStat = await plugins.fs.lstat(checksumPath);
|
|
163
|
-
requireValue(checksumStat.isFile() && checksumStat.size <=
|
|
180
|
+
requireValue(checksumStat.isFile() && checksumStat.size <= 64 * 1024 &&
|
|
164
181
|
await plugins.fs.readFile(checksumPath, 'utf8') === this.checksums(manifest, manifestSha256), 'integrity', 'Artifact-set checksums disagree.');
|
|
165
182
|
return { directory, manifest, manifestSha256, reused: false };
|
|
166
183
|
}
|
|
@@ -168,13 +185,43 @@ export class TsPack {
|
|
|
168
185
|
public async verify(directoryArg: string, optionsArg: ITsPackVerifyOptions = {}): Promise<ITsPackResult> {
|
|
169
186
|
const result = await this.readArtifactSet(directoryArg, optionsArg);
|
|
170
187
|
for (const artifact of result.manifest.artifacts) {
|
|
171
|
-
|
|
172
|
-
const { ['tspack.json']: _metadata, ...files } = artifact.files;
|
|
173
|
-
await verifyArchive(file, artifact, bundleMetadata(result.manifest, artifact.id, files));
|
|
188
|
+
await this.verifyRecord(result.directory, result.manifest, artifact);
|
|
174
189
|
}
|
|
175
190
|
return result;
|
|
176
191
|
}
|
|
177
192
|
|
|
193
|
+
private async verifyRecord(directory: string, manifest: ITsPackManifest, artifact: ITsPackArtifact, signal?: AbortSignal): Promise<void> {
|
|
194
|
+
const file = plugins.path.join(directory, artifact.name);
|
|
195
|
+
if (artifact.kind !== 'file') {
|
|
196
|
+
const { ['tspack.json']: _metadata, ...files } = artifact.files;
|
|
197
|
+
await verifyArchive(file, artifact, bundleMetadata(manifest, artifact.id, files), { signal });
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
signal?.throwIfAborted();
|
|
201
|
+
requireValue((await plugins.fs.lstat(file)).isFile(), 'integrity', 'Expected a regular standalone artifact.');
|
|
202
|
+
const handle = await plugins.fs.open(file, plugins.nodeFs.constants.O_RDONLY | plugins.nodeFs.constants.O_NOFOLLOW);
|
|
203
|
+
try {
|
|
204
|
+
const before = await handle.stat({ bigint: true });
|
|
205
|
+
requireValue(before.isFile() && before.size === BigInt(artifact.size), 'integrity', 'Standalone artifact size differs.');
|
|
206
|
+
const hash = plugins.crypto.createHash('sha256');
|
|
207
|
+
let size = 0;
|
|
208
|
+
for await (const chunk of handle.createReadStream({ autoClose: false })) {
|
|
209
|
+
signal?.throwIfAborted();
|
|
210
|
+
size += chunk.length;
|
|
211
|
+
requireValue(size <= artifact.size, 'integrity', 'Standalone artifact grew while reading.');
|
|
212
|
+
hash.update(chunk);
|
|
213
|
+
}
|
|
214
|
+
const after = await handle.stat({ bigint: true });
|
|
215
|
+
const current = await plugins.fs.lstat(file, { bigint: true });
|
|
216
|
+
requireValue(size === artifact.size && hash.digest('hex') === artifact.sha256 && current.isFile() &&
|
|
217
|
+
['dev', 'ino', 'size', 'mtimeNs', 'ctimeNs'].every((key) =>
|
|
218
|
+
before[key as keyof typeof before] === after[key as keyof typeof after] &&
|
|
219
|
+
before[key as keyof typeof before] === current[key as keyof typeof current]),
|
|
220
|
+
'integrity', 'Standalone artifact changed or does not match its identity.');
|
|
221
|
+
signal?.throwIfAborted();
|
|
222
|
+
} finally { await handle.close(); }
|
|
223
|
+
}
|
|
224
|
+
|
|
178
225
|
private async readBundle(directoryArg: string, bundleIdArg: string,
|
|
179
226
|
optionsArg: ITsPackBundleOptions): Promise<{ result: ITsPackBundleResult; signal?: AbortSignal }> {
|
|
180
227
|
object(optionsArg, ['expectedManifestSha256', 'expectedSourceCommit', 'requireRelease', 'signal']);
|
|
@@ -193,9 +240,17 @@ export class TsPack {
|
|
|
193
240
|
optionsArg: ITsPackBundleOptions): Promise<ITsPackBundleResult> {
|
|
194
241
|
const { result, signal } = await this.readBundle(directoryArg, bundleIdArg, optionsArg);
|
|
195
242
|
const { artifact } = result;
|
|
196
|
-
|
|
197
|
-
await
|
|
198
|
-
|
|
243
|
+
requireValue(artifact.kind !== 'file', 'invalid_config', 'Selected artifact is a standalone file, not an archive bundle.');
|
|
244
|
+
await this.verifyRecord(result.directory, result.manifest, artifact, signal);
|
|
245
|
+
signal?.throwIfAborted();
|
|
246
|
+
return result;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/** Verify one selected archive or standalone file against the complete trusted release identity. */
|
|
250
|
+
public async verifyArtifact(directoryArg: string, artifactIdArg: string,
|
|
251
|
+
optionsArg: ITsPackBundleOptions): Promise<ITsPackBundleResult> {
|
|
252
|
+
const { result, signal } = await this.readBundle(directoryArg, artifactIdArg, optionsArg);
|
|
253
|
+
await this.verifyRecord(result.directory, result.manifest, result.artifact, signal);
|
|
199
254
|
signal?.throwIfAborted();
|
|
200
255
|
return result;
|
|
201
256
|
}
|
|
@@ -204,6 +259,7 @@ export class TsPack {
|
|
|
204
259
|
public async extractBundle(directoryArg: string, bundleIdArg: string, parentArg: string,
|
|
205
260
|
optionsArg: ITsPackBundleOptions): Promise<ITsPackExtractResult> {
|
|
206
261
|
const { result, signal } = await this.readBundle(directoryArg, bundleIdArg, optionsArg);
|
|
262
|
+
requireValue(result.artifact.kind !== 'file', 'invalid_config', 'Selected artifact is a standalone file, not an archive bundle.');
|
|
207
263
|
requireValue(typeof parentArg === 'string' && parentArg.length > 0, 'unsafe_input', 'An extraction parent is required.');
|
|
208
264
|
const parent = plugins.path.resolve(this.cwd, parentArg);
|
|
209
265
|
requireValue((await plugins.fs.lstat(parent)).isDirectory() && await plugins.fs.realpath(parent) === parent,
|
package/ts/interfaces.ts
CHANGED
|
@@ -13,12 +13,22 @@ export interface ITsPackBundle {
|
|
|
13
13
|
files: ITsPackFile[];
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
+
/** A named release asset whose bytes are published without an archive wrapper. */
|
|
17
|
+
export interface ITsPackAsset {
|
|
18
|
+
id: string;
|
|
19
|
+
source: string;
|
|
20
|
+
name: string;
|
|
21
|
+
executable?: boolean;
|
|
22
|
+
sha256?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
16
25
|
export interface ITsPackConfig {
|
|
17
26
|
schemaVersion: 1;
|
|
18
27
|
/** Defaults to the package name with its scope separator replaced by a hyphen. */
|
|
19
28
|
name?: string;
|
|
20
29
|
outputDirectory?: string;
|
|
21
30
|
bundles: ITsPackBundle[];
|
|
31
|
+
assets?: ITsPackAsset[];
|
|
22
32
|
}
|
|
23
33
|
|
|
24
34
|
export interface ITsPackOptions {
|
|
@@ -35,6 +45,8 @@ export interface ITsPackFileRecord {
|
|
|
35
45
|
}
|
|
36
46
|
|
|
37
47
|
export interface ITsPackArtifact {
|
|
48
|
+
/** Omitted for v1-compatible tar.gz bundles; explicit for standalone files in v2 sets. */
|
|
49
|
+
kind?: 'file';
|
|
38
50
|
id: string;
|
|
39
51
|
name: string;
|
|
40
52
|
sha256: string;
|
|
@@ -43,7 +55,7 @@ export interface ITsPackArtifact {
|
|
|
43
55
|
}
|
|
44
56
|
|
|
45
57
|
export interface ITsPackManifest {
|
|
46
|
-
format: 'tspack.release.v1';
|
|
58
|
+
format: 'tspack.release.v1' | 'tspack.release.v2';
|
|
47
59
|
packageName: string;
|
|
48
60
|
name: string;
|
|
49
61
|
version: string;
|
package/ts/tspack.cli.ts
CHANGED
|
@@ -36,7 +36,9 @@ export async function runCli(args = process.argv.slice(2)): Promise<void> {
|
|
|
36
36
|
? await pack.verify(directory, { requireRelease: release, expectedManifestSha256 })
|
|
37
37
|
: (() => { throw new TsPackError('arguments', 'Expected pack or verify with its required arguments.'); })();
|
|
38
38
|
console.log(JSON.stringify({ directory: result.directory, manifestSha256: result.manifestSha256,
|
|
39
|
-
publishable: result.manifest.publishable, reused: result.reused,
|
|
39
|
+
publishable: result.manifest.publishable, reused: result.reused,
|
|
40
|
+
bundles: result.manifest.artifacts.filter((artifact) => artifact.kind !== 'file').length,
|
|
41
|
+
assets: result.manifest.artifacts.filter((artifact) => artifact.kind === 'file').length }));
|
|
40
42
|
} catch (error) {
|
|
41
43
|
console.error(error instanceof TsPackError ? `tspack: ${error.code}: ${error.message}` : 'tspack: operation failed.');
|
|
42
44
|
process.exitCode = 1;
|
package/ts/validation.ts
CHANGED
|
@@ -18,6 +18,8 @@ export const isName = (value: unknown): value is string => typeof value === 'str
|
|
|
18
18
|
export const isVersion = (value: unknown): value is string => typeof value === 'string' && value.length <= 64 && /^\d+\.\d+\.\d+(?:-[a-zA-Z0-9.-]+)?$/.test(value);
|
|
19
19
|
export const isPath = (value: unknown): value is string => typeof value === 'string' && value.length <= 240 &&
|
|
20
20
|
/^[a-zA-Z0-9@_+./-]+$/.test(value) && !value.startsWith('/') && value.split('/').every((part) => part && part !== '.' && part !== '..');
|
|
21
|
+
export const isAssetName = (value: unknown): value is string => isPath(value) && !value.includes('/') &&
|
|
22
|
+
!['tspack-manifest.json', 'sha256sums.txt', 'tspack.json'].includes(value.toLowerCase());
|
|
21
23
|
export const jsonBytes = (value: unknown) => Buffer.from(JSON.stringify(value, null, 2) + '\n');
|
|
22
24
|
|
|
23
25
|
export function object(value: unknown, allowed?: readonly string[]): asserts value is Record<string, unknown> {
|
|
@@ -28,13 +30,25 @@ export function object(value: unknown, allowed?: readonly string[]): asserts val
|
|
|
28
30
|
'value' in Object.getOwnPropertyDescriptor(value, key)!), 'invalid_config', 'Unexpected record property.');
|
|
29
31
|
}
|
|
30
32
|
|
|
31
|
-
export function normalizeConfig(value: unknown, packageName: string): Required<ITsPackConfig> {
|
|
32
|
-
object(value, ['schemaVersion', 'name', 'outputDirectory', 'bundles']);
|
|
33
|
+
export function normalizeConfig(value: unknown, packageName: string): Omit<Required<ITsPackConfig>, 'assets'> & Pick<ITsPackConfig, 'assets'> {
|
|
34
|
+
object(value, ['schemaVersion', 'name', 'outputDirectory', 'bundles', 'assets']);
|
|
33
35
|
const name = value.name ?? packageName.replace(/^@/, '').replace('/', '-');
|
|
34
36
|
const outputDirectory = value.outputDirectory ?? 'dist_pack';
|
|
35
37
|
requireValue(value.schemaVersion === 1 && isName(name) && isPath(outputDirectory) &&
|
|
36
|
-
Array.isArray(value.bundles) && value.bundles.length
|
|
38
|
+
Array.isArray(value.bundles) && value.bundles.length <= 128 &&
|
|
39
|
+
(!Object.hasOwn(value, 'assets') || Array.isArray(value.assets)),
|
|
37
40
|
'invalid_config', 'Invalid tspack configuration.');
|
|
41
|
+
const assetInputs = (value.assets ?? []) as unknown[];
|
|
42
|
+
requireValue(assetInputs.length + value.bundles.length > 0 && assetInputs.length + value.bundles.length <= 128,
|
|
43
|
+
'invalid_config', 'A release requires between one and 128 artifacts.');
|
|
44
|
+
const assets = assetInputs.map((asset) => {
|
|
45
|
+
object(asset, ['id', 'source', 'name', 'executable', 'sha256']);
|
|
46
|
+
requireValue(isName(asset.id) && isPath(asset.source) && isAssetName(asset.name) &&
|
|
47
|
+
(!Object.hasOwn(asset, 'executable') || typeof asset.executable === 'boolean') &&
|
|
48
|
+
(!Object.hasOwn(asset, 'sha256') || isDigest(asset.sha256)), 'invalid_config', 'Invalid standalone asset.');
|
|
49
|
+
return { id: asset.id, source: asset.source, name: asset.name, executable: asset.executable === true,
|
|
50
|
+
...(asset.sha256 ? { sha256: asset.sha256 as string } : {}) };
|
|
51
|
+
}).sort((a, b) => a.id.localeCompare(b.id, 'en'));
|
|
38
52
|
let count = 0;
|
|
39
53
|
const bundles = value.bundles.map((bundle: unknown) => {
|
|
40
54
|
object(bundle, ['id', 'files']);
|
|
@@ -54,9 +68,12 @@ export function normalizeConfig(value: unknown, packageName: string): Required<I
|
|
|
54
68
|
'invalid_config', 'Bundle paths collide.');
|
|
55
69
|
return { id: bundle.id, files };
|
|
56
70
|
}).sort((a, b) => a.id.localeCompare(b.id, 'en'));
|
|
57
|
-
|
|
71
|
+
const ids = [...bundles, ...assets].map((artifact) => artifact.id);
|
|
72
|
+
requireValue(count + assets.length <= limits.files && new Set(ids).size === ids.length &&
|
|
73
|
+
new Set(assets.map((asset) => asset.name.toLowerCase())).size === assets.length,
|
|
58
74
|
'invalid_config', 'Too many files or duplicate bundle identifiers.');
|
|
59
|
-
|
|
75
|
+
// Omit an empty extension so archive-only v1 configuration hashes remain unchanged.
|
|
76
|
+
return { schemaVersion: 1, name, outputDirectory, bundles, ...(assets.length ? { assets } : {}) };
|
|
60
77
|
}
|
|
61
78
|
|
|
62
79
|
export function validateFileRecord(value: unknown): asserts value is ITsPackFileRecord {
|
|
@@ -68,7 +85,7 @@ export function validateFileRecord(value: unknown): asserts value is ITsPackFile
|
|
|
68
85
|
|
|
69
86
|
export function validateManifest(value: unknown): asserts value is ITsPackManifest {
|
|
70
87
|
object(value, ['format', 'packageName', 'name', 'version', 'sourceCommit', 'sourceDirty', 'publishable', 'configurationSha256', 'artifacts']);
|
|
71
|
-
requireValue(
|
|
88
|
+
requireValue(['tspack.release.v1', 'tspack.release.v2'].includes(value.format as string) && typeof value.packageName === 'string' && value.packageName.length <= 214 &&
|
|
72
89
|
isName(value.name) && isVersion(value.version) && isCommit(value.sourceCommit) &&
|
|
73
90
|
typeof value.sourceDirty === 'boolean' && typeof value.publishable === 'boolean' &&
|
|
74
91
|
(!value.publishable || !value.sourceDirty) && isDigest(value.configurationSha256) &&
|
|
@@ -78,16 +95,30 @@ export function validateManifest(value: unknown): asserts value is ITsPackManife
|
|
|
78
95
|
const names = new Set();
|
|
79
96
|
let total = 0;
|
|
80
97
|
let count = 0;
|
|
98
|
+
let standaloneCount = 0;
|
|
81
99
|
for (const artifact of value.artifacts) {
|
|
82
|
-
object(artifact, ['id', 'name', 'sha256', 'size', 'files']);
|
|
100
|
+
object(artifact, ['id', 'name', 'sha256', 'size', 'files', ...(value.format === 'tspack.release.v2' ? ['kind'] : [])]);
|
|
101
|
+
requireValue(!Object.hasOwn(artifact, 'kind') || artifact.kind === 'file', 'invalid_manifest', 'Invalid artifact kind.');
|
|
102
|
+
const standalone = artifact.kind === 'file';
|
|
83
103
|
requireValue(isName(artifact.id) && !ids.has(artifact.id) &&
|
|
84
|
-
isPath(artifact.name) && artifact.name === `${value.name}-${value.version}-${artifact.id}.tar.gz`
|
|
104
|
+
isPath(artifact.name) && (standalone ? isAssetName(artifact.name) : artifact.name === `${value.name}-${value.version}-${artifact.id}.tar.gz`) &&
|
|
105
|
+
!names.has(artifact.name.toLowerCase()) &&
|
|
85
106
|
isDigest(artifact.sha256) && typeof artifact.size === 'number' && Number.isSafeInteger(artifact.size) &&
|
|
86
|
-
artifact.size
|
|
87
|
-
|
|
107
|
+
(standalone ? artifact.size >= 0 && artifact.size <= limits.file : artifact.size > 0 && artifact.size <= limits.total),
|
|
108
|
+
'invalid_manifest', 'Invalid artifact identity.');
|
|
109
|
+
ids.add(artifact.id); names.add(artifact.name.toLowerCase());
|
|
88
110
|
object(artifact.files);
|
|
89
111
|
const fileRecords = artifact.files;
|
|
90
112
|
const paths = Object.keys(fileRecords);
|
|
113
|
+
if (standalone) {
|
|
114
|
+
standaloneCount++;
|
|
115
|
+
requireValue(paths.length === 1 && paths[0] === artifact.name, 'invalid_manifest', 'A standalone asset requires its exact file record.');
|
|
116
|
+
const record = fileRecords[artifact.name];
|
|
117
|
+
validateFileRecord(record);
|
|
118
|
+
requireValue(record.sha256 === artifact.sha256 && record.size === artifact.size, 'invalid_manifest', 'Standalone file identities disagree.');
|
|
119
|
+
total += record.size; count++;
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
91
122
|
requireValue(Object.hasOwn(artifact.files, 'tspack.json') && paths.length > 1,
|
|
92
123
|
'invalid_manifest', 'Bundle metadata or selected files are missing.');
|
|
93
124
|
requireValue(paths.every((name) => name.split('/').slice(0, -1).every((_part, index, parents) =>
|
|
@@ -99,6 +130,7 @@ export function validateManifest(value: unknown): asserts value is ITsPackManife
|
|
|
99
130
|
total += record.size; count++;
|
|
100
131
|
}
|
|
101
132
|
}
|
|
133
|
+
requireValue(value.format === 'tspack.release.v1' || standaloneCount > 0, 'invalid_manifest', 'Manifest v2 requires a standalone asset.');
|
|
102
134
|
requireValue(total <= limits.total && count <= limits.files + 128, 'invalid_manifest', 'Artifact set exceeds its limits.');
|
|
103
135
|
}
|
|
104
136
|
|
package/readme.plan.md
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
# tspack implementation
|
|
2
|
-
|
|
3
|
-
Create the shared owner for packaging existing executables and supporting assets.
|
|
4
|
-
TsDeno and TsRust retain compilation; GitZone and CI retain publication. Pallet
|
|
5
|
-
will consume the published tool instead of maintaining its own archive scripts.
|
|
6
|
-
|
|
7
|
-
- Expose a typed TsPack API and `tspack pack` / `tspack verify` CLI, configured
|
|
8
|
-
under `@git.zone/tspack` in `.smartconfig.json`.
|
|
9
|
-
- Package explicit file sets into deterministic streaming tar.gz bundles using
|
|
10
|
-
SmartArchive's public streaming API. Preserve executable roles, hash every file,
|
|
11
|
-
reject unsafe paths and changed inputs, and publish output directories atomically.
|
|
12
|
-
- Record package/version, Git source identity, configuration identity, bundle
|
|
13
|
-
contents and archive hashes in a sealed artifact set. Release mode requires a
|
|
14
|
-
clean matching tag; development artifacts remain explicitly unpublishable.
|
|
15
|
-
- Verify both archive bytes and every declared member without extracting paths.
|
|
16
|
-
Reuse a retained sealed release set only after verification; never substitute
|
|
17
|
-
freshly rebuilt bytes into an existing immutable release.
|
|
18
|
-
- Include only explicitly selected assets/notices. Do not automatically disclose
|
|
19
|
-
application source, vendor dependency trees or rebuild runtimes for LGPL.
|
|
20
|
-
- Test real archives, deterministic repacking, corruption, unsafe paths, closed
|
|
21
|
-
file sets, stale/dirty release identities and retained-output reuse. Build and
|
|
22
|
-
type-check directly, run stable checker gates, release the tool, then consume it.
|
|
23
|
-
|
|
24
|
-
Global policy now accepts LGPL; its specific obligations remain separate from
|
|
25
|
-
license acceptance. The previous Pallet runtime-reconstruction experiment was
|
|
26
|
-
stopped and its uncommitted distribution prototype removed from active source.
|