poe-code 15.0.14 → 15.0.16
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/metafile.json +1 -1
- package/package.json +13 -1
- package/packages/safe-bash/dist/chunks/{chunk-GZKLXMBM.js → chunk-5VBLSPNM.js} +6 -1
- package/packages/safe-bash/dist/chunks/{chunk-GZKLXMBM.js.map → chunk-5VBLSPNM.js.map} +2 -2
- package/packages/safe-bash/dist/chunks/{chunk-DJHZJAB7.js → chunk-66VSWIUC.js} +3 -3
- package/packages/safe-bash/dist/chunks/{chunk-PPPN3OME.js → chunk-6PSMEBVP.js} +2 -2
- package/packages/safe-bash/dist/chunks/chunk-A4UXQKWZ.js +2609 -0
- package/packages/safe-bash/dist/chunks/chunk-A4UXQKWZ.js.map +7 -0
- package/packages/safe-bash/dist/chunks/{chunk-32GGX4AS.js → chunk-AZNI263O.js} +3 -3
- package/packages/safe-bash/dist/chunks/{chunk-LRVRQIG5.js → chunk-EZLQA6ON.js} +3 -3
- package/packages/safe-bash/dist/chunks/{chunk-ZQEL7DYC.js → chunk-HFEU5SBQ.js} +4 -4
- package/packages/safe-bash/dist/chunks/{chunk-EYJTLUBJ.js → chunk-PZMJ4EC3.js} +2 -2
- package/packages/safe-bash/dist/chunks/chunk-R3QJL5HH.js +698 -0
- package/packages/safe-bash/dist/chunks/chunk-R3QJL5HH.js.map +7 -0
- package/packages/safe-bash/dist/chunks/{chunk-J4CKSMJV.js → chunk-T5BV7HPD.js} +2 -2
- package/packages/safe-bash/dist/chunks/{chunk-IIWXPQB3.js → chunk-TPD45VUZ.js} +5 -5
- package/packages/safe-bash/dist/chunks/{chunk-UGMO7OO5.js → chunk-VNDFKT6F.js} +3 -3
- package/packages/safe-bash/dist/chunks/{chunk-LZUOZVGJ.js → chunk-WF4P7XKI.js} +3 -3
- package/packages/safe-bash/dist/chunks/{chunk-Z75O7XWR.js → chunk-WODV2DVM.js} +3 -3
- package/packages/safe-bash/dist/chunks/{chunk-QKQNBJOU.js → chunk-YEJBZLE5.js} +5 -5
- package/packages/safe-bash/dist/commands/bytes/compression/file-operation.d.ts +16 -0
- package/packages/safe-bash/dist/commands/bytes/compression/file-operation.d.ts.map +1 -0
- package/packages/safe-bash/dist/commands/bytes/compression/file-operation.js +134 -0
- package/packages/safe-bash/dist/commands/bytes/compression/file-operation.js.map +1 -0
- package/packages/safe-bash/dist/commands/bytes/compression/files.d.ts.map +1 -1
- package/packages/safe-bash/dist/commands/bytes/compression/files.js +126 -67
- package/packages/safe-bash/dist/commands/bytes/compression/files.js.map +1 -1
- package/packages/safe-bash/dist/commands/bytes/compression/stream.d.ts.map +1 -1
- package/packages/safe-bash/dist/commands/bytes/compression/stream.js +2 -1
- package/packages/safe-bash/dist/commands/bytes/compression/stream.js.map +1 -1
- package/packages/safe-bash/dist/commands/csplit/index.browser.js +4 -4
- package/packages/safe-bash/dist/commands/factor/index.browser.js +3 -3
- package/packages/safe-bash/dist/commands/getopt/index.browser.js +3 -3
- package/packages/safe-bash/dist/commands/hexdump/command.d.ts +5 -0
- package/packages/safe-bash/dist/commands/hexdump/command.d.ts.map +1 -0
- package/packages/safe-bash/dist/commands/hexdump/command.js +174 -0
- package/packages/safe-bash/dist/commands/hexdump/command.js.map +1 -0
- package/packages/safe-bash/dist/commands/hexdump/format.d.ts +2 -0
- package/packages/safe-bash/dist/commands/hexdump/format.d.ts.map +1 -0
- package/packages/safe-bash/dist/commands/hexdump/format.js +25 -0
- package/packages/safe-bash/dist/commands/hexdump/format.js.map +1 -0
- package/packages/safe-bash/dist/commands/hexdump/index.browser.js +17 -0
- package/packages/safe-bash/dist/commands/hexdump/index.browser.js.map +7 -0
- package/packages/safe-bash/dist/commands/hexdump/index.d.ts +7 -0
- package/packages/safe-bash/dist/commands/hexdump/index.d.ts.map +1 -0
- package/packages/safe-bash/dist/commands/hexdump/index.js +17 -0
- package/packages/safe-bash/dist/commands/hexdump/index.js.map +1 -0
- package/packages/safe-bash/dist/commands/hexdump/internal.d.ts +52 -0
- package/packages/safe-bash/dist/commands/hexdump/internal.d.ts.map +1 -0
- package/packages/safe-bash/dist/commands/hexdump/internal.js +150 -0
- package/packages/safe-bash/dist/commands/hexdump/internal.js.map +1 -0
- package/packages/safe-bash/dist/commands/hexdump/io.d.ts +41 -0
- package/packages/safe-bash/dist/commands/hexdump/io.d.ts.map +1 -0
- package/packages/safe-bash/dist/commands/hexdump/io.js +288 -0
- package/packages/safe-bash/dist/commands/hexdump/io.js.map +1 -0
- package/packages/safe-bash/dist/commands/hexdump/options.d.ts +10 -0
- package/packages/safe-bash/dist/commands/hexdump/options.d.ts.map +1 -0
- package/packages/safe-bash/dist/commands/hexdump/options.js +80 -0
- package/packages/safe-bash/dist/commands/hexdump/options.js.map +1 -0
- package/packages/safe-bash/dist/commands/iconv/codec.d.ts +10 -0
- package/packages/safe-bash/dist/commands/iconv/codec.d.ts.map +1 -0
- package/packages/safe-bash/dist/commands/iconv/codec.js +200 -0
- package/packages/safe-bash/dist/commands/iconv/codec.js.map +1 -0
- package/packages/safe-bash/dist/commands/iconv/command.d.ts +4 -0
- package/packages/safe-bash/dist/commands/iconv/command.d.ts.map +1 -0
- package/packages/safe-bash/dist/commands/iconv/command.js +116 -0
- package/packages/safe-bash/dist/commands/iconv/command.js.map +1 -0
- package/packages/safe-bash/dist/commands/iconv/index.browser.js +15 -0
- package/packages/safe-bash/dist/commands/iconv/index.browser.js.map +7 -0
- package/packages/safe-bash/dist/commands/iconv/index.d.ts +7 -0
- package/packages/safe-bash/dist/commands/iconv/index.d.ts.map +1 -0
- package/packages/safe-bash/dist/commands/iconv/index.js +11 -0
- package/packages/safe-bash/dist/commands/iconv/index.js.map +1 -0
- package/packages/safe-bash/dist/commands/iconv/internal.d.ts +54 -0
- package/packages/safe-bash/dist/commands/iconv/internal.d.ts.map +1 -0
- package/packages/safe-bash/dist/commands/iconv/internal.js +154 -0
- package/packages/safe-bash/dist/commands/iconv/internal.js.map +1 -0
- package/packages/safe-bash/dist/commands/iconv/lifecycle.d.ts +24 -0
- package/packages/safe-bash/dist/commands/iconv/lifecycle.d.ts.map +1 -0
- package/packages/safe-bash/dist/commands/iconv/lifecycle.js +111 -0
- package/packages/safe-bash/dist/commands/iconv/lifecycle.js.map +1 -0
- package/packages/safe-bash/dist/commands/iconv/options.d.ts +11 -0
- package/packages/safe-bash/dist/commands/iconv/options.d.ts.map +1 -0
- package/packages/safe-bash/dist/commands/iconv/options.js +82 -0
- package/packages/safe-bash/dist/commands/iconv/options.js.map +1 -0
- package/packages/safe-bash/dist/commands/iconv/reader.d.ts +21 -0
- package/packages/safe-bash/dist/commands/iconv/reader.d.ts.map +1 -0
- package/packages/safe-bash/dist/commands/iconv/reader.js +192 -0
- package/packages/safe-bash/dist/commands/iconv/reader.js.map +1 -0
- package/packages/safe-bash/dist/commands/iconv/transliterations.d.ts +2 -0
- package/packages/safe-bash/dist/commands/iconv/transliterations.d.ts.map +1 -0
- package/packages/safe-bash/dist/commands/iconv/transliterations.js +1785 -0
- package/packages/safe-bash/dist/commands/iconv/transliterations.js.map +1 -0
- package/packages/safe-bash/dist/commands/network/index.browser.js +5 -5
- package/packages/safe-bash/dist/commands/pr/index.browser.js +3 -3
- package/packages/safe-bash/dist/commands/tsort/index.browser.js +3 -3
- package/packages/safe-bash/dist/commands/xml/index.browser.js +4 -4
- package/packages/safe-bash/dist/commands/yq/index.browser.js +5 -5
- package/packages/safe-bash/dist/contracts/yield.d.ts +1 -0
- package/packages/safe-bash/dist/contracts/yield.d.ts.map +1 -1
- package/packages/safe-bash/dist/contracts/yield.js +5 -0
- package/packages/safe-bash/dist/contracts/yield.js.map +1 -1
- package/packages/safe-bash/dist/core.browser.js +297 -79
- package/packages/safe-bash/dist/core.browser.js.map +4 -4
- package/packages/safe-bash/dist/core.d.ts +2 -0
- package/packages/safe-bash/dist/core.d.ts.map +1 -1
- package/packages/safe-bash/dist/core.js +2 -0
- package/packages/safe-bash/dist/core.js.map +1 -1
- package/packages/safe-bash/dist/plugins/composition.d.ts +4 -0
- package/packages/safe-bash/dist/plugins/composition.d.ts.map +1 -1
- package/packages/safe-bash/dist/plugins/composition.js +5 -1
- package/packages/safe-bash/dist/plugins/composition.js.map +1 -1
- /package/packages/safe-bash/dist/chunks/{chunk-DJHZJAB7.js.map → chunk-66VSWIUC.js.map} +0 -0
- /package/packages/safe-bash/dist/chunks/{chunk-PPPN3OME.js.map → chunk-6PSMEBVP.js.map} +0 -0
- /package/packages/safe-bash/dist/chunks/{chunk-32GGX4AS.js.map → chunk-AZNI263O.js.map} +0 -0
- /package/packages/safe-bash/dist/chunks/{chunk-LRVRQIG5.js.map → chunk-EZLQA6ON.js.map} +0 -0
- /package/packages/safe-bash/dist/chunks/{chunk-ZQEL7DYC.js.map → chunk-HFEU5SBQ.js.map} +0 -0
- /package/packages/safe-bash/dist/chunks/{chunk-EYJTLUBJ.js.map → chunk-PZMJ4EC3.js.map} +0 -0
- /package/packages/safe-bash/dist/chunks/{chunk-J4CKSMJV.js.map → chunk-T5BV7HPD.js.map} +0 -0
- /package/packages/safe-bash/dist/chunks/{chunk-IIWXPQB3.js.map → chunk-TPD45VUZ.js.map} +0 -0
- /package/packages/safe-bash/dist/chunks/{chunk-UGMO7OO5.js.map → chunk-VNDFKT6F.js.map} +0 -0
- /package/packages/safe-bash/dist/chunks/{chunk-LZUOZVGJ.js.map → chunk-WF4P7XKI.js.map} +0 -0
- /package/packages/safe-bash/dist/chunks/{chunk-Z75O7XWR.js.map → chunk-WODV2DVM.js.map} +0 -0
- /package/packages/safe-bash/dist/chunks/{chunk-QKQNBJOU.js.map → chunk-YEJBZLE5.js.map} +0 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export function formatBlock(block, used, address, canonical) {
|
|
2
|
+
let result = address.toString(16).padStart(canonical ? 8 : 7, "0") + (canonical ? " " : " ");
|
|
3
|
+
if (canonical) {
|
|
4
|
+
for (let index = 0; index < 16; index++) {
|
|
5
|
+
if (index === 8)
|
|
6
|
+
result += " ";
|
|
7
|
+
result += index < used ? block[index].toString(16).padStart(2, "0") : " ";
|
|
8
|
+
if (index !== 15)
|
|
9
|
+
result += " ";
|
|
10
|
+
}
|
|
11
|
+
result += " |";
|
|
12
|
+
for (let index = 0; index < used; index++) {
|
|
13
|
+
const byte = block[index];
|
|
14
|
+
result += byte >= 32 && byte <= 126 ? String.fromCharCode(byte) : ".";
|
|
15
|
+
}
|
|
16
|
+
return result + "|\n";
|
|
17
|
+
}
|
|
18
|
+
for (let index = 0; index < 16; index += 2) {
|
|
19
|
+
result += index < used ? (block[index] + (index + 1 < used ? block[index + 1] * 256 : 0)).toString(16).padStart(4, "0") : " ";
|
|
20
|
+
if (index !== 14)
|
|
21
|
+
result += " ";
|
|
22
|
+
}
|
|
23
|
+
return result + "\n";
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/commands/hexdump/format.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,KAAiB,EAAE,IAAY,EAAE,OAAe,EAAE,SAAkB;IAC9F,IAAI,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9F,IAAI,SAAS,EAAE,CAAC;QACd,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;YACxC,IAAI,KAAK,KAAK,CAAC;gBAAE,MAAM,IAAI,GAAG,CAAC;YAC/B,MAAM,IAAI,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC5E,IAAI,KAAK,KAAK,EAAE;gBAAE,MAAM,IAAI,GAAG,CAAC;QAClC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC;QAChB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAE,CAAC;YAC3B,MAAM,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACxE,CAAC;QACD,OAAO,MAAM,GAAG,KAAK,CAAC;IACxB,CAAC;IACD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAE,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACnI,IAAI,KAAK,KAAK,EAAE;YAAE,MAAM,IAAI,GAAG,CAAC;IAClC,CAAC;IACD,OAAO,MAAM,GAAG,IAAI,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createHdCommand,
|
|
3
|
+
createHexdumpCommand,
|
|
4
|
+
createHexdumpCommands,
|
|
5
|
+
hexdumpCommands
|
|
6
|
+
} from "../../chunks/chunk-R3QJL5HH.js";
|
|
7
|
+
import "../../chunks/chunk-DPJWEGIX.js";
|
|
8
|
+
import "../../chunks/chunk-PZMJ4EC3.js";
|
|
9
|
+
import "../../chunks/chunk-5VBLSPNM.js";
|
|
10
|
+
import "../../chunks/chunk-2KL6W6NB.js";
|
|
11
|
+
export {
|
|
12
|
+
createHdCommand,
|
|
13
|
+
createHexdumpCommand,
|
|
14
|
+
createHexdumpCommands,
|
|
15
|
+
hexdumpCommands
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=index.browser.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CommandDefinition, VirtualShellPlugin } from "../../contracts/index.js";
|
|
2
|
+
import type { HexdumpCommandsOptions } from "./internal.js";
|
|
3
|
+
export { createHexdumpCommand, createHdCommand } from "./command.js";
|
|
4
|
+
export type { HexdumpCommandsOptions, HexdumpLimits } from "./internal.js";
|
|
5
|
+
export declare function createHexdumpCommands(options?: HexdumpCommandsOptions): readonly CommandDefinition[];
|
|
6
|
+
export declare function hexdumpCommands(options?: HexdumpCommandsOptions): VirtualShellPlugin;
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/hexdump/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEtF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAE5D,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACrE,YAAY,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE3E,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,sBAA2B,GAAG,SAAS,iBAAiB,EAAE,CAExG;AAED,wBAAgB,eAAe,CAAC,OAAO,GAAE,sBAA2B,GAAG,kBAAkB,CAMxF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { createHexdumpCommand, createHdCommand } from "./command.js";
|
|
2
|
+
export { createHexdumpCommand, createHdCommand } from "./command.js";
|
|
3
|
+
export function createHexdumpCommands(options = {}) {
|
|
4
|
+
return [createHexdumpCommand(options), createHdCommand(options)];
|
|
5
|
+
}
|
|
6
|
+
export function hexdumpCommands(options = {}) {
|
|
7
|
+
const commands = createHexdumpCommands(options);
|
|
8
|
+
return { name: "hexdump-commands", setup(host) {
|
|
9
|
+
if (!options.replace)
|
|
10
|
+
for (const command of commands)
|
|
11
|
+
if (host.commands.has(command.name))
|
|
12
|
+
throw new Error(`Command already registered: ${command.name}`);
|
|
13
|
+
for (const command of commands)
|
|
14
|
+
host.commands.register(command, { replace: options.replace ?? false });
|
|
15
|
+
} };
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/hexdump/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGrE,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGrE,MAAM,UAAU,qBAAqB,CAAC,UAAkC,EAAE;IACxE,OAAO,CAAC,oBAAoB,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,UAAkC,EAAE;IAClE,MAAM,QAAQ,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAChD,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,CAAC,IAAI;YAC3C,IAAI,CAAC,OAAO,CAAC,OAAO;gBAAE,KAAK,MAAM,OAAO,IAAI,QAAQ;oBAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;wBAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1J,KAAK,MAAM,OAAO,IAAI,QAAQ;gBAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC;QACzG,CAAC,EAAE,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { type CommandContext } from "../../contracts/index.js";
|
|
2
|
+
import { PublicDiagnostic } from "../../diagnostics.js";
|
|
3
|
+
export interface HexdumpLimits {
|
|
4
|
+
readonly maxArguments: number;
|
|
5
|
+
readonly maxArgumentBytes: number;
|
|
6
|
+
readonly maxInputBytes: number;
|
|
7
|
+
readonly maxBufferedBytes: number;
|
|
8
|
+
readonly maxOutputBytes: number;
|
|
9
|
+
readonly maxDiagnosticBytes: number;
|
|
10
|
+
readonly maxFormats: number;
|
|
11
|
+
readonly maxWork: number;
|
|
12
|
+
readonly maxEmptyChunks: number;
|
|
13
|
+
}
|
|
14
|
+
export interface HexdumpCommandsOptions {
|
|
15
|
+
readonly replace?: boolean;
|
|
16
|
+
readonly limits?: Partial<HexdumpLimits>;
|
|
17
|
+
}
|
|
18
|
+
export declare function settings(options: HexdumpCommandsOptions): HexdumpLimits;
|
|
19
|
+
export declare class HexdumpError extends PublicDiagnostic {
|
|
20
|
+
readonly bare: boolean;
|
|
21
|
+
constructor(message: string, bare?: boolean);
|
|
22
|
+
}
|
|
23
|
+
export declare function raw(value: Uint8Array): string;
|
|
24
|
+
export declare function bytes(value: string): Uint8Array;
|
|
25
|
+
export declare function pathText(value: string): string;
|
|
26
|
+
export declare class Budget {
|
|
27
|
+
readonly context: CommandContext;
|
|
28
|
+
readonly limits: HexdumpLimits;
|
|
29
|
+
readonly signal: AbortSignal;
|
|
30
|
+
private readonly callerSignal;
|
|
31
|
+
readonly admission: {
|
|
32
|
+
readonly closed: boolean;
|
|
33
|
+
};
|
|
34
|
+
private work;
|
|
35
|
+
private checkpoint;
|
|
36
|
+
private retained;
|
|
37
|
+
private input;
|
|
38
|
+
private output;
|
|
39
|
+
private diagnostics;
|
|
40
|
+
constructor(context: CommandContext, limits: HexdumpLimits, signal: AbortSignal, callerSignal: AbortSignal, admission: {
|
|
41
|
+
readonly closed: boolean;
|
|
42
|
+
});
|
|
43
|
+
assertOpen(): void;
|
|
44
|
+
check(value: number, maximum: number, label: string): void;
|
|
45
|
+
charge(amount?: number): void;
|
|
46
|
+
checkpointWork(): Promise<void>;
|
|
47
|
+
retain(amount: number): void;
|
|
48
|
+
inputBytes(amount: number): void;
|
|
49
|
+
emitted(amount: number, diagnostic: boolean): void;
|
|
50
|
+
arguments(): string[];
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=internal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../../src/commands/hexdump/internal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAGpF,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CAC1C;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,sBAAsB,GAAG,aAAa,CAWvE;AAED,qBAAa,YAAa,SAAQ,gBAAgB;IACnB,QAAQ,CAAC,IAAI;gBAA9B,OAAO,EAAE,MAAM,EAAW,IAAI,UAAQ;CACnD;AAED,wBAAgB,GAAG,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAI7C;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAE/C;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAG9C;AAED,qBAAa,MAAM;IAOL,QAAQ,CAAC,OAAO,EAAE,cAAc;IAAE,QAAQ,CAAC,MAAM,EAAE,aAAa;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW;IAAE,OAAO,CAAC,QAAQ,CAAC,YAAY;IAAe,QAAQ,CAAC,SAAS,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;KAAE;IANxM,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,WAAW,CAAK;gBACH,OAAO,EAAE,cAAc,EAAW,MAAM,EAAE,aAAa,EAAW,MAAM,EAAE,WAAW,EAAmB,YAAY,EAAE,WAAW,EAAW,SAAS,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;KAAE;IACxM,UAAU,IAAI,IAAI;IAIlB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAG1D,MAAM,CAAC,MAAM,SAAI,GAAG,IAAI;IAKlB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAQrC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI5B,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIhC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,IAAI;IAUlD,SAAS,IAAI,MAAM,EAAE;CA0CtB"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { getCommandArguments } from "../../contracts/index.js";
|
|
2
|
+
import { shellValueByteLength, shellValueBytes } from "../../contracts/value.js";
|
|
3
|
+
import { yieldTurn } from "../../contracts/yield.js";
|
|
4
|
+
import { PublicDiagnostic } from "../../diagnostics.js";
|
|
5
|
+
export function settings(options) {
|
|
6
|
+
const limits = {
|
|
7
|
+
maxArguments: 4096, maxArgumentBytes: 65_536, maxInputBytes: 33_554_432,
|
|
8
|
+
maxBufferedBytes: 8_388_608, maxOutputBytes: 134_217_728,
|
|
9
|
+
maxDiagnosticBytes: 65_536, maxFormats: 64, maxWork: 536_870_912,
|
|
10
|
+
maxEmptyChunks: 4096, ...options.limits,
|
|
11
|
+
};
|
|
12
|
+
for (const [name, value] of Object.entries(limits)) {
|
|
13
|
+
if (!Number.isSafeInteger(value) || value < 1)
|
|
14
|
+
throw new RangeError(`Invalid hexdump limit: ${name}`);
|
|
15
|
+
}
|
|
16
|
+
return Object.freeze(limits);
|
|
17
|
+
}
|
|
18
|
+
export class HexdumpError extends PublicDiagnostic {
|
|
19
|
+
bare;
|
|
20
|
+
constructor(message, bare = false) {
|
|
21
|
+
super(message);
|
|
22
|
+
this.bare = bare;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export function raw(value) {
|
|
26
|
+
let result = "";
|
|
27
|
+
for (let offset = 0; offset < value.length; offset += 4096)
|
|
28
|
+
result += String.fromCharCode(...value.subarray(offset, offset + 4096));
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
export function bytes(value) {
|
|
32
|
+
return Uint8Array.from(value, character => character.charCodeAt(0));
|
|
33
|
+
}
|
|
34
|
+
export function pathText(value) {
|
|
35
|
+
try {
|
|
36
|
+
return new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(bytes(value));
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
throw new HexdumpError("filesystem paths must be valid UTF-8");
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export class Budget {
|
|
43
|
+
context;
|
|
44
|
+
limits;
|
|
45
|
+
signal;
|
|
46
|
+
callerSignal;
|
|
47
|
+
admission;
|
|
48
|
+
work = 0;
|
|
49
|
+
checkpoint = 0;
|
|
50
|
+
retained = 0;
|
|
51
|
+
input = 0;
|
|
52
|
+
output = 0;
|
|
53
|
+
diagnostics = 0;
|
|
54
|
+
constructor(context, limits, signal, callerSignal, admission) {
|
|
55
|
+
this.context = context;
|
|
56
|
+
this.limits = limits;
|
|
57
|
+
this.signal = signal;
|
|
58
|
+
this.callerSignal = callerSignal;
|
|
59
|
+
this.admission = admission;
|
|
60
|
+
}
|
|
61
|
+
assertOpen() {
|
|
62
|
+
this.signal.throwIfAborted();
|
|
63
|
+
if (this.admission.closed)
|
|
64
|
+
throw new HexdumpError("command is closed");
|
|
65
|
+
}
|
|
66
|
+
check(value, maximum, label) {
|
|
67
|
+
if (!Number.isSafeInteger(value) || value < 0 || value > maximum)
|
|
68
|
+
throw new HexdumpError(`${label} limit exceeded`);
|
|
69
|
+
}
|
|
70
|
+
charge(amount = 1) {
|
|
71
|
+
this.assertOpen();
|
|
72
|
+
this.check(this.work + amount, this.limits.maxWork, "work");
|
|
73
|
+
this.work += amount;
|
|
74
|
+
}
|
|
75
|
+
async checkpointWork() {
|
|
76
|
+
this.assertOpen();
|
|
77
|
+
if (this.work - this.checkpoint >= 4096) {
|
|
78
|
+
this.checkpoint = this.work;
|
|
79
|
+
await yieldTurn(this.callerSignal);
|
|
80
|
+
this.assertOpen();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
retain(amount) {
|
|
84
|
+
this.check(this.retained + amount, this.limits.maxBufferedBytes, "buffered bytes");
|
|
85
|
+
this.retained += amount;
|
|
86
|
+
}
|
|
87
|
+
inputBytes(amount) {
|
|
88
|
+
this.check(this.input + amount, this.limits.maxInputBytes, "input bytes");
|
|
89
|
+
this.input += amount;
|
|
90
|
+
}
|
|
91
|
+
emitted(amount, diagnostic) {
|
|
92
|
+
if (diagnostic) {
|
|
93
|
+
this.check(this.diagnostics + amount, this.limits.maxDiagnosticBytes, "diagnostic bytes");
|
|
94
|
+
this.diagnostics += amount;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
this.check(this.output + amount, this.limits.maxOutputBytes, "output bytes");
|
|
98
|
+
this.charge(amount);
|
|
99
|
+
this.output += amount;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
arguments() {
|
|
103
|
+
this.assertOpen();
|
|
104
|
+
const args = this.context.args;
|
|
105
|
+
this.assertOpen();
|
|
106
|
+
const count = args.length;
|
|
107
|
+
this.assertOpen();
|
|
108
|
+
this.check(count, this.limits.maxArguments, "argument count");
|
|
109
|
+
const argumentValues = this.context.argumentValues;
|
|
110
|
+
this.assertOpen();
|
|
111
|
+
const carrier = argumentValues === undefined ? undefined : getCommandArguments({ args, argumentValues });
|
|
112
|
+
this.assertOpen();
|
|
113
|
+
this.retain(count * 64 + 128);
|
|
114
|
+
const snapshot = [];
|
|
115
|
+
let units = 0, total = 0;
|
|
116
|
+
for (let index = 0; index < count; index++) {
|
|
117
|
+
const argument = args[index];
|
|
118
|
+
this.assertOpen();
|
|
119
|
+
if (typeof argument !== "string")
|
|
120
|
+
throw new HexdumpError("arguments must be strings");
|
|
121
|
+
units += argument.length;
|
|
122
|
+
this.check(units, this.limits.maxArgumentBytes, "argument bytes");
|
|
123
|
+
this.charge(argument.length + 1);
|
|
124
|
+
for (let offset = 0; offset < argument.length; offset++) {
|
|
125
|
+
const unit = argument.charCodeAt(offset);
|
|
126
|
+
if (unit >= 0xd800 && unit <= 0xdbff) {
|
|
127
|
+
const next = argument.charCodeAt(++offset);
|
|
128
|
+
if (!(next >= 0xdc00 && next <= 0xdfff))
|
|
129
|
+
throw new HexdumpError("arguments must contain well-formed Unicode");
|
|
130
|
+
}
|
|
131
|
+
else if (unit >= 0xdc00 && unit <= 0xdfff)
|
|
132
|
+
throw new HexdumpError("arguments must contain well-formed Unicode");
|
|
133
|
+
}
|
|
134
|
+
const size = shellValueByteLength(carrier ? carrier.values[index] : argument);
|
|
135
|
+
total += size;
|
|
136
|
+
this.check(total, this.limits.maxArgumentBytes, "argument bytes");
|
|
137
|
+
this.charge(size);
|
|
138
|
+
this.retain(size * 8);
|
|
139
|
+
snapshot.push(argument);
|
|
140
|
+
}
|
|
141
|
+
return (carrier ?? getCommandArguments({ args: snapshot })).values.map(argument => {
|
|
142
|
+
this.charge(shellValueByteLength(argument));
|
|
143
|
+
const value = shellValueBytes(argument);
|
|
144
|
+
if (value.includes(0))
|
|
145
|
+
throw new HexdumpError("NUL is not supported in arguments");
|
|
146
|
+
return raw(value);
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=internal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.js","sourceRoot":"","sources":["../../../src/commands/hexdump/internal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAuB,MAAM,0BAA0B,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAmBxD,MAAM,UAAU,QAAQ,CAAC,OAA+B;IACtD,MAAM,MAAM,GAAkB;QAC5B,YAAY,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU;QACvE,gBAAgB,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW;QACxD,kBAAkB,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,WAAW;QAChE,cAAc,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM;KACxC,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;IACxG,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,OAAO,YAAa,SAAQ,gBAAgB;IACV;IAAtC,YAAY,OAAe,EAAW,OAAO,KAAK;QAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QAA/B,SAAI,GAAJ,IAAI,CAAQ;IAAoB,CAAC;CACxE;AAED,MAAM,UAAU,GAAG,CAAC,KAAiB;IACnC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,IAAI;QAAE,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IACpI,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,KAAa;IACjC,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,IAAI,CAAC;QAAC,OAAO,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAAC,CAAC;IAC/F,MAAM,CAAC;QAAC,MAAM,IAAI,YAAY,CAAC,sCAAsC,CAAC,CAAC;IAAC,CAAC;AAC3E,CAAC;AAED,MAAM,OAAO,MAAM;IAOI;IAAkC;IAAgC;IAAsC;IAAoC;IANzJ,IAAI,GAAG,CAAC,CAAC;IACT,UAAU,GAAG,CAAC,CAAC;IACf,QAAQ,GAAG,CAAC,CAAC;IACb,KAAK,GAAG,CAAC,CAAC;IACV,MAAM,GAAG,CAAC,CAAC;IACX,WAAW,GAAG,CAAC,CAAC;IACxB,YAAqB,OAAuB,EAAW,MAAqB,EAAW,MAAmB,EAAmB,YAAyB,EAAW,SAAuC;QAAnL,YAAO,GAAP,OAAO,CAAgB;QAAW,WAAM,GAAN,MAAM,CAAe;QAAW,WAAM,GAAN,MAAM,CAAa;QAAmB,iBAAY,GAAZ,YAAY,CAAa;QAAW,cAAS,GAAT,SAAS,CAA8B;IAAG,CAAC;IAC5M,UAAU;QACR,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM;YAAE,MAAM,IAAI,YAAY,CAAC,mBAAmB,CAAC,CAAC;IACzE,CAAC;IACD,KAAK,CAAC,KAAa,EAAE,OAAe,EAAE,KAAa;QACjD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,OAAO;YAAE,MAAM,IAAI,YAAY,CAAC,GAAG,KAAK,iBAAiB,CAAC,CAAC;IACtH,CAAC;IACD,MAAM,CAAC,MAAM,GAAG,CAAC;QACf,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC;IACtB,CAAC;IACD,KAAK,CAAC,cAAc;QAClB,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;YACxC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC;YAC5B,MAAM,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACnC,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IACD,MAAM,CAAC,MAAc;QACnB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;QACnF,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC;IAC1B,CAAC;IACD,UAAU,CAAC,MAAc;QACvB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;QAC1E,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC;IACvB,CAAC;IACD,OAAO,CAAC,MAAc,EAAE,UAAmB;QACzC,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,GAAG,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC;YAC1F,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;YAC7E,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACpB,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC;QACxB,CAAC;IACH,CAAC;IACD,SAAS;QACP,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QAC/B,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;QAC9D,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;QACnD,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACzG,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC;QAC9B,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;QACzB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAE,CAAC;YAC9B,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,IAAI,OAAO,QAAQ,KAAK,QAAQ;gBAAE,MAAM,IAAI,YAAY,CAAC,2BAA2B,CAAC,CAAC;YACtF,KAAK,IAAI,QAAQ,CAAC,MAAM,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;YAClE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACjC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;gBACxD,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBACzC,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;oBACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;oBAC3C,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC;wBAAE,MAAM,IAAI,YAAY,CAAC,4CAA4C,CAAC,CAAC;gBAChH,CAAC;qBAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM;oBAAE,MAAM,IAAI,YAAY,CAAC,4CAA4C,CAAC,CAAC;YACpH,CAAC;YACD,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC/E,KAAK,IAAI,IAAI,CAAC;YACd,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;YAClE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YACtB,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,CAAC,OAAO,IAAI,mBAAmB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;YAChF,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC5C,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;YACxC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,MAAM,IAAI,YAAY,CAAC,mCAAmC,CAAC,CAAC;YACnF,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { FsError, type ByteSink } from "../../contracts/index.js";
|
|
2
|
+
import type { OutputOperation } from "../../contracts/output.js";
|
|
3
|
+
import { Budget } from "./internal.js";
|
|
4
|
+
export declare class Lifecycle {
|
|
5
|
+
readonly budget: Budget;
|
|
6
|
+
private readonly stdout;
|
|
7
|
+
private readonly caller;
|
|
8
|
+
private readonly pending;
|
|
9
|
+
private readonly cleanups;
|
|
10
|
+
private closing;
|
|
11
|
+
private diagnostic;
|
|
12
|
+
diagnosticCancellation: {
|
|
13
|
+
reason: unknown;
|
|
14
|
+
} | undefined;
|
|
15
|
+
constructor(budget: Budget, output: OutputOperation, stdout: ByteSink, caller: AbortSignal);
|
|
16
|
+
cleanup(action: () => Promise<void>): void;
|
|
17
|
+
forget(action: () => Promise<void>): void;
|
|
18
|
+
assertOpen(): void;
|
|
19
|
+
private assertDiagnosticOpen;
|
|
20
|
+
operation<Value>(action: () => Value | Promise<Value>, diagnostic?: boolean): Promise<Value>;
|
|
21
|
+
close(): Promise<void>;
|
|
22
|
+
write(value: string, diagnostic?: boolean): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
export declare class Reader {
|
|
25
|
+
readonly name: string | undefined;
|
|
26
|
+
readonly lifecycle: Lifecycle;
|
|
27
|
+
private iterator;
|
|
28
|
+
private chunk;
|
|
29
|
+
private offset;
|
|
30
|
+
private ended;
|
|
31
|
+
private empties;
|
|
32
|
+
private snapshotBytes;
|
|
33
|
+
private closed;
|
|
34
|
+
constructor(name: string | undefined, lifecycle: Lifecycle);
|
|
35
|
+
readonly close: () => Promise<void>;
|
|
36
|
+
private readonly releaseSnapshot;
|
|
37
|
+
open(): Promise<void>;
|
|
38
|
+
get(): Promise<number>;
|
|
39
|
+
}
|
|
40
|
+
export declare function fsDetail(error: FsError): string;
|
|
41
|
+
//# sourceMappingURL=io.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../../../src/commands/hexdump/io.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,KAAK,QAAQ,EAAmB,MAAM,0BAA0B,CAAC;AAChG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,MAAM,EAAiC,MAAM,eAAe,CAAC;AAOtE,qBAAa,SAAS;IAMR,QAAQ,CAAC,MAAM,EAAE,MAAM;IAA2B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAY,OAAO,CAAC,QAAQ,CAAC,MAAM;IALxH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IACvD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;IAC3D,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,UAAU,CAA2E;IAC7F,sBAAsB,EAAE;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAAC;gBACnC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAmB,MAAM,EAAE,QAAQ,EAAmB,MAAM,EAAE,WAAW;IACrI,OAAO,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAC1C,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IACzC,UAAU,IAAI,IAAI;IAIlB,OAAO,CAAC,oBAAoB;IAQtB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,UAAU,UAAQ,GAAG,OAAO,CAAC,KAAK,CAAC;IAmBhG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAWhB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CA4B9D;AAED,qBAAa,MAAM;IAQL,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;IAAE,QAAQ,CAAC,SAAS,EAAE,SAAS;IAP5E,OAAO,CAAC,QAAQ,CAAwC;IACxD,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,MAAM,CAA4B;gBACrB,IAAI,EAAE,MAAM,GAAG,SAAS,EAAW,SAAS,EAAE,SAAS;IAI5E,QAAQ,CAAC,KAAK,QAAO,OAAO,CAAC,IAAI,CAAC,CAS/B;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAG9B;IACI,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA6DrB,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;CAqC7B;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAO/C"}
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
import { FsError, resolvePath } from "../../contracts/index.js";
|
|
2
|
+
import { Budget, HexdumpError, bytes, pathText } from "./internal.js";
|
|
3
|
+
const typedArrayPrototype = Object.getPrototypeOf(Uint8Array.prototype);
|
|
4
|
+
const viewBuffer = Object.getOwnPropertyDescriptor(typedArrayPrototype, "buffer").get;
|
|
5
|
+
const viewOffset = Object.getOwnPropertyDescriptor(typedArrayPrototype, "byteOffset").get;
|
|
6
|
+
const viewLength = Object.getOwnPropertyDescriptor(typedArrayPrototype, "byteLength").get;
|
|
7
|
+
export class Lifecycle {
|
|
8
|
+
budget;
|
|
9
|
+
stdout;
|
|
10
|
+
caller;
|
|
11
|
+
pending = new Set();
|
|
12
|
+
cleanups = new Set();
|
|
13
|
+
closing;
|
|
14
|
+
diagnostic;
|
|
15
|
+
diagnosticCancellation;
|
|
16
|
+
constructor(budget, output, stdout, caller) {
|
|
17
|
+
this.budget = budget;
|
|
18
|
+
this.stdout = stdout;
|
|
19
|
+
this.caller = caller;
|
|
20
|
+
output.registerCleanup(() => this.close());
|
|
21
|
+
}
|
|
22
|
+
cleanup(action) { this.assertOpen(); this.cleanups.add(action); }
|
|
23
|
+
forget(action) { this.cleanups.delete(action); }
|
|
24
|
+
assertOpen() {
|
|
25
|
+
this.budget.assertOpen();
|
|
26
|
+
if (this.closing)
|
|
27
|
+
throw new HexdumpError("command is closed");
|
|
28
|
+
}
|
|
29
|
+
assertDiagnosticOpen() {
|
|
30
|
+
this.caller.throwIfAborted();
|
|
31
|
+
const consumer = this.diagnostic?.consumer;
|
|
32
|
+
if (consumer?.aborted) {
|
|
33
|
+
this.diagnosticCancellation = { reason: consumer.reason };
|
|
34
|
+
consumer.throwIfAborted();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async operation(action, diagnostic = false) {
|
|
38
|
+
if (diagnostic)
|
|
39
|
+
this.assertDiagnosticOpen();
|
|
40
|
+
else
|
|
41
|
+
this.assertOpen();
|
|
42
|
+
if (this.closing || this.budget.admission.closed)
|
|
43
|
+
throw new HexdumpError("command is closed");
|
|
44
|
+
if (!diagnostic)
|
|
45
|
+
this.budget.charge();
|
|
46
|
+
const pending = Promise.resolve().then(() => {
|
|
47
|
+
if (diagnostic)
|
|
48
|
+
this.assertDiagnosticOpen();
|
|
49
|
+
else
|
|
50
|
+
this.assertOpen();
|
|
51
|
+
return action();
|
|
52
|
+
});
|
|
53
|
+
this.pending.add(pending);
|
|
54
|
+
try {
|
|
55
|
+
const value = await pending;
|
|
56
|
+
if (diagnostic)
|
|
57
|
+
this.assertDiagnosticOpen();
|
|
58
|
+
else
|
|
59
|
+
this.assertOpen();
|
|
60
|
+
return value;
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
this.pending.delete(pending);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
close() {
|
|
67
|
+
return this.closing ??= Promise.resolve().then(async () => {
|
|
68
|
+
while (this.pending.size)
|
|
69
|
+
await Promise.allSettled([...this.pending]);
|
|
70
|
+
const failures = [];
|
|
71
|
+
for (const cleanup of this.cleanups) {
|
|
72
|
+
try {
|
|
73
|
+
await cleanup();
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
failures.push(error);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (failures.length === 1)
|
|
80
|
+
throw failures[0];
|
|
81
|
+
if (failures.length > 1)
|
|
82
|
+
throw new AggregateError(failures, "hexdump cleanup failed");
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
async write(value, diagnostic = false) {
|
|
86
|
+
this.budget.emitted(value.length, diagnostic);
|
|
87
|
+
await this.operation(async () => {
|
|
88
|
+
if (!diagnostic)
|
|
89
|
+
this.budget.retain(value.length * 3);
|
|
90
|
+
try {
|
|
91
|
+
let destination;
|
|
92
|
+
if (diagnostic) {
|
|
93
|
+
if (!this.diagnostic) {
|
|
94
|
+
const sink = this.budget.context.stderr;
|
|
95
|
+
this.assertDiagnosticOpen();
|
|
96
|
+
const capability = sink.ownedOutput;
|
|
97
|
+
this.assertDiagnosticOpen();
|
|
98
|
+
const consumer = capability?.consumerClosed;
|
|
99
|
+
this.diagnostic = { destination: capability ?? sink, consumer };
|
|
100
|
+
}
|
|
101
|
+
this.assertDiagnosticOpen();
|
|
102
|
+
destination = this.diagnostic.destination;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
destination = this.stdout;
|
|
106
|
+
this.assertOpen();
|
|
107
|
+
}
|
|
108
|
+
const write = destination.write;
|
|
109
|
+
if (diagnostic)
|
|
110
|
+
this.assertDiagnosticOpen();
|
|
111
|
+
else
|
|
112
|
+
this.assertOpen();
|
|
113
|
+
await Reflect.apply(write, destination, [bytes(value)]);
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
if (!diagnostic)
|
|
117
|
+
this.budget.retain(-value.length * 3);
|
|
118
|
+
}
|
|
119
|
+
}, diagnostic);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
export class Reader {
|
|
123
|
+
name;
|
|
124
|
+
lifecycle;
|
|
125
|
+
iterator;
|
|
126
|
+
chunk = new Uint8Array();
|
|
127
|
+
offset = 0;
|
|
128
|
+
ended = false;
|
|
129
|
+
empties = 0;
|
|
130
|
+
snapshotBytes = 0;
|
|
131
|
+
closed;
|
|
132
|
+
constructor(name, lifecycle) {
|
|
133
|
+
this.name = name;
|
|
134
|
+
this.lifecycle = lifecycle;
|
|
135
|
+
lifecycle.budget.retain(256);
|
|
136
|
+
lifecycle.cleanup(this.close);
|
|
137
|
+
}
|
|
138
|
+
close = () => this.closed ??= Promise.resolve().then(async () => {
|
|
139
|
+
try {
|
|
140
|
+
if (!this.ended)
|
|
141
|
+
await this.iterator?.return?.();
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
this.iterator = undefined;
|
|
145
|
+
this.releaseSnapshot();
|
|
146
|
+
this.lifecycle.budget.retain(-this.chunk.length - 256);
|
|
147
|
+
this.chunk = new Uint8Array();
|
|
148
|
+
this.lifecycle.forget(this.close);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
releaseSnapshot = () => {
|
|
152
|
+
this.lifecycle.budget.retain(-this.snapshotBytes);
|
|
153
|
+
this.snapshotBytes = 0;
|
|
154
|
+
};
|
|
155
|
+
async open() {
|
|
156
|
+
const { budget } = this.lifecycle;
|
|
157
|
+
await this.lifecycle.operation(async () => {
|
|
158
|
+
let source;
|
|
159
|
+
let needsAcquisitionCleanup = false;
|
|
160
|
+
if (this.name === undefined)
|
|
161
|
+
source = budget.context.stdin;
|
|
162
|
+
else {
|
|
163
|
+
if (this.name === "")
|
|
164
|
+
throw new FsError("ENOENT", { path: this.name });
|
|
165
|
+
const cwd = budget.context.cwd;
|
|
166
|
+
this.lifecycle.assertOpen();
|
|
167
|
+
const path = resolvePath(cwd, pathText(this.name));
|
|
168
|
+
const fs = budget.context.fs;
|
|
169
|
+
this.lifecycle.assertOpen();
|
|
170
|
+
const statMethod = fs.stat;
|
|
171
|
+
this.lifecycle.assertOpen();
|
|
172
|
+
const stat = await Reflect.apply(statMethod, fs, [path, { signal: budget.signal }]);
|
|
173
|
+
this.lifecycle.assertOpen();
|
|
174
|
+
const type = stat.type;
|
|
175
|
+
this.lifecycle.assertOpen();
|
|
176
|
+
if (this.name.endsWith("/") && type !== "directory")
|
|
177
|
+
throw new FsError("ENOTDIR", { path });
|
|
178
|
+
if (type === "directory")
|
|
179
|
+
throw new FsError("EISDIR", { path });
|
|
180
|
+
if (type !== "file" && type !== "character")
|
|
181
|
+
throw new FsError("ENOTSUP", { path });
|
|
182
|
+
const capabilitiesFor = fs.capabilitiesFor;
|
|
183
|
+
this.lifecycle.assertOpen();
|
|
184
|
+
const selected = capabilitiesFor ? await Reflect.apply(capabilitiesFor, fs, [path, { signal: budget.signal }]) : undefined;
|
|
185
|
+
this.lifecycle.assertOpen();
|
|
186
|
+
const capabilities = selected ?? fs.capabilities;
|
|
187
|
+
this.lifecycle.assertOpen();
|
|
188
|
+
const readStream = fs.readStream;
|
|
189
|
+
this.lifecycle.assertOpen();
|
|
190
|
+
const streamingRead = readStream && capabilities.streamingRead !== false;
|
|
191
|
+
this.lifecycle.assertOpen();
|
|
192
|
+
if (readStream && streamingRead) {
|
|
193
|
+
source = Reflect.apply(readStream, fs, [path, { signal: budget.signal, chunkSize: 16_384 }]);
|
|
194
|
+
needsAcquisitionCleanup = budget.signal.aborted || budget.admission.closed;
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
const maximum = Math.min(budget.limits.maxInputBytes, Math.floor(budget.limits.maxBufferedBytes / 2));
|
|
198
|
+
const size = stat.size;
|
|
199
|
+
this.lifecycle.assertOpen();
|
|
200
|
+
budget.check(size, maximum, "buffered input bytes");
|
|
201
|
+
budget.retain(maximum);
|
|
202
|
+
this.snapshotBytes = maximum;
|
|
203
|
+
const readFile = fs.readFile;
|
|
204
|
+
this.lifecycle.assertOpen();
|
|
205
|
+
const content = await Reflect.apply(readFile, fs, [path, { signal: budget.signal, maxBytes: maximum }]);
|
|
206
|
+
this.lifecycle.assertOpen();
|
|
207
|
+
if (!(content instanceof Uint8Array))
|
|
208
|
+
throw new TypeError("hexdump input requires bytes");
|
|
209
|
+
const length = viewLength.call(content);
|
|
210
|
+
budget.check(length, maximum, "buffered input bytes");
|
|
211
|
+
budget.retain(length - maximum);
|
|
212
|
+
this.snapshotBytes = length;
|
|
213
|
+
const { releaseSnapshot } = this;
|
|
214
|
+
source = { async *[Symbol.asyncIterator]() { try {
|
|
215
|
+
yield content;
|
|
216
|
+
}
|
|
217
|
+
finally {
|
|
218
|
+
releaseSnapshot();
|
|
219
|
+
} } };
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
if (!needsAcquisitionCleanup)
|
|
223
|
+
this.lifecycle.assertOpen();
|
|
224
|
+
const factory = source[Symbol.asyncIterator];
|
|
225
|
+
if (!needsAcquisitionCleanup)
|
|
226
|
+
this.lifecycle.assertOpen();
|
|
227
|
+
this.iterator = Reflect.apply(factory, source, []);
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
async get() {
|
|
231
|
+
const { budget } = this.lifecycle;
|
|
232
|
+
budget.charge();
|
|
233
|
+
await budget.checkpointWork();
|
|
234
|
+
while (this.offset === this.chunk.length) {
|
|
235
|
+
if (this.ended)
|
|
236
|
+
return -1;
|
|
237
|
+
await budget.checkpointWork();
|
|
238
|
+
const next = await this.lifecycle.operation(() => {
|
|
239
|
+
const iterator = this.iterator;
|
|
240
|
+
const advance = iterator.next;
|
|
241
|
+
this.lifecycle.assertOpen();
|
|
242
|
+
return Reflect.apply(advance, iterator, []);
|
|
243
|
+
});
|
|
244
|
+
budget.retain(-this.chunk.length);
|
|
245
|
+
this.chunk = new Uint8Array();
|
|
246
|
+
this.offset = 0;
|
|
247
|
+
const done = next.done;
|
|
248
|
+
this.lifecycle.assertOpen();
|
|
249
|
+
if (done) {
|
|
250
|
+
this.ended = true;
|
|
251
|
+
this.iterator = undefined;
|
|
252
|
+
return -1;
|
|
253
|
+
}
|
|
254
|
+
const value = next.value;
|
|
255
|
+
this.lifecycle.assertOpen();
|
|
256
|
+
if (!(value instanceof Uint8Array))
|
|
257
|
+
throw new TypeError("hexdump input requires bytes");
|
|
258
|
+
const buffer = viewBuffer.call(value);
|
|
259
|
+
const offset = viewOffset.call(value);
|
|
260
|
+
const length = viewLength.call(value);
|
|
261
|
+
this.lifecycle.assertOpen();
|
|
262
|
+
budget.inputBytes(length);
|
|
263
|
+
budget.charge(length);
|
|
264
|
+
budget.retain(length);
|
|
265
|
+
try {
|
|
266
|
+
if (viewOffset.call(value) !== offset || viewLength.call(value) < length)
|
|
267
|
+
throw new TypeError("hexdump input extent changed during admission");
|
|
268
|
+
this.chunk = new Uint8Array(new Uint8Array(buffer, offset, length));
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
budget.retain(-length);
|
|
272
|
+
throw error;
|
|
273
|
+
}
|
|
274
|
+
if (!this.chunk.length)
|
|
275
|
+
budget.check(++this.empties, budget.limits.maxEmptyChunks, "empty input chunks");
|
|
276
|
+
}
|
|
277
|
+
return this.chunk[this.offset++];
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
export function fsDetail(error) {
|
|
281
|
+
const details = {
|
|
282
|
+
EACCES: "Permission denied", EPERM: "Operation not permitted", ENOENT: "No such file or directory",
|
|
283
|
+
EISDIR: "Is a directory", ENOTDIR: "Not a directory", EIO: "Input/output error", ELOOP: "Too many levels of symbolic links",
|
|
284
|
+
ENAMETOOLONG: "File name too long", ENOTSUP: "Operation not supported",
|
|
285
|
+
};
|
|
286
|
+
return details[error.code] ?? error.message;
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=io.js.map
|