@poe-platform/safe-bash 0.1.710 → 0.1.712
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -1
- package/dist/safe-bash/commands/fmt/index.d.ts +2 -0
- package/dist/safe-bash/commands/fmt/index.d.ts.map +1 -0
- package/dist/safe-bash/commands/fmt/index.js +2 -0
- package/dist/safe-bash/commands/fmt/index.js.map +1 -0
- package/dist/safe-bash/commands/fmt.d.ts +1 -2
- package/dist/safe-bash/commands/fmt.d.ts.map +1 -1
- package/dist/safe-bash/commands/fmt.js +1 -838
- package/dist/safe-bash/commands/fmt.js.map +1 -1
- package/dist/safe-bash/commands/time-env/printenv.d.ts +1 -1
- package/dist/safe-bash/commands/time-env/printenv.d.ts.map +1 -1
- package/dist/safe-bash/commands/time-env/sleep.d.ts +1 -1
- package/dist/safe-bash/commands/time-env/sleep.d.ts.map +1 -1
- package/dist/safe-bash/core.browser.js +155 -2099
- package/dist/safe-bash/core.browser.js.map +3 -3
- package/dist/safe-bash/playwright/private-target-transport.d.ts.map +1 -1
- package/dist/safe-bash/playwright/private-target-transport.js +18 -2
- package/dist/safe-bash/playwright/private-target-transport.js.map +1 -1
- package/dist/safe-bash/playwright/profile.d.ts +3 -1
- package/dist/safe-bash/playwright/profile.d.ts.map +1 -1
- package/dist/safe-bash/playwright/profile.js +3 -3
- package/dist/safe-bash/playwright/profile.js.map +1 -1
- package/dist/safe-bash-command-exiftool/index.js +1401 -6
- package/dist/safe-bash-command-exiftool/index.js.map +7 -0
- package/dist/safe-bash-command-fmt/arguments.d.ts +8 -0
- package/dist/safe-bash-command-fmt/command.d.ts +20 -0
- package/dist/safe-bash-command-fmt/contracts.d.ts +42 -0
- package/dist/safe-bash-command-fmt/engine.d.ts +20 -0
- package/dist/safe-bash-command-fmt/index.d.ts +5 -0
- package/dist/safe-bash-command-fmt/index.js +2419 -0
- package/dist/safe-bash-command-fmt/index.js.map +7 -0
- package/dist/safe-bash-command-fmt/sdk.d.ts +15 -0
- package/dist/safe-bash-command-wkhtmltopdf/index.js +1458 -7
- package/dist/safe-bash-command-wkhtmltopdf/index.js.map +7 -0
- package/dist/safe-bash-contracts/index.d.ts +8 -0
- package/dist/safe-bash-contracts/index.js +8 -0
- package/dist/safe-playwright-cloudflare/browser-run-code.js +15 -1
- package/package.json +6 -2
- package/dist/safe-bash-command-exiftool/argfiles.js +0 -163
- package/dist/safe-bash-command-exiftool/arguments.js +0 -128
- package/dist/safe-bash-command-exiftool/command.js +0 -324
- package/dist/safe-bash-command-exiftool/csv.js +0 -78
- package/dist/safe-bash-command-exiftool/paths.js +0 -18
- package/dist/safe-bash-command-exiftool/png.js +0 -308
- package/dist/safe-bash-command-exiftool/publication.js +0 -80
- package/dist/safe-bash-command-exiftool/registry.js +0 -14
- package/dist/safe-bash-command-exiftool/resources.js +0 -29
- package/dist/safe-bash-command-exiftool/scalar.js +0 -103
- package/dist/safe-bash-command-exiftool/sdk.js +0 -113
- package/dist/safe-bash-command-exiftool/shifts.js +0 -29
- package/dist/safe-bash-command-wkhtmltopdf/command.js +0 -373
- package/dist/safe-bash-command-wkhtmltopdf/engine.js +0 -99
- package/dist/safe-bash-command-wkhtmltopdf/errors.js +0 -11
- package/dist/safe-bash-command-wkhtmltopdf/limits.js +0 -69
- package/dist/safe-bash-command-wkhtmltopdf/outcome.js +0 -38
- package/dist/safe-bash-command-wkhtmltopdf/parser.js +0 -146
- package/dist/safe-bash-command-wkhtmltopdf/resources.js +0 -284
- package/dist/safe-bash-command-wkhtmltopdf/settings.js +0 -35
- package/dist/safe-bash-command-wkhtmltopdf/switches.js +0 -127
- package/dist/safe-bash-command-wkhtmltopdf/values.js +0 -66
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["command.js", "registry.js", "arguments.js", "resources.js", "shifts.js", "png.js", "publication.js", "scalar.js", "csv.js", "argfiles.js", "paths.js", "sdk.js"],
|
|
4
|
+
"sourcesContent": ["import { commandRuntimeIdentity, getCommandArguments } from \"safe-bash-contracts/command\";\nimport { FsError } from \"safe-bash-contracts/errors\";\nimport { readBytes, writeBytes } from \"safe-bash-contracts/io\";\nimport { createOutputOperation } from \"safe-bash-contracts/output\";\nimport { shellValueByteLength } from \"safe-bash-contracts/value\";\nimport { parseArguments } from \"./arguments.js\";\nimport { inspectPng, editPng } from \"./png.js\";\nimport { Publication } from \"./publication.js\";\nimport { Resources, ResourceLimitError } from \"./resources.js\";\nimport { encodeJsonScalar, printable } from \"./scalar.js\";\nimport { exiftoolRegistry } from \"./registry.js\";\nimport { isNumericShift } from \"./shifts.js\";\nimport { CsvTable } from \"./csv.js\";\nimport { expandArgfiles } from \"./argfiles.js\";\nimport { virtualPath } from \"./paths.js\";\nfunction selected(tags, names, duplicates, resources) {\n resources.admit(\"work\", tags.length + names.length);\n resources.admit(\"retained\", tags.length * 32);\n const requested = names.length ? names : [...new Set(tags.map(tag => tag.name))];\n const requestedExtent = requested.reduce((sum, name) => sum + name.length + 1, 0);\n const tagExtent = tags.reduce((sum, tag) => sum + tag.name.length + 1, 0);\n // Includes per-predicate lowercasing/comparison and every transient matching\n // array, plus selected output references. Admit before the multiplicative loop.\n resources.admit(\"work\", tags.length * requestedExtent + tagExtent * requested.length * 2);\n resources.admit(\"retained\", requested.length * (128 + tags.length * 16));\n const values = [];\n for (const name of requested) {\n const matching = tags.filter(tag => tag.name.toLowerCase() === name.toLowerCase());\n if (duplicates)\n values.push(...matching);\n else if (matching.length)\n values.push(matching[matching.length - 1]);\n }\n return values;\n}\nexport function createExiftoolCommand(options = {}) {\n const limits = Object.freeze({ ...options.limits });\n return Object.freeze({\n name: \"exiftool\", runtimeIdentity: commandRuntimeIdentity,\n description: \"Inspect and edit admitted PNG metadata through virtual files\",\n async execute(context) {\n const publication = new Publication(context);\n let stdout, stderr;\n let failed = false, failure;\n let closing;\n const cleanup = () => {\n closing ??= (async () => {\n const results = await Promise.allSettled([publication.close(), stdout?.close(), stderr?.close()]);\n const failures = results.filter(result => result.status === \"rejected\").map(result => result.reason);\n if (failures.length) {\n if (failed)\n failures.unshift(failure);\n throw new AggregateError(failures, \"ExifTool invocation and cleanup failed\");\n }\n })();\n return closing;\n };\n context.registerCleanup?.(cleanup);\n try {\n stdout = createOutputOperation(context, context.stdout);\n stderr = createOutputOperation(context, context.stderr);\n const resources = new Resources({ ...limits, signal: context.signal });\n const output = async (text, error = false) => {\n resources.admit(\"work\", text.length * 2);\n resources.admit(\"output\", text.length * 3);\n resources.admit(\"retained\", text.length * 5);\n await writeBytes(error ? stderr.output : stdout.output, new TextEncoder().encode(text), context.signal);\n };\n let invocation;\n try {\n const carrier = getCommandArguments(context);\n for (let index = 0; index < carrier.values.length; index++) {\n const extent = shellValueByteLength(carrier.values[index]);\n resources.admit(\"decoded\", context.args[index].length * 2);\n resources.admit(\"retained\", extent + 128);\n resources.admit(\"work\", extent * 4);\n const bytes = carrier.bytes(index);\n try {\n if (new TextDecoder(\"utf-8\", { fatal: true, ignoreBOM: true }).decode(bytes) !== context.args[index])\n throw new Error(\"Argv Unicode mismatch\");\n }\n catch {\n throw new Error(\"Only qualified UTF-8 argv is currently supported\");\n }\n }\n invocation = parseArguments(await expandArgfiles(context.args, context, publication, resources), resources.limits);\n }\n catch (error) {\n context.signal.throwIfAborted();\n if (error instanceof ResourceLimitError)\n throw error;\n await output(\"Error: \" + (error instanceof Error ? error.message : String(error)) + \"\\n\", true);\n return { exitCode: 1 };\n }\n const json = [];\n const csv = invocation.csv ? new CsvTable(resources, invocation.missing, invocation.tags) : undefined;\n const assignment = invocation.assignments.length === 1 ? invocation.assignments[0] : undefined;\n if (assignment?.operation === \"add\" && Object.hasOwn(exiftoolRegistry.scalarShiftErrorGroups, assignment.name) && !isNumericShift(assignment.value)) {\n await output(\"Warning: Shift value for \" + exiftoolRegistry.scalarShiftErrorGroups[assignment.name] + \":\" + assignment.name + \" is not a number\\nNothing to do.\\n\", true);\n return { exitCode: 1 };\n }\n let errors = 0, updated = 0, created = 0, unchanged = 0, read = 0;\n for (const file of invocation.files) {\n let tags = [];\n try {\n const path = file === \"-\" ? \"-\" : virtualPath(context.cwd, file, resources);\n const original = file === \"-\" ? undefined : await publication.track(() => context.fs.lstat(path, { signal: context.signal }));\n if (original && original.type !== \"file\")\n throw new Error(\"Only regular VFS files are admitted\");\n if (original) {\n resources.admit(\"input\", original.size);\n resources.admit(\"retained\", original.size * 32 + 256);\n resources.admit(\"decoded\", original.size * 2);\n resources.admit(\"work\", original.size * 20);\n }\n const bytes = await publication.track(async () => {\n if (original && !context.fs.readStream) {\n const result = await context.fs.readFile(path, { signal: context.signal, maxBytes: original.size });\n context.signal.throwIfAborted();\n if (result.length > original.size)\n throw new RangeError(\"ExifTool input grew beyond admitted size\");\n return result;\n }\n const chunks = [];\n let size = 0;\n const source = original ? context.fs.readStream(path, { signal: context.signal }) : context.stdin;\n for await (const chunk of readBytes(source, context.signal)) {\n resources.admit(\"work\", chunk.length + 64);\n if (original && chunk.length > original.size - size)\n throw new RangeError(\"ExifTool input grew beyond admitted size\");\n if (!original) {\n resources.admit(\"input\", chunk.length);\n resources.admit(\"retained\", chunk.length * 32 + 256);\n resources.admit(\"decoded\", chunk.length * 2);\n resources.admit(\"work\", chunk.length * 20);\n }\n resources.admit(\"retained\", chunk.length + 128);\n if (chunk.length)\n chunks.push(new Uint8Array(chunk));\n size += chunk.length;\n }\n resources.admit(\"retained\", size);\n const result = new Uint8Array(size);\n let position = 0;\n for (const chunk of chunks) {\n result.set(chunk, position);\n position += chunk.length;\n }\n return result;\n });\n if (!bytes.length)\n throw new Error(\"File is empty\");\n const extension = file.slice(file.lastIndexOf(\".\") + 1).toUpperCase();\n if (invocation.assignments.length && [\"DOCX\", \"PPTX\", \"XLSX\"].includes(extension))\n throw new Error(\"Writing of \" + extension + \" files is not yet supported\");\n if (extension === \"PDF\")\n throw new Error(\"PDF parser/writer not yet supported; metadata deletion retains historical revisions and never guarantees redaction\");\n const png = bytes.length >= 8 && bytes[0] === 137 && bytes[1] === 80 && bytes[2] === 78 && bytes[3] === 71;\n if (invocation.assignments.length) {\n if (!original)\n throw new Error(\"Writing stdin metadata is not yet supported\");\n if (!png)\n throw new Error(\"Format writer not yet supported\");\n const edited = editPng(bytes, invocation.assignments, resources);\n resources.admit(\"retained\", edited.length * 3);\n resources.admit(\"work\", bytes.length);\n if (invocation.destination === undefined && !invocation.assignments.some(op => op.operation === \"set\" && op.value !== \"\") && edited.length === bytes.length && edited.every((byte, index) => byte === bytes[index])) {\n unchanged++;\n continue;\n }\n resources.admit(\"output\", edited.length);\n const inPlace = invocation.overwrite === \"in-place\";\n const destination = invocation.destination === undefined ? path : virtualPath(context.cwd, invocation.destination, resources);\n if (invocation.destination === undefined) {\n await publication.track(() => context.fs.access(path, 2, { signal: context.signal }));\n if (!inPlace && original.nlink !== 1)\n throw new Error(\"VFS hardlink replacement is not yet supported\");\n if (invocation.overwrite === \"backup\") {\n const backup = path + \"_original\";\n let existing = false;\n try {\n await publication.track(() => context.fs.lstat(backup, { signal: context.signal }));\n existing = true;\n }\n catch (error) {\n if (!(error instanceof FsError) || error.code !== \"ENOENT\")\n throw error;\n }\n if (!existing) {\n resources.admit(\"output\", bytes.length);\n await publication.publish(backup, bytes, null, false);\n }\n }\n }\n await publication.publish(destination, edited, invocation.destination === undefined ? original : null, invocation.destination === undefined && inPlace);\n if (invocation.destination === undefined)\n updated++;\n else\n created++;\n continue;\n }\n // Unrecognized nonempty formats match the validated no-selected-tag control.\n if (!png && [\"XMP\", \"DOCX\", \"PPTX\", \"XLSX\", \"JPG\", \"JPEG\", \"TIF\", \"TIFF\"].includes(extension))\n throw new Error(extension + \" reader not yet supported\");\n tags = png ? inspectPng(bytes, resources).tags : [];\n }\n catch (error) {\n context.signal.throwIfAborted();\n if (error instanceof ResourceLimitError)\n throw error;\n errors++;\n const message = error instanceof FsError && error.code === \"ENOENT\" ? \"File not found\" : error instanceof Error ? error.message : String(error);\n await output(\"Error: \" + message + \" - \" + file + \"\\n\", true);\n continue;\n }\n read++;\n const chosen = selected(tags, invocation.tags, invocation.json ? invocation.groupFamily === 4 : invocation.duplicates && !invocation.csv, resources);\n if (csv) {\n csv.add(file, chosen);\n continue;\n }\n const present = new Set();\n if (invocation.missing) {\n resources.admit(\"retained\", chosen.length * 64);\n for (const tag of chosen) {\n resources.admit(\"work\", tag.name.length + 1);\n present.add(tag.name);\n }\n resources.admit(\"work\", invocation.tags.reduce((sum, name) => sum + name.length + 1, 0));\n }\n const scalarOptions = { quoteScalars: invocation.quoteScalars, signal: context.signal,\n maxDecodedBytes: resources.limits.maxDecodedBytes, maxOutputBytes: resources.limits.maxOutputBytes, maxWork: resources.limits.maxWork, maxRetainedBytes: resources.limits.maxRetainedBytes };\n if (invocation.json) {\n const entries = [' \"SourceFile\": ' + encodeJsonScalar(file, { ...scalarOptions, quoteScalars: true })];\n const tokens = new Set(['\"SourceFile\"']);\n const primaryInstances = new Map();\n if (invocation.groupFamily === 4)\n for (const tag of tags) {\n resources.admit(\"work\", tag.name.length + 1);\n resources.admit(\"retained\", tag.name.length * 2 + 64);\n primaryInstances.set(tag.name, Math.max(primaryInstances.get(tag.name) ?? 0, tag.instance));\n }\n for (const tag of chosen) {\n resources.admit(\"work\", tag.name.length * 4);\n const name = invocation.groupFamily === 4 ? (tag.instance === primaryInstances.get(tag.name) ? \"\" : \"Copy\" + (tag.instance + 1)) + \":\" + tag.name : tag.name;\n const token = encodeJsonScalar(name, { ...scalarOptions, quoteScalars: true });\n if (tokens.has(token))\n continue;\n tokens.add(token);\n resources.admit(\"work\", tag.value.length * 4);\n entries.push(\" \" + token + \": \" + encodeJsonScalar(tag.value, scalarOptions));\n }\n if (invocation.missing)\n for (const name of invocation.tags) {\n if (present.has(name))\n continue;\n resources.admit(\"work\", name.length * 4 + 1);\n const token = encodeJsonScalar((invocation.groupFamily === 4 ? \":\" : \"\") + name, { ...scalarOptions, quoteScalars: true });\n if (tokens.has(token))\n continue;\n tokens.add(token);\n entries.push(\" \" + token + ': \"-\"');\n }\n const record = \"{\\n\" + entries.join(\",\\n\") + \"\\n}\";\n resources.admit(\"retained\", record.length * 2);\n json.push(record);\n }\n else {\n for (const tag of chosen) {\n if (invocation.binary) {\n // -b suppresses PrintConv, not ValueConv. tEXt's stored Latin-1\n // and tIME's packed fields therefore differ from output bytes.\n const converted = tag.chunkType !== \"iTXt\";\n const extent = converted ? tag.value.length * 3 : tag.raw.length;\n resources.admit(\"work\", extent);\n resources.admit(\"output\", extent);\n if (converted)\n resources.admit(\"retained\", extent);\n await writeBytes(stdout.output, converted ? new TextEncoder().encode(tag.value) : tag.raw, context.signal);\n }\n else {\n resources.admit(\"work\", (tag.name.length + tag.value.length) * 4);\n const value = printable(tag.value, scalarOptions);\n await output(invocation.style === \"values\" ? value + \"\\n\" : (invocation.style === \"compact\" ? tag.name + \": \" : tag.name.padEnd(32) + \": \") + value + \"\\n\");\n }\n }\n if (invocation.missing && !invocation.binary)\n for (const name of invocation.tags) {\n if (!present.has(name))\n await output(invocation.style === \"values\" ? \"-\\n\" : (invocation.style === \"compact\" ? name + \": \" : name.padEnd(32) + \": \") + \"-\\n\");\n }\n }\n }\n if (invocation.json && !invocation.assignments.length)\n await output(\"[\" + json.join(\",\\n\") + \"]\\n\");\n if (csv) {\n await output(csv.render());\n if (invocation.files.length > 1)\n await output(String(read).padStart(5) + \" image files read\\n\", true);\n }\n if (updated || unchanged)\n await output(String(updated).padStart(5) + \" image files updated\\n\");\n if (created)\n await output(String(created).padStart(5) + \" image files created\\n\");\n if (unchanged)\n await output(String(unchanged).padStart(5) + \" image files unchanged\\n\");\n return { exitCode: errors ? 1 : 0 };\n }\n catch (error) {\n failed = true;\n failure = error;\n throw error;\n }\n finally {\n await cleanup();\n }\n },\n });\n}\nexport const exiftoolCommand = createExiftoolCommand();\nexport function exiftoolCommands(options = {}) {\n const command = createExiftoolCommand(options);\n return { name: \"exiftool\", setup(host) { host.commands.register(command); } };\n}\n", "/** Independently admitted format/tag subset; this is not the full upstream catalog. */\nconst textChunks = Object.freeze([\"tEXt\", \"iTXt\"]);\nconst writeChunks = Object.freeze({\n Title: textChunks, Author: textChunks, Description: textChunks,\n Comment: textChunks, Copyright: textChunks, ModifyDate: Object.freeze([\"tIME\"]),\n});\nexport const exiftoolRegistry = Object.freeze({\n version: 2,\n source: Object.freeze({ version: \"13.59\", commit: \"2200871d9cef988051d2a99d67df3bda6cbb30a8\", archiveSha256: \"e1e2ad6c6fbf568afee5993ef8b2b91ab013d21698c9304e079e633ad82776f5\" }),\n formats: Object.freeze({ PNG: Object.freeze({ reader: \"uncompressed-text-time\", writer: \"selected-text-time\" }) }),\n tags: Object.freeze(Object.keys(writeChunks)),\n writeChunks,\n scalarShiftErrorGroups: Object.freeze({ Title: \"XMP-xmp\" }),\n});\n", "import { exiftoolRegistry } from \"./registry.js\";\nexport function parseArguments(args, limits) {\n if (args.length > 4096)\n throw new RangeError(\"ExifTool argument count exceeded\");\n let extent = 0;\n for (const arg of args) {\n extent += arg.length * 2;\n if (extent > limits.maxDecodedBytes)\n throw new RangeError(\"ExifTool argument decoded budget exceeded\");\n }\n const result = { files: [], tags: [], assignments: [], json: false, csv: false, quoteScalars: false, duplicates: false,\n binary: false, missing: false, style: \"short\", overwrite: \"backup\", destination: undefined, groupFamily: undefined };\n let literal = false;\n let valueConvSelector = false;\n for (let index = 0; index < args.length; index++) {\n const arg = args[index];\n const option = arg.toLowerCase();\n const value = () => { if (++index >= args.length)\n throw new Error(\"Missing argument for \" + arg); return args[index]; };\n if (literal || !arg.startsWith(\"-\") || arg === \"-\") {\n result.files.push(arg);\n continue;\n }\n if (arg === \"--\") {\n literal = true;\n continue;\n }\n if (option === \"-config\") {\n if (value() !== \"\")\n throw new Error(\"User configuration modules are not supported\");\n continue;\n }\n if (option === \"-j\" || option === \"-json\") {\n result.json = true;\n continue;\n }\n if (option === \"-csv\") {\n result.csv = true;\n continue;\n }\n if (arg === \"-G4\") {\n result.groupFamily = 4;\n continue;\n }\n if (option === \"-api\") {\n if (value().toLowerCase() !== \"structformat=jsonq\")\n throw new Error(\"API option not yet supported\");\n result.quoteScalars = true;\n continue;\n }\n if (option === \"-a\") {\n result.duplicates = true;\n continue;\n }\n if (option === \"-b\") {\n result.binary = true;\n continue;\n }\n if (option === \"-f\") {\n result.missing = true;\n continue;\n }\n if (arg === \"-S\") {\n result.style = \"compact\";\n continue;\n }\n if (option === \"-s\" || option === \"-s1\") {\n result.style = \"short\";\n continue;\n }\n if (option === \"-s3\") {\n result.style = \"values\";\n continue;\n }\n if (option === \"-n\")\n continue; // admitted PNG text tags have no PrintConv\n if (option === \"-overwrite_original\") {\n result.overwrite = \"replace\";\n continue;\n }\n if (option === \"-overwrite_original_in_place\") {\n result.overwrite = \"in-place\";\n continue;\n }\n if (option === \"-o\") {\n result.destination = value();\n continue;\n }\n if ([\"-if\", \"-p\", \"-stay_open\", \"-@\", \"-common_args\"].includes(option) || option.startsWith(\"-execute\"))\n throw new Error(\"ExifTool option not yet supported (no code evaluation or ambient polling): \" + arg);\n const equals = arg.indexOf(\"=\");\n let name = arg.slice(1, equals < 0 ? undefined : equals);\n const operation = name.endsWith(\"+\") ? \"add\" : name.endsWith(\"-\") ? \"remove\" : \"set\";\n if (operation !== \"set\")\n name = name.slice(0, -1);\n if (name.endsWith(\"#\")) {\n if (equals < 0)\n valueConvSelector = true;\n name = name.slice(0, -1);\n }\n const known = exiftoolRegistry.tags.find(tag => tag.toLowerCase() === name.toLowerCase());\n if (equals >= 0)\n result.assignments.push({ name: known ?? name, operation, value: arg.slice(equals + 1) });\n else if (known || name === \"MissingTag\")\n result.tags.push(known ?? name);\n else\n throw new Error(\"ExifTool option/tag not yet supported: \" + arg);\n }\n if (!result.files.length)\n throw new Error(\"No file specified\");\n if (result.files.filter(file => file === \"-\").length > 1)\n throw new Error(\"Repeated stdin operands are not supported\");\n if (result.files.includes(\"-\") && result.assignments.length)\n throw new Error(\"Writing stdin metadata is not yet supported\");\n if (result.files.length > 64)\n throw new RangeError(\"ExifTool file count exceeded\");\n if (result.destination !== undefined && (result.files.length !== 1 || !result.assignments.length))\n throw new Error(\"-o requires a single file with tag assignments in this profile\");\n if (result.json && result.binary)\n throw new Error(\"JSON binary policy not yet supported\");\n if (result.csv && (result.json || result.binary || result.assignments.length))\n throw new Error(\"CSV combined output/import policy not yet supported\");\n if (result.csv && valueConvSelector)\n throw new Error(\"CSV ValueConv-qualified headers not yet supported\");\n if (result.groupFamily !== undefined && (!result.json || result.assignments.length))\n throw new Error(\"Group-family qualification outside JSON not yet supported\");\n return result;\n}\n", "export const exiftoolLimits = Object.freeze({\n maxInputBytes: 16_777_216, maxDecodedBytes: 8_388_608,\n maxRetainedBytes: 33_554_432, maxOutputBytes: 16_777_216, maxWork: 268_435_456,\n});\nexport class ResourceLimitError extends RangeError {\n}\n/** Cumulative admission for a single operation. No recursive parser is admitted. */\nexport class Resources {\n limits;\n signal;\n usage = { input: 0, decoded: 0, retained: 0, output: 0, work: 0 };\n constructor(options) {\n this.signal = options.signal;\n this.signal.throwIfAborted();\n this.limits = Object.freeze({ ...exiftoolLimits, ...options });\n for (const key of Object.keys(exiftoolLimits)) {\n if (!Number.isSafeInteger(this.limits[key]) || this.limits[key] < 0)\n throw new RangeError(\"Invalid resource limit: \" + key);\n }\n }\n admit(kind, amount) {\n this.signal.throwIfAborted();\n const limits = { input: \"maxInputBytes\", decoded: \"maxDecodedBytes\", retained: \"maxRetainedBytes\", output: \"maxOutputBytes\", work: \"maxWork\" };\n const total = this.usage[kind] + amount;\n if (!Number.isSafeInteger(amount) || amount < 0 || !Number.isSafeInteger(total) || total > this.limits[limits[kind]])\n throw new ResourceLimitError(\"ExifTool \" + kind + \" budget exceeded\");\n this.usage[kind] = total;\n }\n}\n", "/** Numeric shift grammar differs from conservative JSON token admission. */\nexport function isNumericShift(value) {\n const end = value.endsWith(\"\\n\") ? value.length - 1 : value.length;\n let index = value[0] === \"+\" || value[0] === \"-\" ? 1 : 0;\n const digit = () => index < end && value.charCodeAt(index) >= 48 && value.charCodeAt(index) <= 57;\n const start = index;\n while (digit())\n index++;\n let digits = index - start;\n if (value[index] === \".\" || value[index] === \",\") {\n const start = ++index;\n while (digit())\n index++;\n digits += index - start;\n }\n if (!digits)\n return false;\n if (value[index] === \"e\" || value[index] === \"E\") {\n index++;\n if (value[index] === \"+\" || value[index] === \"-\")\n index++;\n const start = index;\n while (digit())\n index++;\n if (index === start)\n return false;\n }\n return index === end;\n}\n", "import { Resources } from \"./resources.js\";\nimport { exiftoolRegistry } from \"./registry.js\";\nimport { isNumericShift } from \"./shifts.js\";\nconst signature = new Uint8Array([137, 80, 78, 71, 13, 10, 26, 10]);\nconst bitDepths = Object.freeze({\n 0: [1, 2, 4, 8, 16], 2: [8, 16], 3: [1, 2, 4, 8], 4: [8, 16], 6: [8, 16],\n});\nfunction checksum(bytes) {\n let crc = 0xffffffff;\n for (const byte of bytes) {\n crc ^= byte;\n for (let bit = 0; bit < 8; bit++)\n crc = (crc >>> 1) ^ ((crc & 1) ? 0xedb88320 : 0);\n }\n return (crc ^ 0xffffffff) >>> 0;\n}\n/** Qualified fixed-width timestamp policy; no host clock or timezone conversion. */\nfunction encodePngTime(value, resources) {\n resources.admit(\"work\", value.length * 2 + 32);\n const invalid = () => { throw new Error(\"PNG timestamp syntax/range not yet supported\"); };\n const decimal = (start, end) => {\n let number = 0;\n for (let index = start; index < end; index++) {\n const digit = value.charCodeAt(index) - 48;\n if (!(digit >= 0 && digit <= 9))\n invalid();\n number = number * 10 + digit;\n }\n return number;\n };\n if (value.length < 19 || ![\":\", \"-\"].includes(value[4]) || value[7] !== value[4] ||\n ![\" \", \"T\"].includes(value[10]) || value[13] !== \":\" || value[16] !== \":\")\n invalid();\n const year = decimal(0, 4), month = decimal(5, 7), day = decimal(8, 10);\n const hour = decimal(11, 13), minute = decimal(14, 16), second = decimal(17, 19);\n if (!year || month < 1 || month > 12 || day < 1 || day > 31 || hour > 23 || minute > 59 || second > 59)\n invalid();\n let index = 19;\n if (value[index] === \".\") {\n const start = ++index;\n while (index < value.length && value.charCodeAt(index) >= 48 && value.charCodeAt(index) <= 57)\n index++;\n if (start === index)\n invalid();\n }\n if (value[index] === \"Z\")\n index++;\n else if (value[index] === \"+\" || value[index] === \"-\") {\n if (value.length - index !== 6 || value[index + 3] !== \":\" || decimal(index + 1, index + 3) > 23 || decimal(index + 4, index + 6) > 59)\n invalid();\n index += 6;\n }\n if (index !== value.length)\n invalid();\n // Native tIME ValueConvInv stores local fields, discarding fractions/offset.\n resources.admit(\"retained\", 26);\n return new Uint8Array([year >>> 8, year & 255, month, day, hour, minute, second]);\n}\n/** Chunk constructor has its own explicit extent bound for SDK callers. */\nexport function pngChunk(type, data, maxBytes = 16_777_216) {\n if (!Number.isSafeInteger(maxBytes) || maxBytes < 0 || data.length + 12 > maxBytes)\n throw new RangeError(\"PNG output budget exceeded\");\n if (type.length !== 4 || [...type].some(character => !((character >= \"A\" && character <= \"Z\") || (character >= \"a\" && character <= \"z\"))))\n throw new TypeError(\"Invalid PNG chunk type\");\n const bytes = new Uint8Array(data.length + 12);\n const view = new DataView(bytes.buffer);\n view.setUint32(0, data.length);\n for (let index = 0; index < 4; index++)\n bytes[index + 4] = type.charCodeAt(index);\n bytes.set(data, 8);\n view.setUint32(bytes.length - 4, checksum(bytes.subarray(4, bytes.length - 4)));\n return bytes;\n}\nfunction parse(input, resources) {\n resources.admit(\"input\", input.length);\n resources.admit(\"retained\", input.length);\n resources.admit(\"work\", input.length * 10);\n const bytes = new Uint8Array(input);\n if (bytes.length < 8 || signature.some((byte, index) => bytes[index] !== byte))\n throw new Error(\"Not a PNG file\");\n const view = new DataView(bytes.buffer);\n const chunks = [];\n const tags = [];\n const instances = new Map();\n let offset = 8;\n let ended = false;\n let imageData = false;\n while (offset < bytes.length) {\n resources.signal.throwIfAborted();\n resources.admit(\"retained\", 128);\n if (ended)\n throw new Error(\"PNG trailing data not yet supported\");\n if (bytes.length - offset < 12)\n throw new Error(\"PNG truncated chunk\");\n const size = view.getUint32(offset);\n if (size > bytes.length - offset - 12)\n throw new Error(\"PNG truncated chunk data\");\n const end = offset + size + 12;\n const type = String.fromCharCode(...bytes.subarray(offset + 4, offset + 8));\n if (checksum(bytes.subarray(offset + 4, end - 4)) !== view.getUint32(end - 4))\n throw new Error(\"PNG CRC mismatch\");\n const data = bytes.subarray(offset + 8, end - 4);\n if (offset === 8 && type !== \"IHDR\")\n throw new Error(\"PNG missing initial IHDR\");\n if (type === \"IHDR\") {\n if (offset !== 8 || size !== 13)\n throw new Error(\"Invalid PNG IHDR\");\n const header = new DataView(data.buffer, data.byteOffset, data.byteLength);\n if (!header.getUint32(0) || !header.getUint32(4) || header.getUint32(0) > 0x7fffffff || header.getUint32(4) > 0x7fffffff)\n throw new Error(\"Invalid PNG dimensions\");\n if (!bitDepths[data[9]]?.includes(data[8]) || data[10] !== 0 || data[11] !== 0 || data[12] > 1)\n throw new Error(\"Invalid PNG IHDR encoding fields\");\n }\n if (type === \"IDAT\")\n imageData = true;\n if (type === \"IEND\" && !imageData)\n throw new Error(\"PNG missing IDAT\");\n let tag;\n let rawName, name = \"\", value = \"\";\n let raw;\n let start = 0;\n if (type === \"zTXt\" || type === \"eXIf\")\n throw new Error(\"PNG \" + type + \" metadata not yet supported\");\n if (type === \"tEXt\" || type === \"iTXt\") {\n const separator = data.indexOf(0);\n if (separator < 1 || separator > 79)\n throw new Error(\"Invalid PNG text keyword\");\n resources.admit(\"decoded\", data.length * 2);\n resources.admit(\"work\", data.length * 8);\n const keyword = Array.from(data.subarray(0, separator), byte => String.fromCharCode(byte)).join(\"\");\n start = separator + 1;\n if (type === \"iTXt\") {\n if (start + 2 > data.length)\n throw new Error(\"PNG truncated iTXt header\");\n if (data[start] !== 0)\n throw new Error(\"PNG compressed iTXt not yet supported\");\n if (data[start + 1] !== 0)\n throw new Error(\"Invalid PNG iTXt compression method\");\n const languageEnd = data.indexOf(0, start + 2);\n const translatedEnd = languageEnd < 0 ? -1 : data.indexOf(0, languageEnd + 1);\n if (translatedEnd < 0)\n throw new Error(\"PNG truncated iTXt language fields\");\n // Language-qualified and structured metadata require namespace-aware controls.\n if (languageEnd !== start + 2 || translatedEnd !== languageEnd + 1 || keyword === \"XML:com.adobe.xmp\")\n throw new Error(\"PNG qualified/XMP iTXt not yet supported\");\n start = translatedEnd + 1;\n }\n raw = data.subarray(start);\n // Includes transient per-byte strings/array slots in the Latin-1 decoder,\n // owned raw bytes and interpreted UTF-16 strings, in addition to the input.\n resources.admit(\"retained\", raw.length + data.length * 40 + 128);\n value = type === \"tEXt\" ? Array.from(raw, byte => String.fromCharCode(byte)).join(\"\") : new TextDecoder(\"utf-8\", { ignoreBOM: true }).decode(raw);\n name = exiftoolRegistry.tags.find(name => name.toLowerCase() === keyword.toLowerCase()) ?? keyword;\n rawName = keyword;\n }\n if (type === \"tIME\") {\n if (size !== 7)\n throw new Error(\"Invalid PNG tIME length\");\n resources.admit(\"decoded\", 50);\n resources.admit(\"retained\", 256);\n resources.admit(\"work\", 128);\n rawName = \"tIME\";\n name = \"ModifyDate\";\n raw = data;\n const fields = [(data[0] << 8) | data[1], ...data.subarray(2)];\n const parts = fields.map((field, index) => String(field).padStart(index === 0 ? 4 : 2, \"0\"));\n value = parts.slice(0, 3).join(\":\") + \" \" + parts.slice(3).join(\":\");\n }\n if (rawName !== undefined && raw !== undefined) {\n const instance = instances.get(name) ?? 0;\n instances.set(name, instance + 1);\n tag = Object.freeze({ name, rawName, chunkType: type, index: chunks.length, value, raw: new Uint8Array(raw), instance, offset: offset + 8 + start, group: \"PNG\" });\n tags.push(tag);\n }\n chunks.push({ type, bytes: bytes.subarray(offset, end), ...(tag ? { tag } : {}) });\n if (type === \"IEND\") {\n if (size)\n throw new Error(\"Invalid PNG IEND\");\n ended = true;\n }\n offset = end;\n }\n if (!ended)\n throw new Error(\"PNG truncated: missing IEND\");\n return { chunks, tags };\n}\nexport function inspectPng(input, options) {\n const resources = options instanceof Resources ? options : new Resources(options);\n return Object.freeze({ tags: Object.freeze(parse(input, resources).tags) });\n}\n/** Selected scalar writes only. Unknown metadata and every other chunk stay exact. */\nexport function editPng(input, assignments, options) {\n const resources = options instanceof Resources ? options : new Resources(options);\n const { chunks } = parse(input, resources);\n resources.admit(\"retained\", assignments.length * 128);\n resources.admit(\"work\", assignments.length * (chunks.length + 1));\n const all = assignments.length === 1 && assignments[0].name.toLowerCase() === \"all\" && assignments[0].operation === \"set\" && assignments[0].value === \"\";\n if (all && chunks.some(chunk => ![\"IHDR\", \"PLTE\", \"IDAT\", \"IEND\", \"tEXt\", \"iTXt\", \"tIME\"].includes(chunk.type)))\n throw new Error(\"PNG all deletion with unqualified chunks is not yet supported\");\n const operations = new Map();\n for (const assignment of assignments) {\n resources.admit(\"decoded\", (assignment.name.length + assignment.value.length) * 2);\n resources.admit(\"work\", assignment.name.length * 5 + assignment.value.length * 3);\n resources.admit(\"work\", (chunks.length + assignments.length) * (assignment.value.length + assignment.name.length + 1));\n resources.admit(\"retained\", assignment.name.length * 10 + assignment.value.length * 6);\n if (all)\n continue;\n const name = exiftoolRegistry.tags.find(name => name.toLowerCase() === assignment.name.toLowerCase());\n if (!name)\n throw new Error(\"Tag write not yet supported: \" + assignment.name);\n if (name === \"ModifyDate\" && assignment.operation !== \"set\")\n throw new Error(\"Temporal shifts are not yet supported for ModifyDate\");\n if (assignment.operation === \"add\") {\n const group = exiftoolRegistry.scalarShiftErrorGroups[name];\n if (group && !isNumericShift(assignment.value))\n throw new Error(\"Shift value for \" + group + \":\" + name + \" is not a number\");\n throw new Error(\"Scalar numeric shifts are not yet supported for \" + name);\n }\n if (assignment.operation !== \"set\" && assignment.operation !== \"remove\")\n throw new Error(\"Invalid tag operation\");\n const prior = assignment.operation === \"set\" ? [] : operations.get(name) ?? [];\n prior.push(assignment);\n operations.set(name, prior);\n }\n const output = [signature];\n let outputSize = 8;\n resources.admit(\"output\", 8);\n const append = (bytes) => { resources.admit(\"output\", bytes.length); outputSize += bytes.length; output.push(bytes); };\n let inserted = false;\n for (const chunk of chunks) {\n if (all && chunk.tag)\n continue;\n const ops = chunk.tag && exiftoolRegistry.writeChunks[chunk.tag.name]?.includes(chunk.type) ? operations.get(chunk.tag.name) : undefined;\n if (ops?.some(op => op.operation === \"set\" || op.value === chunk.tag.value))\n continue;\n if (chunk.type === \"IDAT\" && !inserted) {\n inserted = true;\n for (const [name, ops] of operations) {\n const set = ops.find(op => op.operation === \"set\");\n if (!set?.value || ops.some(op => op.operation === \"remove\" && op.value === set.value))\n continue;\n if (name === \"ModifyDate\") {\n const data = encodePngTime(set.value, resources);\n resources.admit(\"work\", 128);\n resources.admit(\"retained\", 19);\n resources.admit(\"output\", 19);\n outputSize += 19;\n output.push(pngChunk(\"tIME\", data, 19));\n continue;\n }\n // Default native UTF-8 policy uses iTXt for every non-ASCII value,\n // including characters that could also be represented in Latin-1.\n resources.admit(\"work\", set.value.length * 2);\n let valueBytes = 0;\n let international = false;\n for (let index = 0; index < set.value.length; index++) {\n const code = set.value.charCodeAt(index);\n international ||= code > 127;\n if (code >= 0xd800 && code <= 0xdbff) {\n const next = set.value.charCodeAt(++index);\n if (!(next >= 0xdc00 && next <= 0xdfff))\n throw new Error(\"Unpaired surrogate in PNG text write\");\n valueBytes += 4;\n }\n else {\n if (code >= 0xdc00 && code <= 0xdfff)\n throw new Error(\"Unpaired surrogate in PNG text write\");\n valueBytes += code < 128 ? 1 : code < 2048 ? 2 : 3;\n }\n }\n const prefix = name + (international ? \"\\0\\0\\0\\0\\0\" : \"\\0\");\n const dataSize = prefix.length + valueBytes;\n const size = dataSize + 12;\n resources.admit(\"work\", dataSize * 12);\n resources.admit(\"retained\", prefix.length * 2 + valueBytes + dataSize + size);\n resources.admit(\"output\", size);\n const data = new Uint8Array(dataSize);\n for (let index = 0; index < prefix.length; index++)\n data[index] = prefix.charCodeAt(index);\n data.set(new TextEncoder().encode(set.value), prefix.length);\n outputSize += size;\n output.push(pngChunk(international ? \"iTXt\" : \"tEXt\", data, size));\n // Native PNG scalar writes replace each existing text instance rather\n // than collapsing duplicates. A missing tag creates one new instance.\n let instances = 0;\n for (const existing of chunks) {\n resources.signal.throwIfAborted();\n resources.admit(\"work\", 1);\n if (existing.tag?.name === name && exiftoolRegistry.writeChunks[name]?.includes(existing.type))\n instances++;\n }\n for (let instance = 1; instance < instances; instance++)\n append(output[output.length - 1]);\n }\n }\n append(chunk.bytes);\n }\n resources.admit(\"retained\", outputSize);\n resources.admit(\"work\", outputSize);\n const result = new Uint8Array(outputSize);\n let position = 0;\n for (const bytes of output) {\n result.set(bytes, position);\n position += bytes.length;\n }\n resources.signal.throwIfAborted();\n return result;\n}\n", "import { FsError } from \"safe-bash-contracts/errors\";\nexport class Publication {\n #context;\n #pending = new Set();\n #stages = [];\n #closed = false;\n #closing;\n #serial = 0;\n constructor(context) { this.#context = context; }\n async track(operation) {\n if (this.#closed)\n throw new Error(\"ExifTool invocation closed\");\n this.#context.signal.throwIfAborted();\n const pending = Promise.resolve().then(operation);\n this.#pending.add(pending);\n try {\n return await pending;\n }\n finally {\n this.#pending.delete(pending);\n }\n }\n close() {\n if (this.#closing)\n return this.#closing;\n this.#closed = true;\n this.#closing = (async () => {\n await Promise.allSettled([...this.#pending]);\n const failures = [];\n // Cleanup must still run after invocation cancellation, on its own signal.\n const signal = new AbortController().signal;\n for (const staging of this.#stages.splice(0).reverse()) {\n try {\n await this.#context.fs.removeStagedFile(staging, { signal });\n }\n catch (error) {\n failures.push(error);\n }\n }\n if (failures.length)\n throw new AggregateError(failures, \"ExifTool staging cleanup failed\");\n })();\n return this.#closing;\n }\n async publish(path, bytes, expected, inPlace) {\n const { fs, signal } = this.#context;\n const slash = path.lastIndexOf(\"/\");\n const directory = path.slice(0, slash) || \"/\";\n const parent = await this.track(() => fs.stat(directory, { signal }));\n const capabilities = fs.capabilitiesFor ? await this.track(() => fs.capabilitiesFor(path, { signal })) : fs.capabilities;\n if (inPlace) {\n if (!expected || !fs.writeFileConditional || !capabilities.atomicFileMutation)\n throw new Error(\"VFS atomic in-place publication not supported\");\n await this.track(() => fs.writeFileConditional(path, bytes, { expected, parent, signal }));\n return;\n }\n if (expected && expected.nlink !== 1)\n throw new Error(\"VFS hardlink replacement is not yet supported\");\n if (!fs.createStagedFile || !fs.publishStagedFile || !fs.removeStagedFile || !capabilities.atomicFileStaging)\n throw new Error(\"VFS atomic replacement publication not supported\");\n let stage;\n for (let attempt = 0; attempt < 32; attempt++) {\n try {\n stage = await this.track(async () => {\n const owned = await fs.createStagedFile(directory + (directory === \"/\" ? \"\" : \"/\") + \".exiftool-\" + ++this.#serial, \"output\", { type: \"file\", data: bytes }, { parent, signal, mode: expected ? expected.mode & 0o7777 : 0o666 });\n this.#stages.push(owned);\n return owned;\n });\n break;\n }\n catch (error) {\n if (!(error instanceof FsError) || error.code !== \"EEXIST\")\n throw error;\n }\n }\n if (!stage)\n throw new Error(\"ExifTool staging collision limit exceeded\");\n await this.track(() => fs.publishStagedFile(stage, path, { destination: expected, parent, signal }));\n }\n}\n", "const jsonEscapes = Object.freeze({ 9: \"\\\\t\", 10: \"\\\\n\", 13: \"\\\\r\", 34: '\\\\\"', 92: \"\\\\\\\\\" });\nfunction admit(value, options) {\n options.signal?.throwIfAborted();\n const limits = [options.maxDecodedBytes ?? 2_097_152, options.maxOutputBytes ?? 6_291_458, options.maxWork ?? 4_194_304, options.maxRetainedBytes ?? 14_680_068];\n if (limits.some(limit => !Number.isSafeInteger(limit) || limit < 0))\n throw new RangeError(\"Invalid scalar limit\");\n if (value.length * 2 > limits[0])\n throw new RangeError(\"Scalar decoded bytes exceeded\");\n if (value.length * 4 > limits[2])\n throw new RangeError(\"Scalar work exceeded\");\n if (4 + value.length * 14 > limits[3])\n throw new RangeError(\"Scalar retained bytes exceeded\");\n}\nfunction numericSpelling(value) {\n // The pinned CLI end anchor also matches immediately before a final LF.\n const length = value.endsWith(\"\\n\") ? value.length - 1 : value.length;\n let index = value[0] === \"-\" ? 1 : 0;\n const start = index;\n const digit = () => index < length && value.charCodeAt(index) >= 48 && value.charCodeAt(index) <= 57;\n while (digit())\n index++;\n const integers = index - start;\n if (!integers || integers > 15 || (integers > 1 && value[start] === \"0\"))\n return false;\n if (value[index] === \".\") {\n const fraction = ++index;\n while (digit())\n index++;\n if (index === fraction || index - fraction > 16)\n return false;\n }\n if (value[index] === \"e\" || value[index] === \"E\") {\n index++;\n if (value[index] === \"+\" || value[index] === \"-\")\n index++;\n const exponent = index;\n while (digit())\n index++;\n if (index === exponent || index - exponent > 3)\n return false;\n }\n return index === length;\n}\n/** ExifTool 13.59 scalar JSON policy. Never converts lexical numbers to Number. */\nexport function encodeJsonScalar(value, options = {}) {\n admit(value, options);\n const limit = options.maxOutputBytes ?? 6_291_458;\n if (!options.quoteScalars) {\n const lower = value.toLowerCase();\n const boolean = lower.endsWith(\"\\n\") ? lower.slice(0, -1) : lower;\n const token = boolean === \"true\" || boolean === \"false\" ? lower : numericSpelling(value) ? value : undefined;\n if (token !== undefined) {\n if (token.length > limit)\n throw new RangeError(\"Scalar output bytes exceeded\");\n return token;\n }\n }\n // Reserve the maximum encoded extent before building strings. This deliberately\n // conservative bound also accounts for UTF-8 and surrogate repair.\n if (2 + value.length * 6 > limit)\n throw new RangeError(\"Scalar output bytes exceeded\");\n let output = '\"';\n for (let index = 0; index < value.length; index++) {\n const code = value.charCodeAt(index);\n if (code === 0)\n continue;\n const escape = jsonEscapes[code];\n if (escape)\n output += escape;\n else if (code < 32 || code === 127)\n output += \"\\\\u\" + code.toString(16).toUpperCase().padStart(4, \"0\");\n else if (code >= 0xd800 && code <= 0xdbff) {\n const next = value.charCodeAt(index + 1);\n if (next >= 0xdc00 && next <= 0xdfff)\n output += value[index] + value[++index];\n else\n output += \"\\uFFFD\";\n }\n else if (code >= 0xdc00 && code <= 0xdfff)\n output += \"\\uFFFD\";\n else\n output += value[index];\n }\n options.signal?.throwIfAborted();\n return output + '\"';\n}\n/** Plain text display only; do not use to reconstruct stored metadata. */\nexport function printable(value, options = {}) {\n admit(value, options);\n if (value.length * 3 > (options.maxOutputBytes ?? 6_291_458))\n throw new RangeError(\"Scalar output bytes exceeded\");\n let end = value.length;\n // NUL disappears; other controls become dots and therefore survive trimming.\n while (end && (value.charCodeAt(end - 1) === 0 || value[end - 1] === \" \"))\n end--;\n let output = \"\";\n for (let index = 0; index < end; index++) {\n const code = value.charCodeAt(index);\n if (code)\n output += code < 32 || code === 127 ? \".\" : value[index];\n }\n return output;\n}\n", "/** Invocation-owned table. CSV values bypass Printable and retain NUL bytes. */\nexport class CsvTable {\n resources;\n missing;\n headers = new Map();\n records = [];\n sortHeaders = false;\n constructor(resources, missing, names) {\n this.resources = resources;\n this.missing = missing;\n for (const name of names) {\n resources.admit(\"work\", name.length * 2 + 1);\n resources.admit(\"retained\", name.length * 4 + 128);\n const key = name.toLowerCase();\n if (key !== \"sourcefile\" && !this.headers.has(key))\n this.headers.set(key, { name, found: missing });\n }\n }\n add(file, tags) {\n this.resources.admit(\"work\", file.length + tags.length);\n this.resources.admit(\"retained\", file.length * 2 + 256);\n const fields = new Map();\n for (const tag of tags) {\n this.resources.admit(\"work\", tag.name.length * 2 + tag.value.length + 1);\n this.resources.admit(\"retained\", (tag.name.length + tag.value.length) * 4 + 256);\n const key = tag.name.toLowerCase();\n if (key === \"sourcefile\")\n continue;\n if (!this.headers.has(key)) {\n if (this.records.length)\n this.sortHeaders = true;\n this.headers.set(key, { name: tag.name, found: true });\n }\n else {\n this.headers.set(key, { name: tag.name, found: true });\n }\n fields.set(key, tag.value);\n }\n this.records.push({ file, fields });\n }\n render() {\n const extent = [...this.headers.keys()].reduce((total, key) => total + key.length + 1, 0);\n this.resources.admit(\"work\", extent * (this.headers.size + 1) + this.records.length * (this.headers.size + 1));\n this.resources.admit(\"retained\", this.headers.size * 64 + this.records.length * 32);\n const columns = [...this.headers].filter(([, header]) => header.found);\n if (this.sortHeaders)\n columns.sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0);\n const quote = (value) => {\n this.resources.admit(\"work\", value.length * 4 + 1);\n this.resources.admit(\"retained\", value.length * 8 + 16);\n let quoted = false;\n let text = \"\";\n for (const character of value) {\n if (character === '\"') {\n text += '\"\"';\n quoted = true;\n }\n else\n text += character;\n if (character === \",\" || character === \"\\n\" || character === \"\\r\")\n quoted = true;\n }\n const whitespace = (character) => \" \\t\\n\\r\\f\\v\\u0085\\u00A0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000\".includes(character);\n if (value.length && (whitespace(value[0]) || whitespace(value[value.length - 1])))\n quoted = true;\n return quoted ? '\"' + text + '\"' : text;\n };\n const lines = [[\"SourceFile\", ...columns.map(([, header]) => quote(header.name))].join(\",\")];\n for (const record of this.records) {\n this.resources.admit(\"retained\", (columns.length + 1) * 16);\n lines.push([quote(record.file), ...columns.map(([key]) => quote(record.fields.get(key) ?? (this.missing ? \"-\" : \"\")))].join(\",\"));\n }\n const size = lines.reduce((total, line) => total + line.length + 1, 0);\n this.resources.admit(\"work\", size * 2);\n this.resources.admit(\"retained\", size * 4);\n return lines.join(\"\\n\") + \"\\n\";\n }\n}\n", "import { readBytes } from \"safe-bash-contracts/io\";\nimport { virtualPath } from \"./paths.js\";\nconst escapes = Object.freeze({ a: \"\\x07\", b: \"\\b\", f: \"\\f\", n: \"\\n\", r: \"\\r\", t: \"\\t\", '\"': '\"', \"\\\\\": \"\\\\\" });\nfunction whitespace(character) {\n return character === \" \" || character === \"\\t\" || character === \"\\n\" || character === \"\\r\" || character === \"\\f\" || character === \"\\v\";\n}\n/** Pinned CLI physical-line filtering; neither shell quoting nor code evaluation. */\nexport function filterArgfileLine(line) {\n const cstr = line.startsWith(\"#[CSTR]\");\n if (line.startsWith(\"#\") && !cstr)\n return undefined;\n let start = cstr ? 7 : 0, end = line.length;\n if (!cstr)\n while (start < end && whitespace(line[start]))\n start++;\n while (end > start && (line[end - 1] === \"\\r\" || line[end - 1] === \"\\n\"))\n end--;\n const value = line.slice(start, end);\n if (cstr) {\n const parts = [];\n for (let index = 0; index < value.length; index++) {\n const character = value[index];\n if (character === \"\\\\\" && index + 1 < value.length) {\n const next = value[++index];\n parts.push(Object.hasOwn(escapes, next) ? escapes[next] : \"\\\\\" + next);\n }\n else\n parts.push(character);\n }\n return parts.join(\"\");\n }\n if (!value)\n return undefined;\n if (value[0] !== \"-\")\n return value;\n let index = 1;\n while (index < value.length) {\n const character = value[index];\n if (!(character === \"-\" || character === \"_\" || character === \":\" || (character >= \"0\" && character <= \"9\") || (character >= \"A\" && character <= \"Z\") || (character >= \"a\" && character <= \"z\")))\n break;\n index++;\n }\n if (index === 1)\n return value;\n if (value[index] === \"#\")\n index++;\n const nameEnd = index;\n while (index < value.length && whitespace(value[index]))\n index++;\n const operationStart = index;\n if (value[index] === \"+\" || value[index] === \"-\" || value[index] === \"<\")\n index++;\n if (value[index] !== \"=\")\n return value;\n index++;\n const operationEnd = index;\n if (value[index] === \" \")\n index++;\n return value.slice(0, nameEnd) + value.slice(operationStart, operationEnd) + value.slice(index);\n}\n/** Invocation-local VFS expansion. No executable-directory search or EOF polling. */\nexport async function expandArgfiles(args, context, publication, resources) {\n const frames = [{ args, index: 0 }];\n const result = [];\n let literal = false;\n let takesValue = false;\n while (frames.length) {\n resources.signal.throwIfAborted();\n const frame = frames[frames.length - 1];\n if (frame.index >= frame.args.length) {\n frames.pop();\n continue;\n }\n const arg = frame.args[frame.index++];\n resources.admit(\"work\", arg.length + 1);\n const option = arg.toLowerCase();\n if (!literal && !takesValue && frame.path && (option === \"-config\" || option === \"-common_args\"))\n throw new Error(\"Configuration/common arguments are not allowed in argument files\");\n if (!literal && !takesValue && option === \"-@\") {\n // Consume the filename from the expanded stream, including parent frames.\n while (frames.length && frames[frames.length - 1].index >= frames[frames.length - 1].args.length)\n frames.pop();\n const owner = frames[frames.length - 1];\n if (!owner)\n throw new Error(\"Missing argument for -@\");\n const input = owner.args[owner.index++];\n if (input === \"-\" || input.includes(\"\\0\"))\n throw new Error(\"Argument-file stdin/invalid paths are not supported\");\n const path = virtualPath(context.cwd, input, resources);\n if (frames.some(active => active.path === path))\n throw new Error(\"Argument-file cycle is not supported\");\n if (frames.length >= 16)\n throw new Error(\"Argument-file nesting limit exceeded\");\n const stat = await publication.track(() => context.fs.lstat(path, { signal: context.signal }));\n if (stat.type !== \"file\")\n throw new Error(\"Only regular VFS argument files are admitted\");\n resources.admit(\"input\", stat.size);\n resources.admit(\"decoded\", stat.size * 2);\n resources.admit(\"retained\", stat.size * 48 + 256);\n resources.admit(\"work\", stat.size * 24 + path.length);\n const bytes = await publication.track(async () => {\n if (!context.fs.readStream) {\n const result = await context.fs.readFile(path, { signal: context.signal, maxBytes: stat.size });\n context.signal.throwIfAborted();\n if (result.length > stat.size)\n throw new RangeError(\"ExifTool argument file grew beyond admitted size\");\n return result;\n }\n const chunks = [];\n let extent = 0;\n for await (const chunk of readBytes(context.fs.readStream(path, { signal: context.signal }), context.signal)) {\n if (chunk.length > stat.size - extent)\n throw new Error(\"Argument file grew beyond admitted size\");\n resources.admit(\"retained\", chunk.length + 128);\n resources.admit(\"work\", chunk.length + 1);\n chunks.push(new Uint8Array(chunk));\n extent += chunk.length;\n }\n const owned = new Uint8Array(extent);\n let offset = 0;\n for (const chunk of chunks) {\n owned.set(chunk, offset);\n offset += chunk.length;\n }\n return owned;\n });\n if (bytes.length > stat.size)\n throw new Error(\"Argument file grew beyond admitted size\");\n let text;\n try {\n text = new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes);\n }\n catch {\n throw new Error(\"Only UTF-8 argument files are currently supported\");\n }\n const expanded = [];\n let start = 0;\n for (let index = 0; index <= text.length; index++) {\n if (index !== text.length && text[index] !== \"\\n\")\n continue;\n const value = filterArgfileLine(text.slice(start, index === text.length ? index : index + 1));\n start = index + 1;\n if (value !== undefined) {\n resources.admit(\"retained\", value.length * 2 + 128);\n if (expanded.length >= 4096)\n throw new Error(\"Argument-file argument count exceeded\");\n expanded.push(value);\n }\n }\n frames.push({ args: expanded, index: 0, path });\n continue;\n }\n if (!literal && !takesValue && arg === \"--\")\n literal = true;\n const wasValue = takesValue;\n takesValue = !literal && !wasValue && [\"-config\", \"-api\", \"-o\", \"-if\", \"-p\", \"-stay_open\"].includes(option);\n resources.admit(\"retained\", arg.length * 2 + 128);\n if (result.length >= 4096)\n throw new Error(\"ExifTool argument count exceeded\");\n result.push(arg);\n }\n return result;\n}\n", "/** Literal VFS resolution with scratch admission before splitting components. */\nexport function virtualPath(cwd, input, resources) {\n if (input.includes(\"\\0\") || input === \"-\")\n throw new Error(\"Invalid or unsupported ExifTool file path\");\n const extent = input.length + (input.startsWith(\"/\") ? 0 : cwd.length + 1);\n // Includes separator-only and dot-only inputs with short normalized results.\n resources.admit(\"decoded\", extent * 2);\n resources.admit(\"retained\", extent * 32 + 256);\n resources.admit(\"work\", extent * 24 + 16);\n const parts = [];\n for (const part of (input.startsWith(\"/\") ? input : cwd + \"/\" + input).split(\"/\")) {\n if (part === \"..\")\n parts.pop();\n else if (part && part !== \".\")\n parts.push(part);\n }\n return \"/\" + parts.join(\"/\");\n}\n", "import { createCommandArguments } from \"safe-bash-contracts/command\";\nimport { parseArguments } from \"./arguments.js\";\nimport { exiftoolRegistry } from \"./registry.js\";\nimport { Resources } from \"./resources.js\";\n/** Build bounded, branded argv for direct CommandDefinition SDK invocation.\n * Operands are always literal; option values never acquire flag authority.\n * Argument construction is a separate bounded operation from command execution.\n */\nexport function createExiftoolArguments(options, engine) {\n const resources = new Resources(engine);\n const supported = [\"files\", \"tags\", \"assignments\", \"format\", \"style\", \"duplicates\", \"missing\", \"numeric\", \"quoteScalars\", \"groupFamily\", \"overwrite\", \"destination\"];\n resources.admit(\"retained\", 256);\n for (const key in options) {\n if (!Object.hasOwn(options, key))\n continue;\n resources.admit(\"work\", key.length * 2 + supported.length);\n resources.admit(\"retained\", key.length * 2 + 32);\n if (!supported.includes(key))\n throw new TypeError(\"Unsupported ExifTool SDK option: \" + key);\n }\n const count = options.files.length + (options.tags?.length ?? 0) + (options.assignments?.length ?? 0);\n if (!Number.isSafeInteger(count) || count > 4096)\n throw new RangeError(\"ExifTool argument count exceeded\");\n resources.admit(\"retained\", 256);\n const args = [];\n const append = (...parts) => {\n if (args.length >= 4096)\n throw new RangeError(\"ExifTool argument count exceeded\");\n let length = 0;\n for (const part of parts) {\n if (typeof part !== \"string\")\n throw new TypeError(\"ExifTool option values must be strings\");\n length += part.length;\n }\n resources.admit(\"decoded\", length * 2);\n resources.admit(\"retained\", length * 8 + 128);\n resources.admit(\"work\", length * 4 + 32);\n args.push(parts.join(\"\"));\n };\n const tagName = (name, assignment) => {\n if (typeof name !== \"string\")\n throw new TypeError(\"ExifTool tag names must be strings\");\n resources.admit(\"work\", name.length * 4 + 32);\n resources.admit(\"retained\", name.length * 4 + 64);\n const selector = !assignment && name.endsWith(\"#\") ? name.slice(0, -1) : name;\n if (!exiftoolRegistry.tags.some(tag => tag.toLowerCase() === selector.toLowerCase()) && selector !== \"MissingTag\" && !(assignment && selector === \"all\")) {\n throw new Error(\"ExifTool option/tag not yet supported: \" + name);\n }\n };\n if (options.format !== undefined && options.format !== \"text\") {\n const flag = { json: \"-j\", csv: \"-csv\", binary: \"-b\" }[options.format];\n if (!flag)\n throw new TypeError(\"Unsupported ExifTool output format\");\n append(flag);\n }\n if (options.style !== undefined) {\n const flag = { short: \"-s\", compact: \"-S\", values: \"-s3\" }[options.style];\n if (!flag)\n throw new TypeError(\"Unsupported ExifTool output style\");\n append(flag);\n }\n if (options.duplicates)\n append(\"-a\");\n if (options.missing)\n append(\"-f\");\n if (options.numeric)\n append(\"-n\");\n if (options.quoteScalars) {\n append(\"-api\");\n append(\"StructFormat=JSONQ\");\n }\n if (options.groupFamily !== undefined) {\n if (options.groupFamily !== 4)\n throw new TypeError(\"Unsupported ExifTool group family\");\n append(\"-G4\");\n }\n if (options.overwrite !== undefined && options.overwrite !== \"backup\") {\n const flag = { replace: \"-overwrite_original\", \"in-place\": \"-overwrite_original_in_place\" }[options.overwrite];\n if (!flag)\n throw new TypeError(\"Unsupported ExifTool overwrite policy\");\n append(flag);\n }\n if (options.destination !== undefined) {\n append(\"-o\");\n append(options.destination);\n }\n for (const tag of options.tags ?? []) {\n tagName(tag, false);\n append(\"-\", tag);\n }\n for (const assignment of options.assignments ?? []) {\n tagName(assignment.name, true);\n const suffix = { set: \"=\", remove: \"-=\", add: \"+=\" }[assignment.operation];\n if (!suffix)\n throw new TypeError(\"Unsupported ExifTool assignment operation\");\n append(\"-\", assignment.name, suffix, assignment.value);\n }\n append(\"--\");\n for (const file of options.files)\n append(file);\n // Keep unsupported combination and stdin policy identical to CLI admission.\n resources.admit(\"retained\", args.length * 128);\n resources.admit(\"work\", resources.usage.decoded * 4 + args.length * 64);\n parseArguments(args, resources.limits);\n return createCommandArguments(args, {\n assertOpen() { engine.signal.throwIfAborted(); },\n reserve(bytes, slots) {\n resources.admit(\"retained\", bytes + slots * 16);\n // Admission counts cumulative allocations, rather than live heap usage.\n return { commit() { }, release() { } };\n },\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["FsError", "readBytes", "start", "index", "name", "ops", "data", "whitespace", "index", "result", "result", "readBytes", "FsError"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type FmtOptions, type FmtLimits, type FmtProfile } from './contracts.js';
|
|
2
|
+
export interface FmtArgumentOptions {
|
|
3
|
+
readonly limits?: FmtLimits;
|
|
4
|
+
readonly profile?: FmtProfile;
|
|
5
|
+
readonly posixlyCorrect?: boolean;
|
|
6
|
+
readonly unicodeQuotes?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function parseFmtArguments(input: readonly Uint8Array[], configuration?: FmtArgumentOptions): FmtOptions;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type CommandContext, type CommandDefinition } from "../safe-bash-contracts/index.js";
|
|
2
|
+
import { type FmtLimits, type FmtProfile } from './contracts.js';
|
|
3
|
+
import { type FmtFormattingOptions } from './sdk.js';
|
|
4
|
+
import type { VirtualShellPlugin } from "../safe-bash-contracts/plugin.js";
|
|
5
|
+
export interface FmtCommandOptions {
|
|
6
|
+
readonly limits?: Partial<FmtLimits>;
|
|
7
|
+
readonly profile?: FmtProfile;
|
|
8
|
+
}
|
|
9
|
+
export interface FmtRunOptions extends FmtCommandOptions, FmtFormattingOptions {
|
|
10
|
+
readonly arguments?: readonly Uint8Array[];
|
|
11
|
+
}
|
|
12
|
+
export interface FmtResult {
|
|
13
|
+
readonly exitCode: number;
|
|
14
|
+
}
|
|
15
|
+
export interface FmtPluginOptions extends FmtCommandOptions {
|
|
16
|
+
readonly replace?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare function fmtCommand(configuration?: FmtCommandOptions): CommandDefinition;
|
|
19
|
+
export declare function fmtCommands(configuration?: FmtPluginOptions): VirtualShellPlugin;
|
|
20
|
+
export declare function fmt(context: CommandContext, configuration?: FmtRunOptions): Promise<FmtResult>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** No decoding or terminal-width calculation: all non-ASCII bytes are opaque. */
|
|
2
|
+
export type FmtProfile = 'gnu-coreutils-9.10-C-bytes' | 'gnu-coreutils-8.30-C-bytes';
|
|
3
|
+
export declare const fmtBaseline: Readonly<{
|
|
4
|
+
release: "GNU coreutils 9.10";
|
|
5
|
+
archiveSha256: "16535a9adf0b10037364e2d612aad3d9f4eca3a344949ced74d12faf4bd51d25";
|
|
6
|
+
developmentSource: "b25722854370b8206d7f53f8934c36710cdd9974";
|
|
7
|
+
profile: "gnu-coreutils-9.10-C-bytes";
|
|
8
|
+
}>;
|
|
9
|
+
export interface FmtLimits {
|
|
10
|
+
readonly inputBytes: number;
|
|
11
|
+
readonly outputBytes: number;
|
|
12
|
+
/** Live engine byte buffers, including prefix; word records are separately bounded to 999. */
|
|
13
|
+
readonly retainedBytes: number;
|
|
14
|
+
readonly work: number;
|
|
15
|
+
readonly argumentBytes: number;
|
|
16
|
+
}
|
|
17
|
+
export declare const defaultFmtLimits: FmtLimits;
|
|
18
|
+
export interface FmtOptions {
|
|
19
|
+
readonly profile: FmtProfile;
|
|
20
|
+
readonly width: number;
|
|
21
|
+
readonly goal: number;
|
|
22
|
+
readonly crown: boolean;
|
|
23
|
+
readonly tagged: boolean;
|
|
24
|
+
readonly split: boolean;
|
|
25
|
+
readonly uniform: boolean;
|
|
26
|
+
readonly prefix: Uint8Array;
|
|
27
|
+
readonly leading: number;
|
|
28
|
+
readonly fullPrefix: number;
|
|
29
|
+
readonly files: readonly {
|
|
30
|
+
readonly name: string;
|
|
31
|
+
readonly bytes: Uint8Array;
|
|
32
|
+
}[];
|
|
33
|
+
readonly information?: string;
|
|
34
|
+
}
|
|
35
|
+
export type FmtErrorCode = 'OPTION' | 'WIDTH' | 'INPUT' | 'LIMIT' | 'PROFILE' | 'ARITHMETIC' | 'CANCELLED' | 'CLOSED';
|
|
36
|
+
export declare class FmtError extends Error {
|
|
37
|
+
readonly code: FmtErrorCode;
|
|
38
|
+
readonly usage: boolean;
|
|
39
|
+
constructor(code: FmtErrorCode, message: string, usage?: boolean);
|
|
40
|
+
}
|
|
41
|
+
export declare function validateFmtLimits(limits: FmtLimits): void;
|
|
42
|
+
export declare function validateFmtProfile(profile: FmtProfile): void;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type FmtLimits, type FmtOptions } from './contracts.js';
|
|
2
|
+
export interface FmtAccounting {
|
|
3
|
+
readonly inputBytes: number;
|
|
4
|
+
/** Formatting never decodes input: words and widths retain their byte identity. */
|
|
5
|
+
readonly decodedBytes: 0;
|
|
6
|
+
readonly outputBytes: number;
|
|
7
|
+
readonly work: number;
|
|
8
|
+
readonly retainedBytes: number;
|
|
9
|
+
readonly peakRetainedBytes: number;
|
|
10
|
+
}
|
|
11
|
+
export interface FmtEngine {
|
|
12
|
+
/** Single-use coroutine: send <=4096 owned/admitted bytes on 'input', or null for EOF.
|
|
13
|
+
* Uint8Array events are owned output; undefined events are cooperative checkpoints.
|
|
14
|
+
* Do not send bytes on output/checkpoint events. */
|
|
15
|
+
run(): FmtMachine;
|
|
16
|
+
dispose(): void;
|
|
17
|
+
accounting(): FmtAccounting;
|
|
18
|
+
}
|
|
19
|
+
export type FmtMachine<Result = void> = Generator<Uint8Array | "input" | undefined, Result, Uint8Array | null | undefined>;
|
|
20
|
+
export declare function createFmtEngine(options: FmtOptions, limits: FmtLimits, signal: AbortSignal): FmtEngine;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { parseFmtArguments, type FmtArgumentOptions } from './arguments.js';
|
|
2
|
+
export { createFmtEngine, type FmtEngine, type FmtAccounting, type FmtMachine } from './engine.js';
|
|
3
|
+
export { FmtError, fmtBaseline, defaultFmtLimits, type FmtErrorCode, type FmtLimits, type FmtOptions, type FmtProfile } from './contracts.js';
|
|
4
|
+
export { fmt, fmtCommand, fmtCommands, type FmtCommandOptions, type FmtRunOptions, type FmtResult, type FmtPluginOptions } from './command.js';
|
|
5
|
+
export type { FmtFormattingOptions } from './sdk.js';
|