UNPKG

filecoin-pin

Version:

Bridge IPFS content to Filecoin Onchain Cloud using familiar tools

90 lines 4.42 kB
import { Option } from 'commander'; import { ERC8004_TYPES, normalizeMetadataConfig } from '../core/metadata/index.js'; function collectKeyValue(value, previous = []) { const entries = previous; entries.push(value); return entries; } function parseKeyValuePairs(pairs, flagLabel) { const result = {}; for (const pair of pairs) { const delimiterIndex = pair.indexOf('='); if (delimiterIndex === -1) { throw new Error(`${flagLabel} entries must use key=value format (received "${pair}")`); } const key = pair.slice(0, delimiterIndex).trim(); const value = pair.slice(delimiterIndex + 1); if (key === '') { throw new Error(`${flagLabel} entries require a non-empty key (received "${pair}")`); } if (Object.hasOwn(result, key)) { throw new Error(`${flagLabel} contains duplicate key "${key}"`); } result[key] = value; } return result; } /** * Registers metadata-related Commander flags on a CLI command. * Adds piece-level metadata flags by default, dataset metadata flags (with alias support), * and optionally ERC-8004 artifact options depending on the provided configuration. * * @param command Commander command to augment (mutated in place) * @param config Controls which categories of metadata flags should be attached * @returns The same command instance to support fluent configuration */ export function addMetadataOptions(command, config = {}) { const includePieceMetadata = config.includePieceMetadata ?? true; const includeDataSetMetadata = config.includeDataSetMetadata ?? true; const includeErc8004 = config.includeErc8004 ?? false; if (includePieceMetadata) { command.option('--metadata <key=value>', 'Add piece metadata entry (repeatable; value may be empty)', collectKeyValue, []); } if (includeDataSetMetadata) { const dataSetOption = new Option('--data-set-metadata <key=value>', 'Add data set metadata entry (repeatable; value may be empty)') .argParser(collectKeyValue) .default([]); const aliasOption = new Option('--dataset-metadata <key=value>').argParser(collectKeyValue).default([]).hideHelp(); command.addOption(dataSetOption); command.addOption(aliasOption); } if (includeErc8004) { const typeOption = new Option('--8004-type <type>', 'ERC-8004 artifact type').choices(ERC8004_TYPES); command.addOption(typeOption); command.option('--8004-agent <id>', 'ERC-8004 agent identifier (DID, address, etc.)'); } return command; } /** * Converts Commander option values into normalized metadata objects used by upload flows. * Aggregates `--metadata` and `--data-set-metadata` flags (including aliases), then applies * `normalizeMetadataConfig` to ensure optional ERC-8004 fields are propagated when requested. * * @param options Parsed Commander options, typically the result of `command.opts()` * @param config Controls whether ERC-8004 parameters should be included in the normalization step * @returns Metadata maps ready to pass into upload APIs, excluding keys that were not provided */ export function resolveMetadataOptions(options, config = {}) { const metadataPairs = Array.isArray(options.metadata) ? options.metadata : []; const dsMetadataPairs = [ ...(Array.isArray(options.dataSetMetadata) ? options.dataSetMetadata : []), ...(Array.isArray(options.datasetMetadata) ? options.datasetMetadata : []), ]; const parsedMetadata = parseKeyValuePairs(metadataPairs, '--metadata'); const parsedDataSetMetadata = parseKeyValuePairs(dsMetadataPairs, '--data-set-metadata'); const { pieceMetadata, dataSetMetadata } = normalizeMetadataConfig({ pieceMetadata: Object.keys(parsedMetadata).length > 0 ? parsedMetadata : undefined, dataSetMetadata: Object.keys(parsedDataSetMetadata).length > 0 ? parsedDataSetMetadata : undefined, erc8004Type: config.includeErc8004 ? options['8004Type'] : undefined, erc8004Agent: config.includeErc8004 ? options['8004Agent'] : undefined, }); const resolved = {}; if (pieceMetadata) { resolved.pieceMetadata = pieceMetadata; } if (dataSetMetadata) { resolved.dataSetMetadata = dataSetMetadata; } return resolved; } //# sourceMappingURL=cli-options-metadata.js.map