@vertesia/memory 0.24.0-dev.202601221707
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/LICENSE +13 -0
- package/README.md +473 -0
- package/lib/cjs/Builder.js +186 -0
- package/lib/cjs/Builder.js.map +1 -0
- package/lib/cjs/ContentObject.js +114 -0
- package/lib/cjs/ContentObject.js.map +1 -0
- package/lib/cjs/ContentSource.js +82 -0
- package/lib/cjs/ContentSource.js.map +1 -0
- package/lib/cjs/MemoryPack.js +228 -0
- package/lib/cjs/MemoryPack.js.map +1 -0
- package/lib/cjs/MemoryPackBuilder.js +47 -0
- package/lib/cjs/MemoryPackBuilder.js.map +1 -0
- package/lib/cjs/commands/copy.js +53 -0
- package/lib/cjs/commands/copy.js.map +1 -0
- package/lib/cjs/commands/exec.js +82 -0
- package/lib/cjs/commands/exec.js.map +1 -0
- package/lib/cjs/index.js +28 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/cjs/package.json +3 -0
- package/lib/cjs/utils/cmdline.js +90 -0
- package/lib/cjs/utils/cmdline.js.map +1 -0
- package/lib/cjs/utils/rewrite.js +166 -0
- package/lib/cjs/utils/rewrite.js.map +1 -0
- package/lib/cjs/utils/stream.js +27 -0
- package/lib/cjs/utils/stream.js.map +1 -0
- package/lib/cjs/utils/tar.js +185 -0
- package/lib/cjs/utils/tar.js.map +1 -0
- package/lib/esm/Builder.js +178 -0
- package/lib/esm/Builder.js.map +1 -0
- package/lib/esm/ContentObject.js +103 -0
- package/lib/esm/ContentObject.js.map +1 -0
- package/lib/esm/ContentSource.js +75 -0
- package/lib/esm/ContentSource.js.map +1 -0
- package/lib/esm/MemoryPack.js +218 -0
- package/lib/esm/MemoryPack.js.map +1 -0
- package/lib/esm/MemoryPackBuilder.js +43 -0
- package/lib/esm/MemoryPackBuilder.js.map +1 -0
- package/lib/esm/commands/copy.js +50 -0
- package/lib/esm/commands/copy.js.map +1 -0
- package/lib/esm/commands/exec.js +75 -0
- package/lib/esm/commands/exec.js.map +1 -0
- package/lib/esm/index.js +7 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/utils/cmdline.js +86 -0
- package/lib/esm/utils/cmdline.js.map +1 -0
- package/lib/esm/utils/rewrite.js +161 -0
- package/lib/esm/utils/rewrite.js.map +1 -0
- package/lib/esm/utils/stream.js +23 -0
- package/lib/esm/utils/stream.js.map +1 -0
- package/lib/esm/utils/tar.js +175 -0
- package/lib/esm/utils/tar.js.map +1 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/lib/types/Builder.d.ts +72 -0
- package/lib/types/Builder.d.ts.map +1 -0
- package/lib/types/ContentObject.d.ts +43 -0
- package/lib/types/ContentObject.d.ts.map +1 -0
- package/lib/types/ContentSource.d.ts +32 -0
- package/lib/types/ContentSource.d.ts.map +1 -0
- package/lib/types/MemoryPack.d.ts +46 -0
- package/lib/types/MemoryPack.d.ts.map +1 -0
- package/lib/types/MemoryPackBuilder.d.ts +18 -0
- package/lib/types/MemoryPackBuilder.d.ts.map +1 -0
- package/lib/types/commands/copy.d.ts +8 -0
- package/lib/types/commands/copy.d.ts.map +1 -0
- package/lib/types/commands/exec.d.ts +7 -0
- package/lib/types/commands/exec.d.ts.map +1 -0
- package/lib/types/index.d.ts +14 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/utils/cmdline.d.ts +10 -0
- package/lib/types/utils/cmdline.d.ts.map +1 -0
- package/lib/types/utils/rewrite.d.ts +38 -0
- package/lib/types/utils/rewrite.d.ts.map +1 -0
- package/lib/types/utils/stream.d.ts +9 -0
- package/lib/types/utils/stream.d.ts.map +1 -0
- package/lib/types/utils/tar.d.ts +40 -0
- package/lib/types/utils/tar.d.ts.map +1 -0
- package/package.json +53 -0
- package/src/Builder.ts +239 -0
- package/src/ContentObject.ts +114 -0
- package/src/ContentSource.ts +88 -0
- package/src/MemoryPack.ts +233 -0
- package/src/MemoryPackBuilder.ts +55 -0
- package/src/builder.test.ts +214 -0
- package/src/commands/copy.ts +53 -0
- package/src/commands/exec.test.ts +22 -0
- package/src/commands/exec.ts +83 -0
- package/src/index.ts +14 -0
- package/src/utils/cmdline.test.ts +32 -0
- package/src/utils/cmdline.ts +92 -0
- package/src/utils/rewrite.test.ts +65 -0
- package/src/utils/rewrite.ts +167 -0
- package/src/utils/stream.test.ts +13 -0
- package/src/utils/stream.ts +27 -0
- package/src/utils/tar.test.ts +48 -0
- package/src/utils/tar.ts +203 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { DocxObject, MediaObject, PdfObject } from "../ContentObject.js";
|
|
2
|
+
import { AbstractContentSource, FileSource } from "../ContentSource.js";
|
|
3
|
+
import { createPathRewrite } from "../utils/rewrite.js";
|
|
4
|
+
function rewritePath(source, index, mapper) {
|
|
5
|
+
const path = source instanceof FileSource ? source.file : '';
|
|
6
|
+
return mapper(path, index);
|
|
7
|
+
}
|
|
8
|
+
export function copy(builder, source, toPath, options = {}) {
|
|
9
|
+
const resolved = AbstractContentSource.resolve(source);
|
|
10
|
+
const mapperFn = createPathRewrite(toPath);
|
|
11
|
+
if (Array.isArray(resolved)) {
|
|
12
|
+
for (let i = 0, l = resolved.length; i < l; i++) {
|
|
13
|
+
const cs = resolved[i];
|
|
14
|
+
copyOne(builder, cs, rewritePath(cs, i, mapperFn), options);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
return copyOne(builder, resolved, rewritePath(resolved, 0, mapperFn), options);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function copyOne(builder, source, toPath, options) {
|
|
22
|
+
if (options.media) {
|
|
23
|
+
new MediaObject(builder, source, options.media).copyTo(toPath);
|
|
24
|
+
}
|
|
25
|
+
else if (options.extractText) {
|
|
26
|
+
let type = options.extractText;
|
|
27
|
+
if (typeof type === "boolean") {
|
|
28
|
+
if (source instanceof FileSource) {
|
|
29
|
+
type = source.extname ? source.extname.slice(1) : source.extname;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
throw new Error("source type for extractText must be specified");
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
switch (type) {
|
|
36
|
+
case "pdf":
|
|
37
|
+
new PdfObject(builder, source).copyTo(toPath);
|
|
38
|
+
break;
|
|
39
|
+
case "docx":
|
|
40
|
+
new DocxObject(builder, source).copyTo(toPath);
|
|
41
|
+
break;
|
|
42
|
+
default:
|
|
43
|
+
throw new Error("Unsupported extractText type: " + type);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
builder.addEntry(toPath, source);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=copy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.js","sourceRoot":"","sources":["../../../src/commands/copy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAgB,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,qBAAqB,EAAiB,UAAU,EAAc,MAAM,qBAAqB,CAAC;AACnG,OAAO,EAAE,iBAAiB,EAAgB,MAAM,qBAAqB,CAAC;AAEtE,SAAS,WAAW,CAAC,MAAqB,EAAE,KAAa,EAAE,MAAoB;IAC3E,MAAM,IAAI,GAAG,MAAM,YAAY,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC/B,CAAC;AAMD,MAAM,UAAU,IAAI,CAAC,OAAgB,EAAE,MAAkB,EAAE,MAAc,EAAE,UAAuB,EAAE;IAChG,MAAM,QAAQ,GAAG,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACvB,OAAO,CAAC,OAAO,EAAE,EAAE,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;QAChE,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,OAAO,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;IACnF,CAAC;AACL,CAAC;AAED,SAAS,OAAO,CAAC,OAAgB,EAAE,MAAqB,EAAE,MAAc,EAAE,OAAoB;IAC1F,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,IAAI,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnE,CAAC;SAAM,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QAC7B,IAAI,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC;QAC/B,IAAI,OAAO,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,MAAM,YAAY,UAAU,EAAE,CAAC;gBAC/B,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YACrE,CAAC;iBAAM,CAAC;gBACJ,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;YACrE,CAAC;QACL,CAAC;QACD,QAAQ,IAAI,EAAE,CAAC;YACX,KAAK,KAAK;gBACN,IAAI,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC9C,MAAM;YACV,KAAK,MAAM;gBACP,IAAI,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC/C,MAAM;YACV;gBACI,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,IAAI,CAAC,CAAC;QACjE,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import { splitPipeCommands } from '../utils/cmdline.js';
|
|
4
|
+
import { BufferWritableStream } from '../utils/stream.js';
|
|
5
|
+
export async function exec(commandLine, options = {}) {
|
|
6
|
+
const verbose = !options.quiet;
|
|
7
|
+
commandLine = commandLine.trim();
|
|
8
|
+
const { commands, out } = splitPipeCommands(commandLine);
|
|
9
|
+
if (!commands.length) {
|
|
10
|
+
throw new Error('Invalid command line. No command: ' + commandLine);
|
|
11
|
+
}
|
|
12
|
+
let outStream;
|
|
13
|
+
if (out) {
|
|
14
|
+
outStream = fs.createWriteStream(out, { flags: 'w' });
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
outStream = new BufferWritableStream();
|
|
18
|
+
}
|
|
19
|
+
const pipePromise = executePipe(commands, outStream, verbose);
|
|
20
|
+
const outPromise = new Promise((resolve, reject) => {
|
|
21
|
+
outStream.on('finish', () => {
|
|
22
|
+
resolve(undefined);
|
|
23
|
+
});
|
|
24
|
+
outStream.on('error', (err) => {
|
|
25
|
+
reject(err);
|
|
26
|
+
outStream.destroy();
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
const [status] = await Promise.all([pipePromise, outPromise]);
|
|
30
|
+
if (verbose) {
|
|
31
|
+
if (!status) {
|
|
32
|
+
console.log(`Command: ${commandLine} exited with status ${status}`);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
console.error(`Command: ${commandLine} exited with status ${status}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (outStream instanceof BufferWritableStream) {
|
|
39
|
+
return outStream.getText();
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export function executePipe(commands, finalOutput, verbose = false) {
|
|
46
|
+
return new Promise((resolve, reject) => {
|
|
47
|
+
let input;
|
|
48
|
+
let child;
|
|
49
|
+
for (const cmd of commands) {
|
|
50
|
+
verbose && console.log(`Running: ${cmd.name} ${cmd.args?.join(' ')}`);
|
|
51
|
+
child = spawn(cmd.name, cmd.args, {
|
|
52
|
+
// in, out, err
|
|
53
|
+
stdio: ['pipe', 'pipe', 'inherit'],
|
|
54
|
+
});
|
|
55
|
+
if (input) {
|
|
56
|
+
input.pipe(child.stdin);
|
|
57
|
+
}
|
|
58
|
+
input = child.stdout;
|
|
59
|
+
child.on("error", (err) => {
|
|
60
|
+
console.error(`Failed to run ${cmd.name}`, err);
|
|
61
|
+
reject(err);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
if (child) {
|
|
65
|
+
child.on("exit", (code, signal) => {
|
|
66
|
+
resolve(code !== null ? code : signal);
|
|
67
|
+
});
|
|
68
|
+
finalOutput && child.stdout?.pipe(finalOutput);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
reject(new Error("no child spawned"));
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=exec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../../src/commands/exec.ts"],"names":[],"mappings":"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"}
|
package/lib/esm/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { Builder, buildMemoryPack } from "./Builder.js";
|
|
2
|
+
export { ContentObject, DocxObject, JsonObject, MediaObject, PdfObject } from "./ContentObject.js";
|
|
3
|
+
export { AbstractContentSource, BufferSource, FileSource, TextSource } from "./ContentSource.js";
|
|
4
|
+
export { MemoryEntry, TarMemoryPack, loadMemoryPack } from "./MemoryPack.js";
|
|
5
|
+
export { MemoryPackBuilder } from "./MemoryPackBuilder.js";
|
|
6
|
+
export { TarBuilder, TarIndex, loadTarIndex } from './utils/tar.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAIvD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAElG,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEhG,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAE5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAE1D,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
function readWord(text, index) {
|
|
2
|
+
let i = index, len = text.length;
|
|
3
|
+
while (i < len && (text[i] !== ' ' || text[i] !== '\t')) {
|
|
4
|
+
const c = text[i];
|
|
5
|
+
if (c === ' ' || c === '\t') {
|
|
6
|
+
return [text.substring(index, i), i];
|
|
7
|
+
}
|
|
8
|
+
i++;
|
|
9
|
+
}
|
|
10
|
+
return [text.substring(index), len];
|
|
11
|
+
}
|
|
12
|
+
function readQuotedArg(text, index, quote) {
|
|
13
|
+
let i = index, len = text.length;
|
|
14
|
+
while (i < len) {
|
|
15
|
+
const c = text[i];
|
|
16
|
+
if (c === '\\') {
|
|
17
|
+
i += 2;
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
else if (c === quote) {
|
|
21
|
+
return [text.substring(index, i), i + 1];
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
i++;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return [text.substring(index), len];
|
|
28
|
+
}
|
|
29
|
+
export function splitCommandLine(text) {
|
|
30
|
+
const args = [];
|
|
31
|
+
let i = 0, len = text.length;
|
|
32
|
+
while (i < len) {
|
|
33
|
+
let c = text[i];
|
|
34
|
+
if (c === ' ' || c === '\t') {
|
|
35
|
+
i++; // skip whitespace
|
|
36
|
+
}
|
|
37
|
+
else if (c === '"' || c === "'") {
|
|
38
|
+
const [word, offset] = readQuotedArg(text, i + 1, c);
|
|
39
|
+
i = offset;
|
|
40
|
+
args.push(word);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
const [word, offset] = readWord(text, i);
|
|
44
|
+
i = offset;
|
|
45
|
+
args.push(word);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return args;
|
|
49
|
+
}
|
|
50
|
+
export function splitPipeCommands(text) {
|
|
51
|
+
const tokens = splitCommandLine(text);
|
|
52
|
+
const commands = [];
|
|
53
|
+
let args = [];
|
|
54
|
+
for (const token of tokens) {
|
|
55
|
+
if (token === "|") {
|
|
56
|
+
if (args.length < 1) {
|
|
57
|
+
throw new Error("Invalid pipe character. Expecting a command first.");
|
|
58
|
+
}
|
|
59
|
+
const name = args.shift();
|
|
60
|
+
commands.push({
|
|
61
|
+
name,
|
|
62
|
+
args
|
|
63
|
+
});
|
|
64
|
+
args = [];
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
args.push(token);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
let out;
|
|
71
|
+
if (args.length > 0) {
|
|
72
|
+
const name = args.shift();
|
|
73
|
+
if (args.length > 1 && args[args.length - 2] === ">") {
|
|
74
|
+
out = args.pop();
|
|
75
|
+
args.pop(); // remove the ">"
|
|
76
|
+
}
|
|
77
|
+
commands.push({
|
|
78
|
+
name,
|
|
79
|
+
args
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
commands, out
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=cmdline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cmdline.js","sourceRoot":"","sources":["../../../src/utils/cmdline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { basename, dirname, extname, join } from "path";
|
|
2
|
+
export function createPathRewrite(path) {
|
|
3
|
+
let truncPath;
|
|
4
|
+
let basePath = '';
|
|
5
|
+
let index = path.indexOf('!');
|
|
6
|
+
if (index > -1) {
|
|
7
|
+
basePath = path.substring(0, index);
|
|
8
|
+
if (!basePath.endsWith('/')) {
|
|
9
|
+
basePath += '/';
|
|
10
|
+
}
|
|
11
|
+
truncPath = (path) => {
|
|
12
|
+
return path.substring(basePath.length);
|
|
13
|
+
};
|
|
14
|
+
path = path.substring(index + 1);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
truncPath = (path) => {
|
|
18
|
+
return basename(path);
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
if (path === '*') {
|
|
22
|
+
// preserve path
|
|
23
|
+
return truncPath;
|
|
24
|
+
}
|
|
25
|
+
else if (path.endsWith("/*")) {
|
|
26
|
+
const prefix = path.slice(0, -2);
|
|
27
|
+
return (path) => {
|
|
28
|
+
path = truncPath(path);
|
|
29
|
+
return join(prefix, path);
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
// use path builder
|
|
34
|
+
return buildPathRewrite(path, truncPath);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const RX_PARTS = /(%d\/)|(\.?%e)|(%[fnip])/g;
|
|
38
|
+
function buildPathRewrite(path, truncPath) {
|
|
39
|
+
let parts = [];
|
|
40
|
+
let m;
|
|
41
|
+
let lastIndex = 0;
|
|
42
|
+
while (m = RX_PARTS.exec(path)) {
|
|
43
|
+
if (m.index > lastIndex) {
|
|
44
|
+
const literal = path.substring(lastIndex, m.index);
|
|
45
|
+
parts.push(() => literal);
|
|
46
|
+
}
|
|
47
|
+
if (m[1]) { // %d/
|
|
48
|
+
parts.push((path) => path.dirname ? path.dirname + '/' : '');
|
|
49
|
+
}
|
|
50
|
+
else if (m[2]) { // .?%e
|
|
51
|
+
if (m[2][0] === '.') {
|
|
52
|
+
parts.push((path) => path.extname || '');
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
parts.push((path) => path.extname ? path.extname.slice(1) : ''); // extension without dot
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else if (m[3]) {
|
|
59
|
+
switch (m[3]) {
|
|
60
|
+
case '%f':
|
|
61
|
+
parts.push((path) => path.name);
|
|
62
|
+
break;
|
|
63
|
+
case '%n':
|
|
64
|
+
parts.push((path) => path.basename);
|
|
65
|
+
break;
|
|
66
|
+
case '%p': // stringify the path by replacing / with _
|
|
67
|
+
parts.push((path) => {
|
|
68
|
+
let p = path.value;
|
|
69
|
+
if (p.startsWith('/')) {
|
|
70
|
+
p = p.substring(1);
|
|
71
|
+
}
|
|
72
|
+
return p.replaceAll('/', '_');
|
|
73
|
+
});
|
|
74
|
+
break;
|
|
75
|
+
case '%i': // index
|
|
76
|
+
parts.push((_path, index) => String(index));
|
|
77
|
+
break;
|
|
78
|
+
default: throw new Error(`Bug: should never happen`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
lastIndex = m.index + m[0].length;
|
|
82
|
+
}
|
|
83
|
+
if (!parts.length) {
|
|
84
|
+
return () => path;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
if (lastIndex < path.length) {
|
|
88
|
+
const literal = path.substring(lastIndex);
|
|
89
|
+
parts.push(() => literal);
|
|
90
|
+
}
|
|
91
|
+
return (path, index) => {
|
|
92
|
+
const pathObj = new Path(truncPath(path));
|
|
93
|
+
const out = [];
|
|
94
|
+
for (const part of parts) {
|
|
95
|
+
out.push(part(pathObj, index));
|
|
96
|
+
}
|
|
97
|
+
return out.join('');
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export class Path {
|
|
102
|
+
_name;
|
|
103
|
+
_extname;
|
|
104
|
+
_dirname;
|
|
105
|
+
_basename;
|
|
106
|
+
/**
|
|
107
|
+
* The complete path value
|
|
108
|
+
*/
|
|
109
|
+
value;
|
|
110
|
+
/**
|
|
111
|
+
* The file name (the last portion of the path). Includes the extension if present.
|
|
112
|
+
*/
|
|
113
|
+
get name() {
|
|
114
|
+
if (!this._name) {
|
|
115
|
+
this._name = basename(this.value);
|
|
116
|
+
}
|
|
117
|
+
return this._name;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* The extension of the file including the leading '.'.
|
|
121
|
+
* An empty string if the file has no extension.
|
|
122
|
+
*/
|
|
123
|
+
get extname() {
|
|
124
|
+
if (!this._extname) {
|
|
125
|
+
this._extname = extname(this.value);
|
|
126
|
+
}
|
|
127
|
+
return this._extname;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* The directory portion of the path. Doesn't include the trailing slash.
|
|
131
|
+
* If no directory is present, returns an empty string.
|
|
132
|
+
*/
|
|
133
|
+
get dirname() {
|
|
134
|
+
if (!this._dirname) {
|
|
135
|
+
this._dirname = dirname(this.value);
|
|
136
|
+
if (this._dirname === '.') {
|
|
137
|
+
this._dirname = '';
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return this._dirname;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* The path without the extension
|
|
144
|
+
*/
|
|
145
|
+
get basename() {
|
|
146
|
+
if (!this._basename) {
|
|
147
|
+
this._basename = this.extname ? this.name.slice(0, -this.extname.length) : this.name;
|
|
148
|
+
}
|
|
149
|
+
return this._basename;
|
|
150
|
+
}
|
|
151
|
+
constructor(value) {
|
|
152
|
+
this.value = value;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Return the complete path value (same as `value`)
|
|
156
|
+
*/
|
|
157
|
+
toString() {
|
|
158
|
+
return this.value;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=rewrite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rewrite.js","sourceRoot":"","sources":["../../../src/utils/rewrite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Writable } from "stream";
|
|
2
|
+
export class BufferWritableStream extends Writable {
|
|
3
|
+
chunks = [];
|
|
4
|
+
buffer;
|
|
5
|
+
// _write method is required to handle the incoming data
|
|
6
|
+
_write(chunk, _encoding, callback) {
|
|
7
|
+
this.chunks.push(chunk); // Collect the chunk into the array
|
|
8
|
+
callback(); // Indicate that the write is complete
|
|
9
|
+
}
|
|
10
|
+
// Optional _final method is called when the stream is ending
|
|
11
|
+
_final(callback) {
|
|
12
|
+
this.buffer = Buffer.concat(this.chunks); // Concatenate the collected chunks into a buffer
|
|
13
|
+
callback(); // Indicate the stream is finished
|
|
14
|
+
}
|
|
15
|
+
// Method to get the final buffer when the stream is closed
|
|
16
|
+
getBuffer() {
|
|
17
|
+
return this.buffer;
|
|
18
|
+
}
|
|
19
|
+
getText(encoding = "utf-8") {
|
|
20
|
+
return this.buffer?.toString(encoding);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../src/utils/stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,MAAM,OAAO,oBAAqB,SAAQ,QAAQ;IAC9C,MAAM,GAAa,EAAE,CAAA;IACrB,MAAM,CAAqB;IAE3B,wDAAwD;IACxD,MAAM,CAAC,KAAa,EAAE,SAAyB,EAAE,QAAwC;QACrF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,mCAAmC;QAC5D,QAAQ,EAAE,CAAC,CAAC,sCAAsC;IACtD,CAAC;IAED,6DAA6D;IAC7D,MAAM,CAAC,QAAwC;QAC3C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,iDAAiD;QAC3F,QAAQ,EAAE,CAAC,CAAC,kCAAkC;IAClD,CAAC;IAED,2DAA2D;IAC3D,SAAS;QACL,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,OAAO,CAAC,WAA2B,OAAO;QACtC,OAAO,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;CACJ"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import { open } from "fs/promises";
|
|
3
|
+
import { pipeline } from "stream/promises";
|
|
4
|
+
import tar from "tar-stream";
|
|
5
|
+
import zlib from "zlib";
|
|
6
|
+
export class TarBuilder {
|
|
7
|
+
pack;
|
|
8
|
+
indexData = [];
|
|
9
|
+
currentOffset = 0;
|
|
10
|
+
tarPromise;
|
|
11
|
+
constructor(file) {
|
|
12
|
+
const pack = tar.pack(); // Create a new tar stream
|
|
13
|
+
this.pack = pack;
|
|
14
|
+
// Open the output file as a write stream
|
|
15
|
+
const outputStream = fs.createWriteStream(file);
|
|
16
|
+
if (file.endsWith('.gz')) {
|
|
17
|
+
this.tarPromise = pipeline(pack, zlib.createGzip(), outputStream);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
this.tarPromise = pipeline(pack, outputStream);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
async add(name, content) {
|
|
24
|
+
name = normalizePath(name);
|
|
25
|
+
// Calculate header size, 512 bytes for tar headers
|
|
26
|
+
const headerSize = 512;
|
|
27
|
+
const contentSize = content ? Buffer.byteLength(content) : 0;
|
|
28
|
+
const entryHeaderOffset = this.currentOffset;
|
|
29
|
+
// Store the index entry
|
|
30
|
+
// entry data offset is always at header offset + 512 bytes
|
|
31
|
+
if (contentSize > 0) { // do not index directories
|
|
32
|
+
this.indexData.push(`${name}:${entryHeaderOffset},${contentSize}`);
|
|
33
|
+
}
|
|
34
|
+
// Add the file entry to the tar stream
|
|
35
|
+
this.pack.entry({ name, size: contentSize }, content);
|
|
36
|
+
// Update the offset
|
|
37
|
+
this.currentOffset += headerSize + contentSize;
|
|
38
|
+
// Tar files are padded to 512-byte boundaries
|
|
39
|
+
if (contentSize % 512 !== 0) {
|
|
40
|
+
this.currentOffset += 512 - (contentSize % 512);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async build() {
|
|
44
|
+
const pack = this.pack;
|
|
45
|
+
// Convert index data to string and calculate its size
|
|
46
|
+
const indexContent = this.indexData.join('\n') + '\n';
|
|
47
|
+
const indexContentSize = Buffer.byteLength(indexContent);
|
|
48
|
+
// Add the .index entry to the tar
|
|
49
|
+
pack.entry({ name: '.index', size: indexContentSize }, indexContent);
|
|
50
|
+
pack.finalize(); // Finalize the tar stream
|
|
51
|
+
await this.tarPromise;
|
|
52
|
+
}
|
|
53
|
+
destroy() {
|
|
54
|
+
this.pack.destroy();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export async function loadTarIndex(tarFile) {
|
|
58
|
+
const fd = await open(tarFile, 'r');
|
|
59
|
+
try {
|
|
60
|
+
return await readTarIndex(fd);
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
await fd.close();
|
|
64
|
+
throw err;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async function readTarIndex(fd) {
|
|
68
|
+
const stats = await fd.stat();
|
|
69
|
+
const size = stats.size;
|
|
70
|
+
// we want to find the index header.
|
|
71
|
+
// we read the last chunks of 512 until we find the file name followed by a 0 char.
|
|
72
|
+
// the tar file ends with a segment of 1024 bytes of 0 so we need to skip that.
|
|
73
|
+
// we pick a size for the buffer to also include the file size entry from the header. So the buffer should be
|
|
74
|
+
// of 100 + 8 + 8 + 8 + 12 bytes = 124 + 12 bytes = 136 bytes
|
|
75
|
+
// the file size will be located at offset 124 and is 12 bytes long
|
|
76
|
+
// skip 1024 0 bytes then skip another 1024 bytes to find the first possible location of the index header (512 bytes for content and 512 bytes for the header)
|
|
77
|
+
let offset = size - 1024 - 1024;
|
|
78
|
+
const buffer = Buffer.alloc(512);
|
|
79
|
+
while (offset >= 0) {
|
|
80
|
+
await fd.read(buffer, 0, 512, offset);
|
|
81
|
+
// remove the 0 byte padding
|
|
82
|
+
const fileName = buffer.toString('utf-8', 0, 100);
|
|
83
|
+
if (fileName.startsWith('.index\0')) {
|
|
84
|
+
// we found the index header
|
|
85
|
+
const indexSize = getHeaderFileSize(buffer);
|
|
86
|
+
const indexDataOffset = offset + 512;
|
|
87
|
+
const indexDataEnd = indexDataOffset + indexSize;
|
|
88
|
+
if (indexDataEnd > size - 1024) {
|
|
89
|
+
throw new Error('Invalid index data offsets: [' + indexDataOffset + ':' + indexDataEnd + ']');
|
|
90
|
+
}
|
|
91
|
+
const dataBuffer = Buffer.alloc(indexSize);
|
|
92
|
+
await fd.read(dataBuffer, 0, indexSize, indexDataOffset);
|
|
93
|
+
const indexContent = dataBuffer.toString('utf-8');
|
|
94
|
+
return new TarIndex(fd, indexContent);
|
|
95
|
+
}
|
|
96
|
+
offset -= 512;
|
|
97
|
+
}
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
export class TarIndex {
|
|
101
|
+
fd;
|
|
102
|
+
entries = {};
|
|
103
|
+
headerBuffer = Buffer.alloc(512);
|
|
104
|
+
/**
|
|
105
|
+
* @param fd the tar file descriptor
|
|
106
|
+
* @param content the index content
|
|
107
|
+
*/
|
|
108
|
+
constructor(fd, content) {
|
|
109
|
+
this.fd = fd;
|
|
110
|
+
const lines = content.split('\n');
|
|
111
|
+
for (const line of lines) {
|
|
112
|
+
if (line) {
|
|
113
|
+
const [name, value] = line.split(':');
|
|
114
|
+
const [offsetStr, sizeStr] = value.split(',');
|
|
115
|
+
const offset = parseInt(offsetStr);
|
|
116
|
+
const size = parseInt(sizeStr);
|
|
117
|
+
this.entries[name] = { offset, size };
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
getPaths() {
|
|
122
|
+
return Object.keys(this.entries);
|
|
123
|
+
}
|
|
124
|
+
getSortedPaths() {
|
|
125
|
+
return Object.keys(this.entries).sort();
|
|
126
|
+
}
|
|
127
|
+
get(name) {
|
|
128
|
+
return this.entries[name];
|
|
129
|
+
}
|
|
130
|
+
async getContentAt(offset, size) {
|
|
131
|
+
const buffer = Buffer.alloc(size);
|
|
132
|
+
await this.fd.read(buffer, 0, size, offset + 512);
|
|
133
|
+
return buffer;
|
|
134
|
+
}
|
|
135
|
+
async getContent(name) {
|
|
136
|
+
const entry = this.entries[name];
|
|
137
|
+
if (entry) {
|
|
138
|
+
return this.getContentAt(entry.offset, entry.size);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
getReadStream(name, encoding) {
|
|
145
|
+
const entry = this.entries[name];
|
|
146
|
+
if (entry) {
|
|
147
|
+
const offset = entry.offset + 512;
|
|
148
|
+
return this.fd.createReadStream({
|
|
149
|
+
encoding,
|
|
150
|
+
start: entry.offset,
|
|
151
|
+
end: offset + entry.size
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
async close() {
|
|
159
|
+
await this.fd.close();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function getHeaderFileSize(buffer) {
|
|
163
|
+
const octalSize = buffer.toString('ascii', 124, 136).trim();
|
|
164
|
+
return parseInt(octalSize, 8);
|
|
165
|
+
}
|
|
166
|
+
export function normalizePath(path) {
|
|
167
|
+
if (path.startsWith('/')) {
|
|
168
|
+
path = path.slice(1);
|
|
169
|
+
}
|
|
170
|
+
if (path.endsWith('/')) {
|
|
171
|
+
path = path.slice(-1);
|
|
172
|
+
}
|
|
173
|
+
return path;
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=tar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tar.js","sourceRoot":"","sources":["../../../src/utils/tar.ts"],"names":[],"mappings":"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"}
|