{"version":3,"file":"dreadcabinet.cjs","sources":["../src/constants.ts","../src/error/ArgumentError.ts","../src/configure.ts","../src/defaults.ts","../src/read.ts","../src/util/dates.ts","../src/util/storage.ts","../src/validate.ts","../src/input/structured.ts","../src/input/unstructured.ts","../src/input/process.ts","../src/input/input.ts","../src/output.ts","../src/operate.ts","../src/logger.ts","../src/dreadcabinet.ts"],"sourcesContent":["import { FilenameOption, FilesystemStructure } from './dreadcabinet';\n\nexport const VERSION = '__VERSION__ (__GIT_BRANCH__/__GIT_COMMIT__ __GIT_TAGS__ __GIT_COMMIT_DATE__) __SYSTEM_INFO__';\nexport const PROGRAM_NAME = 'dreadcabinet';\nexport const DEFAULT_CHARACTER_ENCODING = 'utf-8';\nexport const DEFAULT_BINARY_TO_TEXT_ENCODING = 'base64';\nexport const DEFAULT_DIFF = true;\nexport const DEFAULT_LOG = false;\nexport const DEFAULT_TIMEZONE = 'Etc/UTC';\nexport const DATE_FORMAT_MONTH_DAY = 'M-D';\nexport const DATE_FORMAT_YEAR = 'YYYY';\nexport const DATE_FORMAT_YEAR_MONTH = 'YYYY-M';\nexport const DATE_FORMAT_YEAR_MONTH_DAY = 'YYYY-M-D';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_SLASH = 'YYYY/M/D';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES = 'YYYY-M-D-HHmm';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS = 'YYYY-M-D-HHmmss';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS = 'YYYY-M-D-HHmmss.SSS';\nexport const DATE_FORMAT_MONTH = 'M';\nexport const DATE_FORMAT_DAY = 'D';\nexport const DATE_FORMAT_HOURS = 'HHmm';\nexport const DATE_FORMAT_MINUTES = 'mm';\nexport const DATE_FORMAT_SECONDS = 'ss';\nexport const DATE_FORMAT_MILLISECONDS = 'SSS';\n\nexport const DEFAULT_RECURSIVE = false;\nexport const DEFAULT_INPUT_DIRECTORY = './';\nexport const DEFAULT_OUTPUT_DIRECTORY = './';\nexport const DEFAULT_CONCURRENCY = 1;\n\nexport const DEFAULT_OUTPUT_STRUCTURE = 'month' as FilesystemStructure;\nexport const DEFAULT_OUTPUT_FILENAME_OPTIONS = ['date', 'subject'] as FilenameOption[];\nexport const DEFAULT_INPUT_STRUCTURE = 'month' as FilesystemStructure;\nexport const DEFAULT_INPUT_FILENAME_OPTIONS = ['date', 'subject'] as FilenameOption[];\nexport const DEFAULT_EXTENSIONS = ['md'] as string[];\n\nexport const ALLOWED_INPUT_STRUCTURES = ['none', 'year', 'month', 'day'] as FilesystemStructure[];\nexport const ALLOWED_INPUT_FILENAME_OPTIONS = ['date', 'time', 'subject'] as FilenameOption[];\nexport const ALLOWED_OUTPUT_STRUCTURES = ['none', 'year', 'month', 'day'] as FilesystemStructure[];\nexport const ALLOWED_OUTPUT_FILENAME_OPTIONS = ['date', 'time', 'subject'] as FilenameOption[];\n\nexport const ALLOWED_EXTENSIONS = ['md', 'txt'] as string[];","export class ArgumentError extends Error {\n    private argumentName: string;\n    constructor(argumentName: string, message: string) {\n        super(`${message}`);\n        this.name = 'ArgumentError';\n        this.argumentName = argumentName;\n    }\n\n    get argument(): string {\n        return this.argumentName;\n    }\n}","import { Command } from \"commander\";\nimport {\n    DATE_FORMAT_YEAR_MONTH_DAY,\n    DEFAULT_EXTENSIONS,\n    DEFAULT_INPUT_DIRECTORY,\n    DEFAULT_INPUT_FILENAME_OPTIONS,\n    DEFAULT_INPUT_STRUCTURE,\n    DEFAULT_OUTPUT_DIRECTORY,\n    DEFAULT_OUTPUT_FILENAME_OPTIONS,\n    DEFAULT_OUTPUT_STRUCTURE,\n    DEFAULT_RECURSIVE,\n    DEFAULT_TIMEZONE\n} from \"./constants\";\nimport { DefaultOptions, Feature } from \"./dreadcabinet\";\nimport { ArgumentError } from \"./error/ArgumentError\";\n\nexport { ArgumentError };\n\nconst addOption = (command: Command, option: string, description: string, addDefaults: boolean, defaultValue: boolean | string[] | string | undefined) => {\n    if (addDefaults) {\n        command.option(option, description, defaultValue)\n    } else {\n        const defaultDesc = defaultValue === undefined ? 'undefined' : Array.isArray(defaultValue) ? defaultValue.join(',') : defaultValue;\n        const descriptionWithDefaults = `${description} (default: ${defaultDesc})`\n        command.option(option, descriptionWithDefaults)\n    }\n}\n\nexport const configure = async (command: Command, defaults: DefaultOptions, addDefaults: boolean, features: Feature[]): Promise<void> => {\n    const tzDefault = defaults?.timezone || DEFAULT_TIMEZONE;\n    if (addDefaults) {\n        command.option('--timezone <timezone>', 'timezone for date calculations', tzDefault)\n    } else {\n        command.option('--timezone <timezone>', `timezone for date calculations (default: ${tzDefault})`)\n    }\n\n    if (features.includes('input')) {\n        addOption(command, '-r, --recursive', 'recursive mode, process all files in the input directory', addDefaults, defaults?.recursive !== undefined ? defaults.recursive : DEFAULT_RECURSIVE)\n        addOption(command, '-i, --input-directory <inputDirectory>', 'input directory', addDefaults, defaults?.inputDirectory || DEFAULT_INPUT_DIRECTORY)\n        addOption(command, '--limit <limit>', 'limit the number of files to process', addDefaults, defaults?.limit ? defaults?.limit.toString() : undefined)\n        addOption(command, '--concurrency <concurrency>', 'concurrency level for processing files', addDefaults, defaults?.concurrency ? defaults?.concurrency.toString() : undefined)\n    }\n    if (features.includes('output')) {\n        addOption(command, '-o, --output-directory <outputDirectory>', 'output directory', addDefaults, defaults?.outputDirectory || DEFAULT_OUTPUT_DIRECTORY)\n    }\n    if (features.includes('structured-output')) {\n        addOption(command, '--output-structure <type>', 'output directory structure (none/year/month/day)', addDefaults, defaults?.outputStructure || DEFAULT_OUTPUT_STRUCTURE)\n        addOption(command, '--output-filename-options [outputFilenameOptions...]', 'filename format options (space-separated list of: date,time,subject) example \\'date subject\\'', addDefaults, defaults?.outputFilenameOptions || DEFAULT_OUTPUT_FILENAME_OPTIONS)\n    }\n    if (features.includes('extensions')) {\n        addOption(command, '--extensions [extensions...]', 'file extensions to process (space-separated list of: mp3,mp4,mpeg,mpga,m4a,wav,webm)', addDefaults, defaults?.extensions || DEFAULT_EXTENSIONS)\n    }\n\n    if (features.includes('structured-input')) {\n        addOption(command, '--input-structure <type>', 'input directory structure (none/year/month/day)', addDefaults, defaults?.inputStructure || DEFAULT_INPUT_STRUCTURE)\n        addOption(command, '--input-filename-options [options...]', 'filename format options (space-separated list of: date,time,subject)', addDefaults, defaults?.inputFilenameOptions || DEFAULT_INPUT_FILENAME_OPTIONS)\n        addOption(command, '--start <date>', `start date filter (${DATE_FORMAT_YEAR_MONTH_DAY})`, addDefaults, undefined)\n        addOption(command, '--end <date>', `end date filter (${DATE_FORMAT_YEAR_MONTH_DAY}), defaults to today`, addDefaults, undefined)\n    }\n}","import { Config } from './dreadcabinet';\nimport { DEFAULT_CONCURRENCY, DEFAULT_EXTENSIONS, DEFAULT_INPUT_DIRECTORY, DEFAULT_INPUT_FILENAME_OPTIONS, DEFAULT_INPUT_STRUCTURE, DEFAULT_OUTPUT_DIRECTORY, DEFAULT_OUTPUT_FILENAME_OPTIONS, DEFAULT_OUTPUT_STRUCTURE, DEFAULT_RECURSIVE, DEFAULT_TIMEZONE } from './constants';\nimport { DefaultOptions, Feature } from './dreadcabinet';\n\nexport const applyDefaults = (config: Partial<Config>, features: Feature[], defaults: DefaultOptions): Config => {\n    const configWithDefaults = {\n        ...config,\n    }\n\n    configWithDefaults.timezone = config.timezone || (defaults?.timezone || DEFAULT_TIMEZONE);\n    if (features.includes('input')) {\n        configWithDefaults.recursive = config.recursive === undefined ? (defaults?.recursive ?? DEFAULT_RECURSIVE) : config.recursive;\n        configWithDefaults.inputDirectory = config.inputDirectory || (defaults?.inputDirectory || DEFAULT_INPUT_DIRECTORY);\n        // Ensure concurrency is a valid positive integer, otherwise use default\n        if (config.concurrency === undefined || !Number.isInteger(config.concurrency) || config.concurrency < 1) {\n            configWithDefaults.concurrency = defaults?.concurrency || DEFAULT_CONCURRENCY;\n        } else {\n            configWithDefaults.concurrency = config.concurrency;\n        }\n    }\n    if (features.includes('output')) {\n        configWithDefaults.outputDirectory = config.outputDirectory || (defaults?.outputDirectory || DEFAULT_OUTPUT_DIRECTORY);\n    }\n    if (features.includes('structured-output')) {\n        configWithDefaults.outputStructure = config.outputStructure || (defaults?.outputStructure || DEFAULT_OUTPUT_STRUCTURE);\n        configWithDefaults.outputFilenameOptions = config.outputFilenameOptions || (defaults?.outputFilenameOptions || DEFAULT_OUTPUT_FILENAME_OPTIONS);\n    }\n    if (features.includes('extensions')) {\n        configWithDefaults.extensions = config.extensions || (defaults?.extensions || DEFAULT_EXTENSIONS);\n    }\n\n    if (features.includes('structured-input')) {\n        configWithDefaults.inputStructure = config.inputStructure || (defaults?.inputStructure || DEFAULT_INPUT_STRUCTURE);\n        configWithDefaults.inputFilenameOptions = config.inputFilenameOptions || (defaults?.inputFilenameOptions || DEFAULT_INPUT_FILENAME_OPTIONS);\n    }\n\n    return configWithDefaults as Config;\n}\n\n","import { Config, Feature, Args } from \"dreadcabinet\";\nimport { ArgumentError } from \"./error/ArgumentError\";\n\nexport { ArgumentError };\n\nfunction clean(obj: any) {\n    return Object.fromEntries(\n        Object.entries(obj).filter(([_, v]) => v !== undefined)\n    );\n}\n\nexport const read = async (args: Args, features: Feature[]): Promise<Partial<Config>> => {\n\n    const config: Partial<Config> = {};\n\n    config.timezone = args.timezone;\n    if (features.includes('input')) {\n        config.inputDirectory = args.inputDirectory;\n        config.recursive = args.recursive;\n        config.limit = args.limit;\n        config.concurrency = args.concurrency;\n    }\n    if (features.includes('structured-input')) {\n        config.inputStructure = args.inputStructure;\n        config.inputFilenameOptions = args.inputFilenameOptions;\n    }\n    if (features.includes('output')) {\n        config.outputDirectory = args.outputDirectory;\n    }\n    if (features.includes('structured-output')) {\n        config.outputStructure = args.outputStructure;\n        config.outputFilenameOptions = args.outputFilenameOptions;\n    }\n    if (features.includes('extensions')) {\n        config.extensions = args.extensions;\n    }\n\n    // Returning a clean object to avoid undefined values\n    return clean(config);\n}","// eslint-disable-next-line no-restricted-imports\nimport dayjs from 'dayjs';\nimport timezone from 'dayjs/plugin/timezone';\nimport utc from 'dayjs/plugin/utc';\nimport { DATE_FORMAT_YEAR_MONTH_DAY } from '../constants';\n\ndayjs.extend(utc);\ndayjs.extend(timezone);\n\n// Static list of IANA timezone names (replaces moment-timezone dependency)\nconst TIMEZONE_NAMES = [\n    'Africa/Abidjan', 'Africa/Accra', 'Africa/Addis_Ababa', 'Africa/Algiers', 'Africa/Asmara', 'Africa/Asmera',\n    'Africa/Bamako', 'Africa/Bangui', 'Africa/Banjul', 'Africa/Bissau', 'Africa/Blantyre', 'Africa/Brazzaville',\n    'Africa/Bujumbura', 'Africa/Cairo', 'Africa/Casablanca', 'Africa/Ceuta', 'Africa/Conakry', 'Africa/Dakar',\n    'Africa/Dar_es_Salaam', 'Africa/Djibouti', 'Africa/Douala', 'Africa/El_Aaiun', 'Africa/Freetown', 'Africa/Gaborone',\n    'Africa/Harare', 'Africa/Johannesburg', 'Africa/Juba', 'Africa/Kampala', 'Africa/Khartoum', 'Africa/Kigali',\n    'Africa/Kinshasa', 'Africa/Lagos', 'Africa/Libreville', 'Africa/Lome', 'Africa/Luanda', 'Africa/Lubumbashi',\n    'Africa/Lusaka', 'Africa/Malabo', 'Africa/Maputo', 'Africa/Maseru', 'Africa/Mbabane', 'Africa/Mogadishu',\n    'Africa/Monrovia', 'Africa/Nairobi', 'Africa/Ndjamena', 'Africa/Niamey', 'Africa/Nouakchott', 'Africa/Ouagadougou',\n    'Africa/Porto-Novo', 'Africa/Sao_Tome', 'Africa/Timbuktu', 'Africa/Tripoli', 'Africa/Tunis', 'Africa/Windhoek',\n    'America/Adak', 'America/Anchorage', 'America/Anguilla', 'America/Antigua', 'America/Araguaina',\n    'America/Argentina/Buenos_Aires', 'America/Argentina/Catamarca', 'America/Argentina/ComodRivadavia',\n    'America/Argentina/Cordoba', 'America/Argentina/Jujuy', 'America/Argentina/La_Rioja', 'America/Argentina/Mendoza',\n    'America/Argentina/Rio_Gallegos', 'America/Argentina/Salta', 'America/Argentina/San_Juan', 'America/Argentina/San_Luis',\n    'America/Argentina/Tucuman', 'America/Argentina/Ushuaia', 'America/Aruba', 'America/Asuncion', 'America/Atikokan',\n    'America/Atka', 'America/Bahia', 'America/Bahia_Banderas', 'America/Barbados', 'America/Belem', 'America/Belize',\n    'America/Blanc-Sablon', 'America/Boa_Vista', 'America/Bogota', 'America/Boise', 'America/Buenos_Aires',\n    'America/Cambridge_Bay', 'America/Campo_Grande', 'America/Cancun', 'America/Caracas', 'America/Catamarca',\n    'America/Cayenne', 'America/Cayman', 'America/Chicago', 'America/Chihuahua', 'America/Coral_Harbour',\n    'America/Cordoba', 'America/Costa_Rica', 'America/Creston', 'America/Cuiaba', 'America/Curacao',\n    'America/Danmarkshavn', 'America/Dawson', 'America/Dawson_Creek', 'America/Denver', 'America/Detroit',\n    'America/Dominica', 'America/Edmonton', 'America/Eirunepe', 'America/El_Salvador', 'America/Ensenada',\n    'America/Fort_Nelson', 'America/Fort_Wayne', 'America/Fortaleza', 'America/Glace_Bay', 'America/Godthab',\n    'America/Goose_Bay', 'America/Grand_Turk', 'America/Grenada', 'America/Guadeloupe', 'America/Guatemala',\n    'America/Guayaquil', 'America/Guyana', 'America/Halifax', 'America/Havana', 'America/Hermosillo',\n    'America/Indiana/Indianapolis', 'America/Indiana/Knox', 'America/Indiana/Marengo', 'America/Indiana/Petersburg',\n    'America/Indiana/Tell_City', 'America/Indiana/Vevay', 'America/Indiana/Vincennes', 'America/Indiana/Winamac',\n    'America/Indianapolis', 'America/Inuvik', 'America/Iqaluit', 'America/Jamaica', 'America/Jujuy', 'America/Juneau',\n    'America/Kentucky/Louisville', 'America/Kentucky/Monticello', 'America/Knox_IN', 'America/Kralendijk',\n    'America/La_Paz', 'America/Lima', 'America/Los_Angeles', 'America/Louisville', 'America/Lower_Princes',\n    'America/Maceio', 'America/Managua', 'America/Manaus', 'America/Marigot', 'America/Martinique',\n    'America/Matamoros', 'America/Mazatlan', 'America/Mendoza', 'America/Menominee', 'America/Merida',\n    'America/Metlakatla', 'America/Mexico_City', 'America/Miquelon', 'America/Moncton', 'America/Monterrey',\n    'America/Montevideo', 'America/Montreal', 'America/Montserrat', 'America/Nassau', 'America/New_York',\n    'America/Nipigon', 'America/Nome', 'America/Noronha', 'America/North_Dakota/Beulah', 'America/North_Dakota/Center',\n    'America/North_Dakota/New_Salem', 'America/Ojinaga', 'America/Panama', 'America/Pangnirtung', 'America/Paramaribo',\n    'America/Phoenix', 'America/Port-au-Prince', 'America/Port_of_Spain', 'America/Porto_Acre', 'America/Porto_Velho',\n    'America/Puerto_Rico', 'America/Punta_Arenas', 'America/Rainy_River', 'America/Rankin_Inlet', 'America/Recife',\n    'America/Regina', 'America/Resolute', 'America/Rio_Branco', 'America/Rosario', 'America/Santa_Isabel',\n    'America/Santarem', 'America/Santiago', 'America/Santo_Domingo', 'America/Sao_Paulo', 'America/Scoresbysund',\n    'America/Shiprock', 'America/Sitka', 'America/St_Barthelemy', 'America/St_Johns', 'America/St_Kitts',\n    'America/St_Lucia', 'America/St_Thomas', 'America/St_Vincent', 'America/Swift_Current', 'America/Tegucigalpa',\n    'America/Thule', 'America/Thunder_Bay', 'America/Tijuana', 'America/Toronto', 'America/Tortola',\n    'America/Vancouver', 'America/Virgin', 'America/Whitehorse', 'America/Winnipeg', 'America/Yakutat',\n    'America/Yellowknife', 'Antarctica/Casey', 'Antarctica/Davis', 'Antarctica/DumontDUrville', 'Antarctica/Macquarie',\n    'Antarctica/Mawson', 'Antarctica/McMurdo', 'Antarctica/Palmer', 'Antarctica/Rothera', 'Antarctica/South_Pole',\n    'Antarctica/Syowa', 'Antarctica/Troll', 'Antarctica/Vostok', 'Arctic/Longyearbyen', 'Asia/Aden', 'Asia/Almaty',\n    'Asia/Amman', 'Asia/Anadyr', 'Asia/Aqtau', 'Asia/Aqtobe', 'Asia/Ashgabat', 'Asia/Ashkhabad', 'Asia/Atyrau',\n    'Asia/Baghdad', 'Asia/Bahrain', 'Asia/Baku', 'Asia/Bangkok', 'Asia/Barnaul', 'Asia/Beirut', 'Asia/Bishkek',\n    'Asia/Brunei', 'Asia/Calcutta', 'Asia/Chita', 'Asia/Choibalsan', 'Asia/Chongqing', 'Asia/Chungking',\n    'Asia/Colombo', 'Asia/Dacca', 'Asia/Damascus', 'Asia/Dhaka', 'Asia/Dili', 'Asia/Dubai', 'Asia/Dushanbe',\n    'Asia/Famagusta', 'Asia/Gaza', 'Asia/Harbin', 'Asia/Hebron', 'Asia/Ho_Chi_Minh', 'Asia/Hong_Kong', 'Asia/Hovd',\n    'Asia/Irkutsk', 'Asia/Istanbul', 'Asia/Jakarta', 'Asia/Jayapura', 'Asia/Jerusalem', 'Asia/Kabul', 'Asia/Kamchatka',\n    'Asia/Karachi', 'Asia/Kashgar', 'Asia/Kathmandu', 'Asia/Katmandu', 'Asia/Khandyga', 'Asia/Kolkata',\n    'Asia/Krasnoyarsk', 'Asia/Kuala_Lumpur', 'Asia/Kuching', 'Asia/Kuwait', 'Asia/Macao', 'Asia/Macau',\n    'Asia/Magadan', 'Asia/Makassar', 'Asia/Manila', 'Asia/Muscat', 'Asia/Nicosia', 'Asia/Novokuznetsk',\n    'Asia/Novosibirsk', 'Asia/Omsk', 'Asia/Oral', 'Asia/Phnom_Penh', 'Asia/Pontianak', 'Asia/Pyongyang',\n    'Asia/Qatar', 'Asia/Qyzylorda', 'Asia/Rangoon', 'Asia/Riyadh', 'Asia/Saigon', 'Asia/Sakhalin', 'Asia/Samarkand',\n    'Asia/Seoul', 'Asia/Shanghai', 'Asia/Singapore', 'Asia/Srednekolymsk', 'Asia/Taipei', 'Asia/Tashkent',\n    'Asia/Tbilisi', 'Asia/Tehran', 'Asia/Tel_Aviv', 'Asia/Thimbu', 'Asia/Thimphu', 'Asia/Tokyo', 'Asia/Tomsk',\n    'Asia/Ujung_Pandang', 'Asia/Ulaanbaatar', 'Asia/Ulan_Bator', 'Asia/Urumqi', 'Asia/Ust-Nera', 'Asia/Vientiane',\n    'Asia/Vladivostok', 'Asia/Yakutsk', 'Asia/Yangon', 'Asia/Yekaterinburg', 'Asia/Yerevan', 'Atlantic/Azores',\n    'Atlantic/Bermuda', 'Atlantic/Canary', 'Atlantic/Cape_Verde', 'Atlantic/Faeroe', 'Atlantic/Faroe',\n    'Atlantic/Jan_Mayen', 'Atlantic/Madeira', 'Atlantic/Reykjavik', 'Atlantic/South_Georgia', 'Atlantic/St_Helena',\n    'Atlantic/Stanley', 'Australia/ACT', 'Australia/Adelaide', 'Australia/Brisbane', 'Australia/Broken_Hill',\n    'Australia/Canberra', 'Australia/Currie', 'Australia/Darwin', 'Australia/Eucla', 'Australia/Hobart',\n    'Australia/LHI', 'Australia/Lindeman', 'Australia/Lord_Howe', 'Australia/Melbourne', 'Australia/NSW',\n    'Australia/North', 'Australia/Perth', 'Australia/Queensland', 'Australia/South', 'Australia/Sydney',\n    'Australia/Tasmania', 'Australia/Victoria', 'Australia/West', 'Australia/Yancowinna', 'Brazil/Acre',\n    'Brazil/DeNoronha', 'Brazil/East', 'Brazil/West', 'CET', 'CST6CDT', 'Canada/Atlantic', 'Canada/Central',\n    'Canada/Eastern', 'Canada/Mountain', 'Canada/Newfoundland', 'Canada/Pacific', 'Canada/Saskatchewan',\n    'Canada/Yukon', 'Chile/Continental', 'Chile/EasterIsland', 'Cuba', 'EET', 'EST', 'EST5EDT', 'Egypt', 'Eire',\n    'Etc/GMT', 'Etc/GMT+0', 'Etc/GMT+1', 'Etc/GMT+10', 'Etc/GMT+11', 'Etc/GMT+12', 'Etc/GMT+2', 'Etc/GMT+3',\n    'Etc/GMT+4', 'Etc/GMT+5', 'Etc/GMT+6', 'Etc/GMT+7', 'Etc/GMT+8', 'Etc/GMT+9', 'Etc/GMT-0', 'Etc/GMT-1',\n    'Etc/GMT-10', 'Etc/GMT-11', 'Etc/GMT-12', 'Etc/GMT-13', 'Etc/GMT-14', 'Etc/GMT-2', 'Etc/GMT-3', 'Etc/GMT-4',\n    'Etc/GMT-5', 'Etc/GMT-6', 'Etc/GMT-7', 'Etc/GMT-8', 'Etc/GMT-9', 'Etc/GMT0', 'Etc/Greenwich', 'Etc/UCT',\n    'Etc/UTC', 'Etc/Universal', 'Etc/Zulu', 'Europe/Amsterdam', 'Europe/Andorra', 'Europe/Astrakhan', 'Europe/Athens',\n    'Europe/Belfast', 'Europe/Belgrade', 'Europe/Berlin', 'Europe/Bratislava', 'Europe/Brussels', 'Europe/Bucharest',\n    'Europe/Budapest', 'Europe/Busingen', 'Europe/Chisinau', 'Europe/Copenhagen', 'Europe/Dublin', 'Europe/Gibraltar',\n    'Europe/Guernsey', 'Europe/Helsinki', 'Europe/Isle_of_Man', 'Europe/Istanbul', 'Europe/Jersey', 'Europe/Kaliningrad',\n    'Europe/Kiev', 'Europe/Kirov', 'Europe/Lisbon', 'Europe/Ljubljana', 'Europe/London', 'Europe/Luxembourg',\n    'Europe/Madrid', 'Europe/Malta', 'Europe/Mariehamn', 'Europe/Minsk', 'Europe/Monaco', 'Europe/Moscow',\n    'Europe/Nicosia', 'Europe/Oslo', 'Europe/Paris', 'Europe/Podgorica', 'Europe/Prague', 'Europe/Riga',\n    'Europe/Rome', 'Europe/Samara', 'Europe/San_Marino', 'Europe/Sarajevo', 'Europe/Saratov', 'Europe/Simferopol',\n    'Europe/Skopje', 'Europe/Sofia', 'Europe/Stockholm', 'Europe/Tallinn', 'Europe/Tirane', 'Europe/Tiraspol',\n    'Europe/Ulyanovsk', 'Europe/Uzhgorod', 'Europe/Vaduz', 'Europe/Vatican', 'Europe/Vienna', 'Europe/Vilnius',\n    'Europe/Volgograd', 'Europe/Warsaw', 'Europe/Zagreb', 'Europe/Zaporozhye', 'Europe/Zurich', 'GB', 'GB-Eire',\n    'GMT', 'GMT+0', 'GMT-0', 'GMT0', 'Greenwich', 'HST', 'Hongkong', 'Iceland', 'Indian/Antananarivo', 'Indian/Chagos',\n    'Indian/Christmas', 'Indian/Cocos', 'Indian/Comoro', 'Indian/Kerguelen', 'Indian/Mahe', 'Indian/Maldives',\n    'Indian/Mauritius', 'Indian/Mayotte', 'Indian/Reunion', 'Iran', 'Israel', 'Jamaica', 'Japan', 'Kwajalein',\n    'Libya', 'MET', 'MST', 'MST7MDT', 'Mexico/BajaNorte', 'Mexico/BajaSur', 'Mexico/General', 'NZ', 'NZ-CHAT',\n    'Navajo', 'PRC', 'PST8PDT', 'Pacific/Apia', 'Pacific/Auckland', 'Pacific/Bougainville', 'Pacific/Chatham',\n    'Pacific/Chuuk', 'Pacific/Easter', 'Pacific/Efate', 'Pacific/Enderbury', 'Pacific/Fakaofo', 'Pacific/Fiji',\n    'Pacific/Funafuti', 'Pacific/Galapagos', 'Pacific/Gambier', 'Pacific/Guadalcanal', 'Pacific/Guam',\n    'Pacific/Honolulu', 'Pacific/Johnston', 'Pacific/Kiritimati', 'Pacific/Kosrae', 'Pacific/Kwajalein',\n    'Pacific/Majuro', 'Pacific/Marquesas', 'Pacific/Midway', 'Pacific/Nauru', 'Pacific/Niue', 'Pacific/Norfolk',\n    'Pacific/Noumea', 'Pacific/Pago_Pago', 'Pacific/Palau', 'Pacific/Pitcairn', 'Pacific/Pohnpei', 'Pacific/Ponape',\n    'Pacific/Port_Moresby', 'Pacific/Rarotonga', 'Pacific/Saipan', 'Pacific/Samoa', 'Pacific/Tahiti', 'Pacific/Tarawa',\n    'Pacific/Tongatapu', 'Pacific/Truk', 'Pacific/Wake', 'Pacific/Wallis', 'Pacific/Yap', 'Poland', 'Portugal',\n    'ROC', 'ROK', 'Singapore', 'Turkey', 'UCT', 'US/Alaska', 'US/Aleutian', 'US/Arizona', 'US/Central',\n    'US/East-Indiana', 'US/Eastern', 'US/Hawaii', 'US/Indiana-Starke', 'US/Michigan', 'US/Mountain', 'US/Pacific',\n    'US/Pacific-New', 'US/Samoa', 'UTC', 'Universal', 'W-SU', 'WET', 'Zulu'\n];\n\n/**\n * Yes, wrapping dayjs is a bit annoying and might seem overly paranoid. However, I feel strongly\n * about not letting Dayjs instances leak into the rest of the codebase. Having Dayjs objects\n * floating around the application leads to inconsistent timezone handling, makes testing more\n * difficult, and creates subtle bugs that are hard to track down.\n *\n * By wrapping dayjs completely and only exposing plain JavaScript Date objects, we get several\n * key benefits:\n * 1. Consistent timezone handling through a single configuration point\n * 2. Simpler testing since we only need to mock this one library\n * 3. Type safety - the rest of the codebase only deals with standard Date objects\n * 4. No risk of dayjs method chains creating unexpected timezone shifts\n *\n * The Library interface gives us full control over all date operations while keeping the messy\n * details of timezone manipulation contained in one place. Yes it's more code, but the peace of\n * mind is worth it.\n */\nexport interface Utility {\n    now: () => Date;\n    today: () => string;\n    date: (date: string | number | Date | null | undefined) => Date;\n    parse: (date: string | number | Date | null | undefined, format: string) => Date;\n    isValidDate: (date: string, format: string) => boolean;\n    addDays: (date: Date, days: number) => Date;\n    addMonths: (date: Date, months: number) => Date;\n    addYears: (date: Date, years: number) => Date;\n    format: (date: Date, format: string) => string;\n    subDays: (date: Date, days: number) => Date;\n    subMonths: (date: Date, months: number) => Date;\n    subYears: (date: Date, years: number) => Date;\n    startOfMonth: (date: Date) => Date;\n    endOfMonth: (date: Date) => Date;\n    startOfYear: (date: Date) => Date;\n    endOfYear: (date: Date) => Date;\n    isBefore: (date: Date, other: Date) => boolean;\n    isAfter: (date: Date, other: Date) => boolean;\n}\n\nexport const create = (parameters: { timezone: string }) => {\n    const { timezone } = parameters;\n    const now = () => {\n        return dayjs().tz(timezone).toDate();\n    }\n\n    const today = () => {\n        // Return today's date formatted as YYYY-M-D in the specified timezone\n        return dayjs().tz(timezone).format(DATE_FORMAT_YEAR_MONTH_DAY);\n    }\n\n    const date = (date: string | number | Date | null | undefined) => {\n        let value: dayjs.Dayjs;\n        if (date) {\n            value = dayjs.tz(date, timezone);\n        } else {\n            value = dayjs().tz(timezone);\n        }\n\n        if (!value.isValid()) {\n            throw new Error(`Invalid date: ${date}`);\n        }\n\n        return value.toDate();\n    }\n\n    const parse = (date: string | number | Date | null | undefined, format: string) => {\n        const value = dayjs.tz(date, format, timezone);\n        if (!value.isValid()) {\n            throw new Error(`Invalid date: ${date}, expected format: ${format}`);\n        }\n\n        return value.toDate();\n    }\n\n    const isValidDate = (date: string, format: string): boolean => {\n        return dayjs(date, format, true).isValid(); // Use strict parsing\n    }\n\n    const addDays = (date: Date, days: number) => {\n        return dayjs.tz(date, timezone).add(days, 'day').toDate();\n    }\n\n    const addMonths = (date: Date, months: number) => {\n        return dayjs.tz(date, timezone).add(months, 'month').toDate();\n    }\n\n    const addYears = (date: Date, years: number) => {\n        return dayjs.tz(date, timezone).add(years, 'year').toDate();\n    }\n\n    const format = (date: Date, format: string) => {\n        return dayjs.tz(date, timezone).format(format);\n    }\n\n    const subDays = (date: Date, days: number) => {\n        return dayjs.tz(date, timezone).subtract(days, 'day').toDate();\n    }\n\n    const subMonths = (date: Date, months: number) => {\n        return dayjs.tz(date, timezone).subtract(months, 'month').toDate();\n    }\n\n    const subYears = (date: Date, years: number) => {\n        return dayjs.tz(date, timezone).subtract(years, 'year').toDate();\n    }\n\n    const startOfMonth = (date: Date) => {\n        return dayjs.tz(date, timezone).startOf('month').toDate();\n    }\n\n    const endOfMonth = (date: Date) => {\n        return dayjs.tz(date, timezone).endOf('month').toDate();\n    }\n\n    const startOfYear = (date: Date) => {\n        return dayjs.tz(date, timezone).startOf('year').toDate();\n    }\n\n    const endOfYear = (date: Date) => {\n        return dayjs.tz(date, timezone).endOf('year').toDate();\n    }\n\n    const isBefore = (date: Date, other: Date) => {\n        return dayjs.tz(date, timezone).isBefore(dayjs.tz(other, timezone));\n    }\n\n    const isAfter = (date: Date, other: Date) => {\n        return dayjs.tz(date, timezone).isAfter(dayjs.tz(other, timezone));\n    }\n\n    return { now, today, date, parse, isValidDate, addDays, addMonths, addYears, format, subDays, subMonths, subYears, startOfMonth, endOfMonth, startOfYear, endOfYear, isBefore, isAfter };\n}\n\nexport const validTimezones = () => {\n    return TIMEZONE_NAMES;\n}\n","import * as fs from 'node:fs';\nimport { glob } from 'glob';\nimport * as path from 'node:path';\nimport * as crypto from 'node:crypto';\n/**\n * This module exists to isolate filesystem operations from the rest of the codebase.\n * This makes testing easier by avoiding direct fs mocking in jest configuration.\n * \n * Additionally, abstracting storage operations allows for future flexibility - \n * this export utility may need to work with storage systems other than the local filesystem\n * (e.g. S3, Google Cloud Storage, etc).\n */\n\nexport interface Utility {\n    exists: (path: string) => Promise<boolean>;\n    isDirectory: (path: string) => Promise<boolean>;\n    isFile: (path: string) => Promise<boolean>;\n    isReadable: (path: string) => Promise<boolean>;\n    isWritable: (path: string) => Promise<boolean>;\n    isFileReadable: (path: string) => Promise<boolean>;\n    isDirectoryWritable: (path: string) => Promise<boolean>;\n    isDirectoryReadable: (path: string) => Promise<boolean>;\n    createDirectory: (path: string) => Promise<void>;\n    readFile: (path: string, encoding: string) => Promise<string>;\n    readStream: (path: string) => Promise<fs.ReadStream>;\n    writeFile: (path: string, data: string | Buffer, encoding: string) => Promise<void>;\n    forEachFileIn: (directory: string, callback: (path: string) => Promise<void>, options?: { pattern: string, limit?: number, concurrency?: number }) => Promise<void>;\n    hashFile: (path: string, length: number) => Promise<string>;\n    listFiles: (directory: string) => Promise<string[]>;\n}\n\nexport const create = (params: { log?: (message: string, ...args: any[]) => void }): Utility => {\n\n    // eslint-disable-next-line no-console\n    const log = params.log || console.log;\n\n    const exists = async (path: string): Promise<boolean> => {\n        try {\n            await fs.promises.stat(path);\n            return true;\n            // eslint-disable-next-line @typescript-eslint/no-unused-vars\n        } catch (error: any) {\n            return false;\n        }\n    }\n\n    const isDirectory = async (path: string): Promise<boolean> => {\n        const stats = await fs.promises.stat(path);\n        if (!stats.isDirectory()) {\n            log(`${path} is not a directory`);\n            return false;\n        }\n        return true;\n    }\n\n    const isFile = async (path: string): Promise<boolean> => {\n        const stats = await fs.promises.stat(path);\n        if (!stats.isFile()) {\n            log(`${path} is not a file`);\n            return false;\n        }\n        return true;\n    }\n\n    const isReadable = async (path: string): Promise<boolean> => {\n        try {\n            await fs.promises.access(path, fs.constants.R_OK);\n        } catch (error: any) {\n            log(`${path} is not readable: %s %s`, error.message, error.stack);\n            return false;\n        }\n        return true;\n    }\n\n    const isWritable = async (path: string): Promise<boolean> => {\n        try {\n            await fs.promises.access(path, fs.constants.W_OK);\n        } catch (error: any) {\n            log(`${path} is not writable: %s %s`, error.message, error.stack);\n            return false;\n        }\n        return true;\n    }\n\n    const isFileReadable = async (path: string): Promise<boolean> => {\n        return await exists(path) && await isFile(path) && await isReadable(path);\n    }\n\n    const isDirectoryWritable = async (path: string): Promise<boolean> => {\n        return await exists(path) && await isDirectory(path) && await isWritable(path);\n    }\n\n    const isDirectoryReadable = async (path: string): Promise<boolean> => {\n        return await exists(path) && await isDirectory(path) && await isReadable(path);\n    }\n\n    const createDirectory = async (path: string): Promise<void> => {\n        try {\n            await fs.promises.mkdir(path, { recursive: true });\n        } catch (mkdirError: any) {\n            throw new Error(`Failed to create output directory ${path}: ${mkdirError.message} ${mkdirError.stack}`);\n        }\n    }\n\n    const readFile = async (path: string, encoding: string): Promise<string> => {\n        return await fs.promises.readFile(path, { encoding: encoding as BufferEncoding });\n    }\n\n    const writeFile = async (path: string, data: string | Buffer, encoding: string): Promise<void> => {\n        await fs.promises.writeFile(path, data, { encoding: encoding as BufferEncoding });\n    }\n\n    const forEachFileIn = async (\n        directory: string,\n        callback: (file: string) => Promise<void>,\n        options: { pattern: string | string[], limit?: number, concurrency?: number } = { pattern: '*.*' },\n    ): Promise<void> => {\n        try {\n            // NOTE: glob loads all matching files into memory before processing.\n            // For directories with millions of files, this can cause out-of-memory errors.\n            // Consider using streaming glob or incremental processing for very large directories.\n            const files = await glob(options.pattern, { cwd: directory, nodir: true });\n            const concurrency = options.concurrency || 1;\n            const limit = options.limit || files.length;\n            \n            // Use a queue-based approach to avoid race conditions\n            const fileQueue: string[] = files.slice(0, limit);\n            let filesProcessed = 0;\n            \n            async function worker() {\n                while (fileQueue.length > 0 && filesProcessed < limit) {\n                    // Atomically get next file from queue\n                    const file = fileQueue.shift();\n                    if (!file) break;\n                    \n                    await callback(path.join(directory, file));\n                    \n                    // Atomically increment counter\n                    filesProcessed++;\n                    \n                    if (filesProcessed >= limit) {\n                        break;\n                    }\n                }\n            }\n            const workers = Array.from({ length: concurrency }, () => worker());\n            await Promise.all(workers);\n            if (filesProcessed >= limit) {\n                log(`Reached limit of ${limit} files, stopping`);\n            }\n        } catch (err: any) {\n            throw new Error(`Failed to glob pattern ${options.pattern} in ${directory}: ${err.message}`);\n        }\n    }\n\n    const readStream = async (path: string): Promise<fs.ReadStream> => {\n        return fs.createReadStream(path);\n    }\n\n    const hashFile = async (path: string, length: number): Promise<string> => {\n        const file = await readFile(path, 'utf8');\n        return crypto.createHash('sha256').update(file).digest('hex').slice(0, length);\n    }\n\n    const listFiles = async (directory: string): Promise<string[]> => {\n        return await fs.promises.readdir(directory);\n    }\n\n    return {\n        exists,\n        isDirectory,\n        isFile,\n        isReadable,\n        isWritable,\n        isFileReadable,\n        isDirectoryWritable,\n        isDirectoryReadable,\n        createDirectory,\n        readFile,\n        readStream,\n        writeFile,\n        forEachFileIn,\n        hashFile,\n        listFiles,\n    };\n}","import { Config } from \"./dreadcabinet\";\nimport {\n    ALLOWED_EXTENSIONS,\n    ALLOWED_INPUT_FILENAME_OPTIONS,\n    ALLOWED_INPUT_STRUCTURES,\n    ALLOWED_OUTPUT_FILENAME_OPTIONS,\n    ALLOWED_OUTPUT_STRUCTURES,\n} from \"./constants\";\nimport { ArgumentError } from \"./error/ArgumentError\";\nimport { FilenameOption, FilesystemStructure, Options } from \"./dreadcabinet\";\nimport * as Dates from \"./util/dates\";\nimport * as Storage from \"./util/storage\";\n\nexport { ArgumentError };\n\nexport const validate = async (config: Config, options: Options): Promise<void> => {\n\n    const storage = Storage.create({ log: options.logger.debug });\n\n    const validateInputDirectory = async (inputDirectory: string) => {\n        if (!await storage.isDirectoryReadable(inputDirectory)) {\n            throw new Error(`Input directory does not exist: ${inputDirectory}`);\n        }\n    }\n\n    const validateOutputDirectory = async (outputDirectory: string) => {\n        const isDirectoryWritable = await storage.isDirectoryWritable(outputDirectory);\n        if (!isDirectoryWritable) {\n            throw new Error(`Output directory does not exist: ${outputDirectory}`);\n        }\n    }\n\n    const validateOutputStructure = (outputStructure: string | undefined): void => {\n        const validOptions: FilesystemStructure[] = options.allowed?.outputStructures || ALLOWED_OUTPUT_STRUCTURES;\n        if (outputStructure && !validOptions.includes(outputStructure as FilesystemStructure)) {\n            throw new ArgumentError('--output-structure', `Invalid output structure: ${outputStructure}. Valid options are: ${validOptions.join(', ')}`);\n        }\n    }\n\n    const validateOutputFilenameOptions = (outputFilenameOptions: string[] | undefined, outputStructure: FilesystemStructure | undefined): void => {\n        if (outputFilenameOptions && outputFilenameOptions.length > 0) {\n            // Check if first argument contains commas - likely a comma-separated list\n            if (outputFilenameOptions[0].includes(',')) {\n                throw new ArgumentError('--output-filename-options', 'Filename options should be space-separated, not comma-separated. Example: --output-filename-options date time subject');\n            }\n\n            // Check if first argument looks like a quoted string containing multiple options\n            if (outputFilenameOptions.length === 1 && outputFilenameOptions[0].split(' ').length > 1) {\n                throw new ArgumentError('--output-filename-options', 'Filename options should not be quoted. Use: --output-filename-options date time subject instead of --output-filename-options \"date time subject\"');\n            }\n            const validOptions = options.allowed?.outputFilenameOptions || ALLOWED_OUTPUT_FILENAME_OPTIONS;\n            const invalidOptions = outputFilenameOptions.filter(opt => !validOptions.includes(opt as FilenameOption));\n            if (invalidOptions.length > 0) {\n                throw new ArgumentError('--output-filename-options', `Invalid filename options: ${invalidOptions.join(', ')}. Valid options are: ${validOptions.join(', ')}`);\n            }\n\n            // Validate date option against output structure\n            if (outputFilenameOptions.includes('date')) {\n                if (outputStructure && outputStructure === 'day') {\n                    throw new ArgumentError('--output-filename-options', 'Cannot use date in filename when output structure is \"day\"');\n                }\n            }\n        }\n    }\n\n    const validateInputStructure = (inputStructure: string | undefined): void => {\n        const validOptions: FilesystemStructure[] = options.allowed?.inputStructures || ALLOWED_INPUT_STRUCTURES;\n        if (inputStructure && !validOptions.includes(inputStructure as FilesystemStructure)) {\n            throw new ArgumentError('--input-structure', `Invalid input structure: ${inputStructure}. Valid options are: ${validOptions.join(', ')}`);\n        }\n    }\n\n    const validateInputFilenameOptions = (inputFilenameOptions: string[] | undefined, inputStructure: FilesystemStructure | undefined): void => {\n        if (inputFilenameOptions && inputFilenameOptions.length > 0) {\n            // Check if first argument contains commas - likely a comma-separated list\n            if (inputFilenameOptions[0].includes(',')) {\n                throw new ArgumentError('--input-filename-options', 'Filename options should be space-separated, not comma-separated. Example: --input-filename-options date time subject');\n            }\n\n            // Check if first argument looks like a quoted string containing multiple options\n            if (inputFilenameOptions.length === 1 && inputFilenameOptions[0].split(' ').length > 1) {\n                throw new ArgumentError('--input-filename-options', 'Filename options should not be quoted. Use: --input-filename-options date time subject instead of --input-filename-options \"date time subject\"');\n            }\n            const validOptions = options.allowed?.inputFilenameOptions || ALLOWED_INPUT_FILENAME_OPTIONS;\n            const invalidOptions = inputFilenameOptions.filter(opt => !validOptions.includes(opt as FilenameOption));\n            if (invalidOptions.length > 0) {\n                throw new ArgumentError('--input-filename-options', `Invalid filename options: ${invalidOptions.join(', ')}. Valid options are: ${validOptions.join(', ')}`);\n            }\n\n            // Validate date option against input structure\n            if (inputFilenameOptions.includes('date')) {\n                if (inputStructure && inputStructure === 'day') {\n                    throw new ArgumentError('--input-filename-options', 'Cannot use date in filename when input structure is \"day\"');\n                }\n            }\n        }\n    }\n\n    const validateTimezone = (timezone: string): void => {\n        const validOptions = Dates.validTimezones();\n        if (validOptions.includes(timezone)) {\n            return;\n        }\n        throw new ArgumentError('--timezone', `Invalid timezone: ${timezone}. Valid options are: ${validOptions.join(', ')}`);\n    }\n\n    const validateExtensions = (extensions: string[] | undefined): void => {\n        const validOptions = options.allowed?.extensions || ALLOWED_EXTENSIONS;\n        if (extensions) {\n            const invalidOptions = extensions.filter(ext => !validOptions.includes(ext));\n            if (invalidOptions.length > 0) {\n                throw new ArgumentError('--extensions', `Invalid extensions: ${invalidOptions.join(', ')}. Valid options are: ${validOptions.join(', ')}`);\n            }\n        }\n    }\n\n    // Validate timezone\n    validateTimezone(config.timezone);\n\n    if (options.features.includes('input') && config.inputDirectory) {\n        await validateInputDirectory(config.inputDirectory);\n    }\n\n    if (options.features.includes('input') && config.limit) {\n        if (config.limit < 1) {\n            throw new ArgumentError('--limit', 'Limit must be greater than 0');\n        }\n    }\n\n    if (options.features.includes('input') && config.concurrency !== undefined) {\n        if (!Number.isInteger(config.concurrency) || config.concurrency < 1) {\n            throw new ArgumentError('--concurrency', 'Concurrency must be a positive integer');\n        }\n    }\n\n    if (options.features.includes('output') && config.outputDirectory) {\n        await validateOutputDirectory(config.outputDirectory);\n    }\n\n    if (options.features.includes('structured-output')) {\n        // Validate filename options if provided\n        validateOutputStructure(config.outputStructure);\n        validateOutputFilenameOptions(config.outputFilenameOptions, config.outputStructure as FilesystemStructure);\n    }\n\n    if (options.features.includes('extensions')) {\n        validateExtensions(config.extensions);\n    }\n\n    if (options.features.includes('structured-input')) {\n        validateInputStructure(config.inputStructure);\n        validateInputFilenameOptions(config.inputFilenameOptions, config.inputStructure as FilesystemStructure);\n    }\n\n    return;\n}\n\n\n\n\n\n","import { Feature, FilenameOption, FilesystemStructure, Logger } from 'dreadcabinet';\nimport * as path from 'node:path';\nimport { z } from 'zod';\nimport { ArgumentError } from \"../configure\";\nimport { DATE_FORMAT_YEAR_MONTH_DAY } from '../constants';\nimport * as Dates from \"../util/dates\";\nimport * as Storage from \"../util/storage\";\n\nexport const DateRangeSchema = z.object({\n    start: z.date(),\n    end: z.date(),\n});\n\nexport type DateRange = z.infer<typeof DateRangeSchema>;\n\n// Sanitize a file extension to prevent glob injection.\n// Only allows alphanumeric characters, stripping any glob metacharacters.\nconst sanitizeExtension = (ext: string): string => {\n    return ext.replace(/[^a-zA-Z0-9]/g, '');\n};\n\n// Get the appropriate file pattern based on config and options\nexport const getFilePattern = (features: Feature[], extensions: string[], logger: Logger): string => {\n    // Validate extensions: they should not start with a dot.\n    if (extensions && extensions.length > 0) {\n        for (const ext of extensions) {\n            if (ext.startsWith('.')) {\n                // Throw an error as the dot is added automatically by the pattern generation.\n                // Using ArgumentError might be more consistent if available and appropriate here.\n                throw new Error(`Invalid extension format: \"${ext}\". Extensions should not start with a dot ('.').`);\n            }\n        }\n    }\n\n    let pattern = '**/*'; // Start with a broad pattern for recursive search\n    if (features.includes('extensions') && extensions && extensions.length > 0) {\n        const safeExtensions = extensions.map(sanitizeExtension).filter(ext => ext.length > 0);\n        if (safeExtensions.length === 0) {\n            throw new Error('No valid extensions provided after sanitization.');\n        }\n        if (safeExtensions.length === 1) {\n            pattern = `**/*.${safeExtensions[0]}`;\n        } else {\n            pattern = `**/*.{${safeExtensions.join(',')}}`;\n        }\n        logger.debug(`Applying extension filter: ${safeExtensions.join(',')}`);\n    } else {\n        pattern = `**/*.*`;\n        logger.debug(`No extension filter applied, using pattern: ${pattern}`);\n    }\n    return pattern;\n};\n\n\n// Helper function to parse date string based on expected format\n// Returns null if parsing fails\nexport const parseDateFromString = (\n    dateStr: string,\n    format: 'YYYY-M-D-HHmm' | 'M-D-HHmm' | 'D-HHmm' | 'HHmm',\n    shouldParseTime: boolean, // New required parameter\n    timezone: string,\n    year?: number,\n    month?: number,\n    day?: number\n): Date | null => {\n    // Basic validation\n    if (!dateStr) return null;\n\n    try {\n        let y = year ?? 0;\n        let mo = month ?? 0; // JS months are 0-indexed\n        let d = day ?? 1; // JS days are 1-indexed\n        let h = 0; // Default to 0\n        let mi = 0; // Default to 0\n\n        // Remove potential leading/trailing non-alphanumeric if needed, split by common separators\n        const cleanedDateStr = dateStr.replace(/^[^\\p{L}\\p{N}]+|[^\\p{L}\\p{N}]+$/gu, '');\n        const parts = cleanedDateStr.split(/[-_]/); // Allow dash or underscore\n\n        switch (format) {\n            case 'YYYY-M-D-HHmm': {\n                if (parts.length < 4 && shouldParseTime) return null; // Need time part if parsing it\n                if (parts.length < 3 && !shouldParseTime) return null; // Need at least date part\n                y = parseInt(parts[0], 10);\n                mo = parseInt(parts[1], 10) - 1; // Adjust month\n                d = parseInt(parts[2], 10);\n                if (shouldParseTime) {\n                    const timePartYD = parts[3];\n                    if (timePartYD.length < 4) return null; // Ensure HHmm exists\n                    h = parseInt(timePartYD.substring(0, 2), 10);\n                    mi = parseInt(timePartYD.substring(2, 4), 10);\n                }\n                break;\n            }\n            case 'M-D-HHmm': {\n                if (year === undefined) return null;\n                if (parts.length < 3 && shouldParseTime) return null;\n                if (parts.length < 2 && !shouldParseTime) return null;\n                mo = parseInt(parts[0], 10) - 1; // Adjust month\n                d = parseInt(parts[1], 10);\n                if (shouldParseTime) {\n                    const timePartMD = parts[2];\n                    if (timePartMD.length < 4) return null; // Ensure HHmm exists\n                    h = parseInt(timePartMD.substring(0, 2), 10);\n                    mi = parseInt(timePartMD.substring(2, 4), 10);\n                }\n                break;\n            }\n            case 'D-HHmm': {\n                if (year === undefined || month === undefined) return null;\n                if (parts.length < 2 && shouldParseTime) return null;\n                if (parts.length < 1 && !shouldParseTime) return null;\n                d = parseInt(parts[0], 10);\n                if (shouldParseTime) {\n                    const timePartD = parts[1];\n                    if (timePartD.length < 4) return null; // Ensure HHmm exists\n                    h = parseInt(timePartD.substring(0, 2), 10);\n                    mi = parseInt(timePartD.substring(2, 4), 10);\n                }\n                break;\n            }\n            case 'HHmm':\n                if (year === undefined || month === undefined || day === undefined) return null;\n                if (shouldParseTime) {\n                    if (parts[0].length !== 4) return null;\n                    h = parseInt(parts[0].substring(0, 2), 10);\n                    mi = parseInt(parts[0].substring(2, 4), 10);\n                } // Else h=0, mi=0 (set by defaults)\n                break;\n            default:\n                return null;\n        }\n\n        // Validate parsed numbers\n        if (isNaN(y) || isNaN(mo) || isNaN(d)) {\n            throw new Error(`Invalid date components in date string \"${dateStr}\" with format ${format}: Y:${y} M:${mo} D:${d}`);\n        }\n\n        // Set hour and minute to 0 if not provided\n        if (isNaN(h)) {\n            h = 0;\n        }\n        if (isNaN(mi)) {\n            mi = 0;\n        }\n\n        if (mo < 0 || mo > 11 || d < 1 || d > 31 || h < 0 || h > 23 || mi < 0 || mi > 59) {\n            throw new Error(`Invalid date components in date string \"${dateStr}\" with format ${format}: Y:${y} M:${mo + 1} D:${d} H:${h} m:${mi}`);\n        }\n\n        // Create timezone-aware date\n        // For UTC timezone, use Date.UTC for efficiency and exact matching\n        // For other timezones, use timezone-aware parsing\n        let date: Date;\n        if (timezone === 'UTC' || timezone === 'Etc/UTC') {\n            date = new Date(Date.UTC(y, mo, d, h, mi));\n            // Validate that Date didn't adjust invalid dates (e.g., Feb 30 -> Mar 2)\n            if (date.getUTCFullYear() !== y || \n                date.getUTCMonth() !== mo || \n                date.getUTCDate() !== d || \n                date.getUTCHours() !== h || \n                date.getUTCMinutes() !== mi) {\n                return null;\n            }\n        } else {\n            // Use timezone-aware parsing for non-UTC timezones\n            const dates = Dates.create({ timezone });\n            const monthStr = String(mo + 1).padStart(2, '0');\n            const dayStr = String(d).padStart(2, '0');\n            const hourStr = String(h).padStart(2, '0');\n            const minuteStr = String(mi).padStart(2, '0');\n            const dateStrFormatted = `${y}-${monthStr}-${dayStr}T${hourStr}:${minuteStr}:00`;\n            \n            try {\n                date = dates.date(dateStrFormatted);\n                \n                // Validate that the date components match in the timezone context\n                const formattedYear = parseInt(dates.format(date, 'YYYY'), 10);\n                const formattedMonth = parseInt(dates.format(date, 'M'), 10);\n                const formattedDay = parseInt(dates.format(date, 'D'), 10);\n                const formattedHour = parseInt(dates.format(date, 'H'), 10);\n                const formattedMinute = parseInt(dates.format(date, 'm'), 10);\n                \n                // Check if date was adjusted (e.g., Feb 30 -> Mar 2)\n                if (formattedYear !== y || \n                    formattedMonth !== (mo + 1) || \n                    formattedDay !== d ||\n                    formattedHour !== h ||\n                    formattedMinute !== mi) {\n                    return null;\n                }\n            } catch {\n                return null;\n            }\n        }\n        \n        return date;\n        // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    } catch (e) {\n        // console.error(`Error parsing date string \"${dateStr}\" with format ${format}:`, e);\n        return null;\n    }\n};\n\n// Helper to check if date is within range (start inclusive, end exclusive)\nexport const isDateInRange = (date: Date, range?: DateRange): boolean => {\n    if (!range || (!range.start && !range.end)) return true; // No range or empty range means all dates are valid\n\n    // Ensure range dates are Date objects\n    const startDate = range.start ? (range.start instanceof Date ? range.start : new Date(range.start)) : null;\n    const endDate = range.end ? (range.end instanceof Date ? range.end : new Date(range.end)) : null;\n\n    // Validate parsed range dates\n    const isStartDateValid = startDate && !isNaN(startDate.getTime());\n    const isEndDateValid = endDate && !isNaN(endDate.getTime());\n\n\n    if (isStartDateValid && date < startDate!) {\n        return false;\n    }\n    // End date is exclusive\n    if (isEndDateValid && date >= endDate!) {\n        return false;\n    }\n    return true;\n};\n\nexport const calculateDateRange = (timezone: string, startDate: Date, endDate: Date): DateRange => {\n\n    // Create date utility after timezone is validated\n    const dateUtil = Dates.create({ timezone });\n\n    const now = dateUtil.now();\n    const range: DateRange = {\n        start: dateUtil.subDays(now, 31),\n        end: now,\n    }\n\n    // Note: Validation ensures dates are valid and start <= end if both are provided\n    if (startDate || endDate) {\n\n        // Handle end date\n        if (endDate) {\n            range.end = dateUtil.parse(endDate, DATE_FORMAT_YEAR_MONTH_DAY);\n        }\n\n        // Handle start date\n        if (startDate) {\n            range.start = dateUtil.parse(startDate, DATE_FORMAT_YEAR_MONTH_DAY);\n        }\n\n        // We re-check the order here after defaults might have been applied,\n        // although validateStartEndDates should catch explicit invalid orders.\n        if (dateUtil.isBefore(range.end, range.start)) {\n            // This case should theoretically not be reachable due to prior validation\n            // but is kept as a safeguard.\n            throw new ArgumentError('--start', `Start date (${dateUtil.format(range.start, DATE_FORMAT_YEAR_MONTH_DAY)}) cannot be after end date (${dateUtil.format(range.end, DATE_FORMAT_YEAR_MONTH_DAY)}).`);\n        }\n\n    }\n\n    return range;\n}\n\n\n\n// Parse date from file path based on the input structure\nexport const parseDateFromFilePath = (\n    relativePath: string,\n    filename: string,\n    structure: string,\n    shouldParseTime: boolean,\n    timezone: string,\n    logger: Logger\n): Date | null => {\n    const pathParts = relativePath.split(path.sep);\n    const filenameWithoutExt = path.basename(filename, path.extname(filename));\n\n    let parsedDate: Date | null = null;\n    let year: number | undefined;\n    let month: number | undefined; // 0-indexed month for Date constructor\n    let day: number | undefined;\n\n    switch (structure) {\n        case 'none':\n            // Filename format: YYYY-M-D-HHmm...\n            parsedDate = parseDateFromString(filenameWithoutExt, 'YYYY-M-D-HHmm', shouldParseTime, timezone);\n            break;\n        case 'year':\n            // Path: YYYY / M-D-HHmm...\n            if (pathParts.length >= 1) {\n                year = parseInt(pathParts[0], 10);\n                if (!isNaN(year)) {\n                    parsedDate = parseDateFromString(filenameWithoutExt, 'M-D-HHmm', shouldParseTime, timezone, year);\n                } else {\n                    logger.warn(`Invalid year format in path: ${pathParts[0]}`);\n                }\n            } else {\n                logger.warn(`File path does not match expected 'year' structure (YYYY/...)`);\n            }\n            break;\n        case 'month':\n            // Path: YYYY / MM / D-HHmm...\n            if (pathParts.length >= 2) {\n                year = parseInt(pathParts[0], 10);\n                const monthDir = parseInt(pathParts[1], 10); // Month from dir (1-indexed)\n                if (!isNaN(year) && !isNaN(monthDir) && monthDir >= 1 && monthDir <= 12) {\n                    month = monthDir - 1; // Adjust month for Date object (0-indexed)\n                    parsedDate = parseDateFromString(filenameWithoutExt, 'D-HHmm', shouldParseTime, timezone, year, month);\n                } else {\n                    logger.warn(`Invalid year/month format in path: ${pathParts[0]}/${pathParts[1]}`);\n                }\n            } else {\n                logger.warn(`File path does not match expected 'month' structure (YYYY/MM/...)`);\n            }\n            break;\n        case 'day':\n            // Path: YYYY / MM / DD / HHmm...\n            if (pathParts.length >= 3) {\n                year = parseInt(pathParts[0], 10);\n                const monthDir = parseInt(pathParts[1], 10); // Month from dir (1-indexed)\n                day = parseInt(pathParts[2], 10); // Day from dir (1-indexed)\n                if (!isNaN(year) && !isNaN(monthDir) && monthDir >= 1 && monthDir <= 12 && !isNaN(day) && day >= 1 && day <= 31) {\n                    month = monthDir - 1; // Adjust month (0-indexed)\n                    parsedDate = parseDateFromString(filenameWithoutExt, 'HHmm', shouldParseTime, timezone, year, month, day);\n                } else {\n                    logger.warn(`Invalid year/month/day format in path: ${pathParts[0]}/${pathParts[1]}/${pathParts[2]}`);\n                }\n            } else {\n                logger.warn(`File path does not match expected 'day' structure (YYYY/MM/DD/...)`);\n            }\n            break;\n        default:\n            logger.error(`Fatal: Unknown input structure \"${structure}\" specified in config.`);\n            throw new Error(`Unknown input structure \"${structure}\" specified.`);\n    }\n\n    return parsedDate;\n};\n\n// Process a single file from the structured input\nexport const processStructuredFile = async (\n    filePath: string,\n    inputDirectory: string,\n    structure: string,\n    shouldParseTime: boolean,\n    timezone: string,\n    callback: (file: string, date?: Date) => Promise<void>,\n    pattern: string,\n    dateRange: DateRange,\n    logger: Logger\n): Promise<boolean> => {\n    // Skip if filePath somehow points to the inputDirectory itself or is not a file\n    if (filePath === inputDirectory || !path.extname(filePath) && pattern.endsWith('*.*')) {\n        return false;\n    }\n\n    const relativePath = path.relative(inputDirectory, filePath);\n    const pathParts = relativePath.split(path.sep);\n    const filename = pathParts.pop(); // Filename is the last part\n\n    if (!filename) {\n        logger.warn(`Could not determine filename for path: ${filePath}`);\n        return false;\n    }\n\n    try {\n        const parsedDate = parseDateFromFilePath(relativePath, filename, structure, shouldParseTime, timezone, logger);\n\n        if (parsedDate) {\n            // Apply date range filtering\n            if (isDateInRange(parsedDate, dateRange)) {\n                logger.debug('Processing file %s with date %s', filePath, parsedDate.toISOString());\n                await callback(filePath, parsedDate);\n                return true;\n            } else {\n                const dateRangeDisplay = dateRange ?\n                    `from ${dateRange.start ? new Date(dateRange.start).toISOString() : 'beginning'} up to ${dateRange.end ? new Date(dateRange.end).toISOString() : 'end'}` :\n                    'all dates';\n                logger.debug('Skipping file %s, date %s out of range %s', filePath, parsedDate.toISOString(), dateRangeDisplay);\n            }\n        } else {\n            logger.warn('Could not parse date for file %s with structure \"%s\" (filename base: \"%s\", path parts: %s)',\n                filePath, structure, path.basename(filename, path.extname(filename)), pathParts.join('/'));\n        }\n    } catch (error) {\n        // Log error from the callback or date parsing/filtering itself\n        if (error instanceof Error) {\n            logger.error('Error processing file %s: %s\\n%s', filePath, error.message, error.stack);\n        } else {\n            logger.error('Error processing file %s: %s', filePath, error);\n        }\n    }\n\n    return false;\n};\n\nexport const process = async (\n    inputStructure: FilesystemStructure,\n    inputFilenameOptions: FilenameOption[],\n    extensions: string[],\n    timezone: string,\n    start: Date,\n    end: Date,\n    limit: number | undefined,\n    features: Feature[],\n    logger: Logger,\n    inputDirectory: string,\n    callback: (file: string, date?: Date) => Promise<void>,\n    concurrency?: number\n): Promise<number> => {\n    const storage = Storage.create({ log: logger.debug });\n    const dateRange = calculateDateRange(timezone, start, end);\n\n    let fileCount = 0;\n\n    // Validate date range dates if provided\n    if (dateRange?.start && (!dateRange.start || isNaN(dateRange.start.getTime()))) {\n        throw new Error(`Invalid start date provided in dateRange: ${dateRange.start}`);\n    }\n    if (dateRange?.end && (!dateRange.end || isNaN(dateRange.end.getTime()))) {\n        throw new Error(`Invalid end date provided in dateRange: ${dateRange.end}`);\n    }\n\n    // Structured Input Logic\n    const structure = inputStructure ?? 'none'; // Default to 'none' if not specified\n    logger.info(`Processing structured input with structure \"${structure}\" in %s for date range: ${JSON.stringify(dateRange)}`, inputDirectory);\n\n    // Determine if time should be parsed from filenames\n    const shouldParseTime = inputFilenameOptions?.includes('time') ?? false;\n    if (shouldParseTime) {\n        logger.debug('Filename time parsing enabled based on inputFilenameOptions.');\n    } else {\n        logger.debug('Filename time parsing disabled; defaulting times to 00:00 UTC.');\n    }\n\n    const filePattern = getFilePattern(features, extensions || [], logger);\n\n    logger.debug('Processing Structured Input with pattern %s from %s', filePattern, inputDirectory);\n\n    await storage.forEachFileIn(inputDirectory, async (filePath: string) => {\n        const processed = await processStructuredFile(\n            filePath,\n            inputDirectory,\n            structure,\n            shouldParseTime,\n            timezone,\n            callback,\n            filePattern,\n            dateRange,\n            logger\n        );\n\n        if (processed) {\n            fileCount++;\n        }\n    }, { pattern: filePattern, limit, concurrency } as { pattern: string, limit?: number, concurrency?: number });\n\n    return fileCount;\n}\n\n\n\n\n","import { Logger } from 'dreadcabinet';\nimport * as Storage from \"../util/storage\";\n\n// Sanitize a file extension to prevent glob injection.\n// Only allows alphanumeric characters, stripping any glob metacharacters.\nconst sanitizeExtension = (ext: string): string => {\n    return ext.replace(/[^a-zA-Z0-9]/g, '');\n};\n\n// Process files with unstructured input pattern\nexport const process = async (\n    inputDirectory: string,\n    recursive: boolean,\n    extensions: string[],\n    limit: number | undefined,\n    logger: Logger,\n    callback: (file: string) => Promise<void>,\n    concurrency?: number\n): Promise<number> => {\n    const storage = Storage.create({ log: logger.debug });\n\n    let fileCount = 0;\n    let filePattern = `${recursive ? '**/' : ''}*`;\n\n    if (extensions && extensions.length > 0) {\n        const safeExtensions = extensions.map(sanitizeExtension).filter(ext => ext.length > 0);\n        if (safeExtensions.length === 0) {\n            throw new Error('No valid extensions provided after sanitization.');\n        }\n        // Ensure the pattern correctly handles extensions with or without recursion\n        if (recursive) {\n            filePattern = `**/*.{${safeExtensions.join(',')}}`;\n        } else {\n            filePattern = `*.{${safeExtensions.join(',')}}`;\n        }\n        logger.debug(`Applying extension filter: ${safeExtensions.join(',')}`);\n    } else if (!recursive) {\n        // Non-recursive without extension filter: only files in the top directory\n        filePattern = `*.*`; // Adjust if files without extensions need matching\n    }\n\n    logger.info('Processing unstructured files %s in %s with pattern %s',\n        recursive ? 'recursively' : 'non-recursively', inputDirectory, filePattern);\n\n    await storage.forEachFileIn(inputDirectory, async (file: string) => {\n        try {\n            logger.debug('Processing file %s', file);\n            // Call callback without date for unstructured input\n            await callback(file); // Pass undefined for the date parameter\n            fileCount++;\n        } catch (error) {\n            if (error instanceof Error) {\n                logger.error('Error processing file %s: %s\\n%s', file, error.message, error.stack);\n            } else {\n                logger.error('Error processing file %s: %s', file, error);\n            }\n        }\n    }, { pattern: filePattern, limit, concurrency } as { pattern: string, limit?: number, concurrency?: number });\n\n    return fileCount;\n};\n\n","import { Config, Feature, Logger } from \"dreadcabinet\";\nimport { process as processStructuredInput } from \"./structured\";\nimport { process as processUnstructuredInput } from \"./unstructured\";\n\nexport const process = async (\n    config: Config,\n    features: Feature[],\n    logger: Logger,\n    callback: (file: string) => Promise<void>,\n    { start, end }: { start?: Date, end?: Date } = {}\n) => {\n    if (!features.includes('input')) {\n        throw new Error('Input feature is not enabled, skipping input processing');\n    }\n\n    const concurrency = config.concurrency;\n    if (!concurrency) {\n        throw new Error('Concurrency is not configured');\n    }\n\n    const inputDirectory = config.inputDirectory;\n    if (!inputDirectory) {\n        throw new Error('Input directory is not configured');\n    }\n\n    let fileCount = 0;\n\n    if (features.includes('structured-input')) {\n        logger.debug('Processing Structured Input from %s with start date %s and end date %s', inputDirectory, start, end);\n\n        if (!start || !end) {\n            throw new Error('Start or end date are both required for structured input');\n        } else {\n            fileCount = await processStructuredInput(\n                config.inputStructure!,\n                config.inputFilenameOptions!,\n                config.extensions!,\n                config.timezone,\n                start,\n                end,\n                config.limit,\n                features,\n                logger,\n                inputDirectory,\n                callback,\n                concurrency\n            )\n        }\n\n\n    } else {\n        // Original Unstructured Input Logic\n        logger.debug('Processing Unstructured Input from %s', inputDirectory);\n\n        if (start || end) {\n            throw new Error('Start or end date is not allowed for unstructured input');\n        }\n\n        fileCount = await processUnstructuredInput(\n            inputDirectory,\n            config.recursive || false,\n            config.extensions || [],\n            config.limit,\n            logger,\n            callback,\n            concurrency\n        );\n    }\n\n    logger.info('Processed %d files matching criteria.', fileCount);\n};\n","import { Config, Options } from \"dreadcabinet\";\nimport { process } from './process';\n\nexport const create = (config: Config, options: Options) => {\n    type ProcessCallback = (file: string, date?: Date) => Promise<void>;\n\n    return {\n        process: (callback: ProcessCallback, { start, end }: { start?: Date, end?: Date } = {}) => process(config, options.features, options.logger, callback, { start, end }),\n    };\n}","import * as path from 'node:path';\nimport { DATE_FORMAT_DAY, DATE_FORMAT_MONTH, DATE_FORMAT_MONTH_DAY, DATE_FORMAT_YEAR, DATE_FORMAT_YEAR_MONTH_DAY } from './constants';\nimport { Config } from './dreadcabinet';\nimport * as Dates from './util/dates';\nimport * as Storage from './util/storage';\nimport { Options } from 'dreadcabinet';\n\nexport const create = (config: Config, options: Options): {\n    constructFilename: (date: Date, type: string, hash: string, options?: { subject?: string }) => string;\n    constructOutputDirectory: (creationTime: Date) => Promise<string>;\n} => {\n    const logger = options.logger;\n    const timezone = config?.timezone || 'UTC';\n    const dates = Dates.create({ timezone });\n    const storage: Storage.Utility = Storage.create({ log: logger.debug });\n\n    const { outputDirectory, outputStructure, outputFilenameOptions } = config;\n\n    function formatDate(date: Date, outputStructure: 'none' | 'year' | 'month' | 'day'): string {\n\n        if (!outputStructure) {\n            throw new Error('Unable to Create Output: Output structure is not set');\n        }\n\n        switch (outputStructure) {\n            case 'none':\n                return dates.format(date, DATE_FORMAT_YEAR_MONTH_DAY);\n            case 'year':\n                return dates.format(date, DATE_FORMAT_MONTH_DAY);\n            case 'month':\n                return dates.format(date, DATE_FORMAT_DAY);\n            case 'day':\n                throw new Error('Cannot use date in filename when output structure is \"day\"');\n        }\n    }\n\n    function sanitizeFilenameString(str: string): string {\n        // Replace any character that is not alphanumeric (including unicode), hyphen, underscore, or dot with an underscore\n        // Use \\p{L} for unicode letters and \\p{N} for unicode numbers\n        return str.replace(/[^\\p{L}\\p{N}\\-_.]/gu, '_')\n            // Replace multiple consecutive underscores with a single underscore\n            .replace(/_+/g, '_')\n            // Remove leading and trailing underscores\n            .replace(/^_+|_+$/g, '')\n            // Ensure the string is not empty\n            .replace(/^$/, 'untitled');\n    }\n\n    function constructFilename(\n        date: Date,\n        type: string,\n        hash: string,\n        options: {\n            subject?: string;\n        } = {}\n    ): string {\n        const parts: string[] = [];\n\n        // Add date if requested\n        if (outputFilenameOptions?.includes('date')) {\n            const dateStr = formatDate(date, outputStructure!);\n            parts.push(dateStr);\n        }\n\n        // Add time if requested\n        if (outputFilenameOptions?.includes('time')) {\n            const dates = Dates.create({ timezone });\n            const timeStr = dates.format(date, 'HHmm');\n            parts.push(timeStr);\n        }\n\n        // Add message ID\n        parts.push(hash);\n        parts.push(type);\n\n        // Add subject if requested\n        if (outputFilenameOptions?.includes('subject')) {\n            // Sanitize the provided subject, defaulting to empty string if undefined/null\n            parts.push(sanitizeFilenameString(options.subject || ''));\n        }\n\n        return parts.join('-');\n    }\n\n    async function constructOutputDirectory(creationTime: Date) {\n\n        // Throw this error to ensure that we don't success if outputDirectory or outputStructure are not set\n        if (!outputDirectory) {\n            throw new Error('Unable to Create Output: Output directory is not set');\n        }\n\n\n        if (!outputStructure) {\n            throw new Error('Unable to Create Output: Output structure is not set');\n        }\n\n\n        const date = dates.date(creationTime);\n        const year = dates.format(date, DATE_FORMAT_YEAR);\n        const month = dates.format(date, DATE_FORMAT_MONTH);\n        const day = dates.format(date, DATE_FORMAT_DAY);\n\n        let outputPath: string;\n        switch (outputStructure) {\n            case 'year':\n                outputPath = path.join(outputDirectory!, year);\n                break;\n            case 'month':\n                outputPath = path.join(outputDirectory!, year, month);\n                break;\n            case 'day':\n                outputPath = path.join(outputDirectory!, year, month, day);\n                break;\n            default:\n                outputPath = outputDirectory!;\n        }\n\n        await storage.createDirectory(outputPath);\n        return outputPath;\n    }\n\n    return {\n        constructFilename,\n        constructOutputDirectory,\n    }\n}\n","import { Args, Operator, Options } from 'dreadcabinet';\nimport { Config } from './dreadcabinet';\nimport * as Input from './input/input';\nimport * as Output from './output';\n\nexport const create = async (config: Config, args: Args, options: Options): Promise<Operator> => {\n\n    const output = Output.create(config, options);\n    const input = Input.create(config, options);\n\n    const constructFilename = async (createDate: Date, type: string, hash: string, context?: { subject?: string }): Promise<string> => {\n        if (!options.features.includes('output')) {\n            throw new Error('Output feature is not enabled, skipping output construction');\n        }\n        return output.constructFilename(createDate, type, hash, context);\n    }\n\n    const constructOutputDirectory = async (createDate: Date): Promise<string> => {\n        if (!options.features.includes('output')) {\n            throw new Error('Output feature is not enabled, skipping output construction');\n        }\n        return output.constructOutputDirectory(createDate);\n    }\n\n    return {\n        process: input.process,\n        constructFilename,\n        constructOutputDirectory,\n    }\n\n}\n\n\n\n\n\n\n","import { Logger } from \"dreadcabinet\";\nimport { PROGRAM_NAME } from \"./constants\";\n\nexport const wrapLogger = (toWrap: Logger): Logger => {\n\n    const log = (level: keyof Logger, message: string, ...args: any[]) => {\n\n        message = `[${PROGRAM_NAME}] ${message}`;\n        toWrap[level](message, ...args);\n    }\n\n    return {\n        debug: (message: string, ...args: any[]) => log('debug', message, ...args),\n        info: (message: string, ...args: any[]) => log('info', message, ...args),\n        warn: (message: string, ...args: any[]) => log('warn', message, ...args),\n        error: (message: string, ...args: any[]) => log('error', message, ...args),\n        verbose: (message: string, ...args: any[]) => log('verbose', message, ...args),\n        silly: (message: string, ...args: any[]) => log('silly', message, ...args),\n    }\n}","import { Command } from 'commander';\nimport { configure } from './configure';\nimport { applyDefaults } from './defaults';\nimport { read } from './read';\nimport { validate } from './validate';\n\nimport { ALLOWED_EXTENSIONS, ALLOWED_INPUT_FILENAME_OPTIONS, ALLOWED_INPUT_STRUCTURES, ALLOWED_OUTPUT_FILENAME_OPTIONS, ALLOWED_OUTPUT_STRUCTURES, DEFAULT_CONCURRENCY, DEFAULT_EXTENSIONS, DEFAULT_INPUT_DIRECTORY, DEFAULT_INPUT_FILENAME_OPTIONS, DEFAULT_INPUT_STRUCTURE, DEFAULT_OUTPUT_DIRECTORY, DEFAULT_OUTPUT_FILENAME_OPTIONS, DEFAULT_OUTPUT_STRUCTURE, DEFAULT_RECURSIVE, DEFAULT_TIMEZONE } from './constants';\nimport { z } from 'zod';\nimport { create as createOperator } from './operate';\nimport { wrapLogger } from './logger';\n\nexport interface Args {\n    recursive: boolean;\n    timezone: string;\n    inputDirectory: string;\n    inputStructure?: FilesystemStructure;\n    inputFilenameOptions?: FilenameOption[];\n    outputDirectory: string;\n    outputStructure?: FilesystemStructure;\n    outputFilenameOptions?: FilenameOption[];\n    extensions: string[];\n    start?: string; // Start date string\n    end?: string;   // End date string\n    limit?: number; // Limit the number of files to process\n    concurrency?: number; // Concurrency level for processing files\n}\n\nexport type Feature = 'input' | 'output' | 'structured-output' | 'structured-input' | 'extensions';\n\nexport const FilenameOptionSchema = z.enum([\n    'date',\n    'time',\n    'subject',\n]);\n\nexport type FilenameOption = z.infer<typeof FilenameOptionSchema>;\n\nexport const FilesystemStructureSchema = z.enum([\n    'none',\n    'year',\n    'month',\n    'day',\n]);\n\nexport type FilesystemStructure = z.infer<typeof FilesystemStructureSchema>;\n\nexport interface DefaultOptions {\n    timezone?: string;\n    recursive?: boolean;\n    inputDirectory?: string;\n    inputStructure?: FilesystemStructure;\n    inputFilenameOptions?: FilenameOption[];\n    outputDirectory?: string;\n    outputStructure?: FilesystemStructure;\n    outputFilenameOptions?: FilenameOption[];\n    extensions?: string[];\n    startDate?: string;\n    endDate?: string;\n    limit?: number;\n    concurrency?: number;\n}\n\nexport interface AllowedOptions {\n    inputStructures?: FilesystemStructure[];\n    inputFilenameOptions?: FilenameOption[];\n    outputStructures?: FilesystemStructure[];\n    outputFilenameOptions?: FilenameOption[];\n    extensions?: string[];\n}\n\nexport interface Options {\n    defaults?: DefaultOptions,\n    allowed?: AllowedOptions,\n    features: Feature[],\n    addDefaults: boolean;\n    logger: Logger;\n}\n\nexport interface Logger {\n    debug: (message: string, ...args: any[]) => void;\n    info: (message: string, ...args: any[]) => void;\n    warn: (message: string, ...args: any[]) => void;\n    error: (message: string, ...args: any[]) => void;\n    verbose: (message: string, ...args: any[]) => void;\n    silly: (message: string, ...args: any[]) => void;\n}\n\nexport const DEFAULT_APP_OPTIONS: DefaultOptions = {\n    timezone: DEFAULT_TIMEZONE,\n    recursive: DEFAULT_RECURSIVE,\n    inputDirectory: DEFAULT_INPUT_DIRECTORY,\n    inputStructure: DEFAULT_INPUT_STRUCTURE,\n    inputFilenameOptions: DEFAULT_INPUT_FILENAME_OPTIONS,\n    outputDirectory: DEFAULT_OUTPUT_DIRECTORY,\n    outputStructure: DEFAULT_OUTPUT_STRUCTURE,\n    outputFilenameOptions: DEFAULT_OUTPUT_FILENAME_OPTIONS,\n    extensions: DEFAULT_EXTENSIONS,\n    concurrency: DEFAULT_CONCURRENCY,\n}\n\nexport const DEFAULT_ALLOWED_OPTIONS: AllowedOptions = {\n    inputStructures: ALLOWED_INPUT_STRUCTURES,\n    inputFilenameOptions: ALLOWED_INPUT_FILENAME_OPTIONS,\n    outputStructures: ALLOWED_OUTPUT_STRUCTURES,\n    outputFilenameOptions: ALLOWED_OUTPUT_FILENAME_OPTIONS,\n    extensions: ALLOWED_EXTENSIONS,\n}\n\nexport const DEFAULT_FEATURES: Feature[] = ['output', 'structured-output', 'input', 'extensions'];\n\nexport const DEFAULT_LOGGER: Logger = {\n    // eslint-disable-next-line no-console\n    debug: (message: string, ...args: any[]) => console.debug(message, ...args),\n    // eslint-disable-next-line no-console\n    info: (message: string, ...args: any[]) => console.info(message, ...args),\n    // eslint-disable-next-line no-console\n    warn: (message: string, ...args: any[]) => console.warn(message, ...args),\n    // eslint-disable-next-line no-console\n    error: (message: string, ...args: any[]) => console.error(message, ...args),\n    // eslint-disable-next-line no-console\n    verbose: (message: string, ...args: any[]) => console.log(message, ...args),\n    // eslint-disable-next-line no-console\n    silly: (message: string, ...args: any[]) => console.log(message, ...args),\n}\n\nexport const DEFAULT_OPTIONS = {\n    defaults: DEFAULT_APP_OPTIONS,\n    allowed: DEFAULT_ALLOWED_OPTIONS,\n    features: DEFAULT_FEATURES,\n    addDefaults: true,\n    logger: DEFAULT_LOGGER,\n};\n\nexport const ConfigSchema = z.object({\n    timezone: z.string(),\n    inputDirectory: z.string().optional(),\n    inputStructure: FilesystemStructureSchema.optional(),\n    inputFilenameOptions: z.array(FilenameOptionSchema).optional(),\n    recursive: z.boolean().optional(),\n    outputDirectory: z.string().optional(),\n    outputStructure: FilesystemStructureSchema.optional(),\n    outputFilenameOptions: z.array(FilenameOptionSchema).optional(),\n    extensions: z.array(z.string()).optional(),\n    limit: z.number().optional(),\n    concurrency: z.number().optional(),\n});\n\nexport interface DateRange {\n    start: Date;\n    end: Date;\n}\n\nexport type Config = z.infer<typeof ConfigSchema>;\n\nexport interface Operator {\n    process: (callback: (file: string) => Promise<void>, dateRange?: Partial<DateRange>, concurrency?: number) => Promise<void>;\n    constructFilename: (createDate: Date, type: string, hash: string, options?: { subject?: string }) => Promise<string>;\n    constructOutputDirectory: (createDate: Date) => Promise<string>;\n}\n\nexport interface DreadCabinet {\n    configure: (command: Command) => Promise<void>;\n    setLogger: (logger: Logger) => void;\n    read: (args: Args) => Promise<Partial<Config>>;\n    applyDefaults: (config: Partial<Config>) => Config;\n    validate: (config: Config) => Promise<void>;\n    operate: (config: Config) => Promise<Operator>;\n}\n\nexport const create = (\n    creationOptsParam: Partial<Options> = {}\n): DreadCabinet => {\n\n    let args: Args;\n\n    const options: Options = {\n        defaults: { ...DEFAULT_APP_OPTIONS, ...creationOptsParam.defaults },\n        allowed: { ...DEFAULT_ALLOWED_OPTIONS, ...creationOptsParam.allowed },\n        features: creationOptsParam.features || DEFAULT_FEATURES,\n        addDefaults: creationOptsParam.addDefaults === undefined ? DEFAULT_OPTIONS.addDefaults : creationOptsParam.addDefaults,\n        logger: wrapLogger(creationOptsParam.logger || DEFAULT_OPTIONS.logger)\n    };\n\n    return {\n        configure: async (command: Command) => configure(command, options.defaults || {}, options.addDefaults, options.features),\n        setLogger: (logger: Logger) => {\n            options.logger = wrapLogger(logger);\n        },\n        read: async (pArgs: Args) => {\n            args = pArgs;\n            return read(args, options.features);\n        },\n        applyDefaults: (config: Partial<Config>) => applyDefaults(config, options.features, options.defaults || {}),\n        validate: async (config: Config) => validate(config, options),\n        operate: async (config: Config) => createOperator(config, args, options),\n    }\n}\n\n\n\n\n\n"],"names":["PROGRAM_NAME","DEFAULT_TIMEZONE","DATE_FORMAT_MONTH_DAY","DATE_FORMAT_YEAR","DATE_FORMAT_YEAR_MONTH_DAY","DATE_FORMAT_MONTH","DATE_FORMAT_DAY","DEFAULT_RECURSIVE","DEFAULT_INPUT_DIRECTORY","DEFAULT_OUTPUT_DIRECTORY","DEFAULT_CONCURRENCY","DEFAULT_OUTPUT_STRUCTURE","DEFAULT_OUTPUT_FILENAME_OPTIONS","DEFAULT_INPUT_STRUCTURE","DEFAULT_INPUT_FILENAME_OPTIONS","DEFAULT_EXTENSIONS","ALLOWED_INPUT_STRUCTURES","ALLOWED_INPUT_FILENAME_OPTIONS","ALLOWED_OUTPUT_STRUCTURES","ALLOWED_OUTPUT_FILENAME_OPTIONS","ALLOWED_EXTENSIONS","ArgumentError","Error","argument","argumentName","message","name","addOption","command","option","description","addDefaults","defaultValue","defaultDesc","undefined","Array","isArray","join","descriptionWithDefaults","configure","defaults","features","tzDefault","timezone","includes","recursive","inputDirectory","limit","toString","concurrency","outputDirectory","outputStructure","outputFilenameOptions","extensions","inputStructure","inputFilenameOptions","applyDefaults","config","configWithDefaults","Number","isInteger","clean","obj","Object","fromEntries","entries","filter","_","v","read","args","dayjs","extend","utc","TIMEZONE_NAMES","create","parameters","now","tz","toDate","today","format","date","value","isValid","parse","isValidDate","addDays","days","add","addMonths","months","addYears","years","subDays","subtract","subMonths","subYears","startOfMonth","startOf","endOfMonth","endOf","startOfYear","endOfYear","isBefore","other","isAfter","validTimezones","params","log","console","exists","path","fs","promises","stat","error","isDirectory","stats","isFile","isReadable","access","constants","R_OK","stack","isWritable","W_OK","isFileReadable","isDirectoryWritable","isDirectoryReadable","createDirectory","mkdir","mkdirError","readFile","encoding","writeFile","data","forEachFileIn","directory","callback","options","pattern","files","glob","cwd","nodir","length","fileQueue","slice","filesProcessed","worker","file","shift","workers","from","Promise","all","err","readStream","createReadStream","hashFile","crypto","createHash","update","digest","listFiles","readdir","validate","storage","Storage","logger","debug","validateInputDirectory","validateOutputDirectory","validateOutputStructure","validOptions","allowed","outputStructures","validateOutputFilenameOptions","split","invalidOptions","opt","validateInputStructure","inputStructures","validateInputFilenameOptions","validateTimezone","Dates","validateExtensions","ext","z","object","start","end","sanitizeExtension","replace","getFilePattern","startsWith","safeExtensions","map","parseDateFromString","dateStr","shouldParseTime","year","month","day","y","mo","d","h","mi","cleanedDateStr","parts","parseInt","timePartYD","substring","timePartMD","timePartD","isNaN","Date","UTC","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","dates","monthStr","String","padStart","dayStr","hourStr","minuteStr","dateStrFormatted","formattedYear","formattedMonth","formattedDay","formattedHour","formattedMinute","e","isDateInRange","range","startDate","endDate","isStartDateValid","getTime","isEndDateValid","calculateDateRange","dateUtil","parseDateFromFilePath","relativePath","filename","structure","pathParts","sep","filenameWithoutExt","basename","extname","parsedDate","warn","monthDir","processStructuredFile","filePath","dateRange","endsWith","relative","pop","toISOString","dateRangeDisplay","process","fileCount","info","JSON","stringify","filePattern","processed","processStructuredInput","processUnstructuredInput","formatDate","sanitizeFilenameString","str","constructFilename","type","hash","push","timeStr","subject","constructOutputDirectory","creationTime","outputPath","output","Output","input","Input","createDate","context","wrapLogger","toWrap","level","verbose","silly","FilenameOptionSchema","enum","FilesystemStructureSchema","DEFAULT_APP_OPTIONS","DEFAULT_ALLOWED_OPTIONS","DEFAULT_FEATURES","DEFAULT_LOGGER","DEFAULT_OPTIONS","ConfigSchema","string","optional","array","boolean","number","creationOptsParam","setLogger","pArgs","operate","createOperator"],"mappings":"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"}