@utilarium/dreadcabinet 0.0.16-dev.0
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/.nvmrc +2 -0
- package/LICENSE +190 -0
- package/README.md +95 -0
- package/dist/configure.d.ts +5 -0
- package/dist/configure.js +44 -0
- package/dist/configure.js.map +1 -0
- package/dist/constants.d.ts +36 -0
- package/dist/constants.js +53 -0
- package/dist/constants.js.map +1 -0
- package/dist/defaults.d.ts +2 -0
- package/dist/defaults.js +32 -0
- package/dist/defaults.js.map +1 -0
- package/dist/dreadcabinet.cjs +1793 -0
- package/dist/dreadcabinet.cjs.map +1 -0
- package/dist/dreadcabinet.d.ts +131 -0
- package/dist/dreadcabinet.js +111 -0
- package/dist/dreadcabinet.js.map +1 -0
- package/dist/error/ArgumentError.d.ts +5 -0
- package/dist/error/ArgumentError.js +26 -0
- package/dist/error/ArgumentError.js.map +1 -0
- package/dist/input/input.d.ts +7 -0
- package/dist/input/input.js +13 -0
- package/dist/input/input.js.map +1 -0
- package/dist/input/process.d.ts +5 -0
- package/dist/input/process.js +36 -0
- package/dist/input/process.js.map +1 -0
- package/dist/input/structured.d.ts +15 -0
- package/dist/input/structured.js +324 -0
- package/dist/input/structured.js.map +1 -0
- package/dist/input/unstructured.d.ts +2 -0
- package/dist/input/unstructured.js +45 -0
- package/dist/input/unstructured.js.map +1 -0
- package/dist/logger.d.ts +2 -0
- package/dist/logger.js +19 -0
- package/dist/logger.js.map +1 -0
- package/dist/operate.d.ts +2 -0
- package/dist/operate.js +27 -0
- package/dist/operate.js.map +1 -0
- package/dist/output.d.ts +7 -0
- package/dist/output.js +99 -0
- package/dist/output.js.map +1 -0
- package/dist/read.d.ts +4 -0
- package/dist/read.js +30 -0
- package/dist/read.js.map +1 -0
- package/dist/util/dates.d.ts +60 -0
- package/dist/util/dates.js +699 -0
- package/dist/util/dates.js.map +1 -0
- package/dist/util/storage.d.ts +33 -0
- package/dist/util/storage.js +140 -0
- package/dist/util/storage.js.map +1 -0
- package/dist/validate.d.ts +4 -0
- package/dist/validate.js +134 -0
- package/dist/validate.js.map +1 -0
- package/guide/architecture.md +60 -0
- package/guide/configuration.md +132 -0
- package/guide/development.md +110 -0
- package/guide/index.md +62 -0
- package/guide/usage.md +166 -0
- package/output/kodrdriv/250703-0645-commit-message.md +21 -0
- package/output/kodrdriv/250703-0653-commit-message.md +1 -0
- package/output/kodrdriv/250703-0654-commit-message.md +1 -0
- package/output/kodrdriv/250703-0655-release-notes.md +51 -0
- package/output/kodrdriv/250703-0700-commit-message.md +1 -0
- package/output/kodrdriv/250703-0700-release-notes.md +8 -0
- package/output/kodrdriv/250703-0706-commit-message.md +1 -0
- package/output/kodrdriv/250703-0706-release-notes.md +11 -0
- package/output/kodrdriv/250703-0717-commit-message.md +1 -0
- package/output/kodrdriv/250703-0719-commit-message.md +1 -0
- package/output/kodrdriv/250703-0719-release-notes.md +17 -0
- package/output/kodrdriv/250703-0730-commit-message.md +1 -0
- package/output/kodrdriv/250703-0730-release-notes.md +11 -0
- package/output/kodrdriv/250703-1510-commit-message.md +1 -0
- package/output/kodrdriv/250710-0805-commit-message.md +3 -0
- package/output/kodrdriv/250710-0815-commit-message.md +1 -0
- package/output/kodrdriv/250710-0815-release-notes.md +39 -0
- package/output/kodrdriv/260107-2021-commit-message.md +37 -0
- package/output/kodrdriv/260108-0432-commit-message.md +6 -0
- package/output/kodrdriv/260108-0435-commit-message.md +3 -0
- package/output/kodrdriv/260108-0436-commit-message.md +4 -0
- package/output/kodrdriv/260108-0439-release-notes.md +63 -0
- package/output/kodrdriv/260108-0543-commit-message.md +19 -0
- package/output/kodrdriv/260108-0550-commit-message.md +3 -0
- package/output/kodrdriv/260108-0550-release-notes.md +19 -0
- package/output/kodrdriv/260108-0600-commit-message.md +3 -0
- package/output/kodrdriv/260110-0717-commit-message.md +4 -0
- package/output/kodrdriv/260110-1152-commit-message.md +1 -0
- package/output/kodrdriv/260110-1850-commit-message.md +1 -0
- package/output/kodrdriv/260110-1852-release-notes.md +33 -0
- package/output/kodrdriv/260112-2257-commit-message.md +5 -0
- package/output/kodrdriv/260112-2317-commit-message.md +1 -0
- package/output/kodrdriv/260112-2318-release-notes.md +42 -0
- package/output/kodrdriv/260113-0053-commit-message.md +1 -0
- package/output/kodrdriv/260113-0054-commit-message.md +1 -0
- package/output/kodrdriv/260113-0054-release-notes.md +49 -0
- package/output/kodrdriv/260130-1132-commit-message.md +1 -0
- package/output/kodrdriv/260130-1135-commit-message.md +1 -0
- package/output/kodrdriv/260130-1335-commit-message.md +10 -0
- package/output/kodrdriv/RELEASE_NOTES.md +47 -0
- package/output/kodrdriv/RELEASE_TITLE.md +1 -0
- package/output/kodrdriv/agentic-reflection-commit-2026-01-08T04-21-54-623Z.md +372 -0
- package/output/kodrdriv/agentic-reflection-commit-2026-01-08T12-32-36-513Z.md +55 -0
- package/output/kodrdriv/agentic-reflection-commit-2026-01-08T12-35-58-580Z.md +105 -0
- package/output/kodrdriv/agentic-reflection-commit-2026-01-08T12-36-05-658Z.md +53 -0
- package/output/kodrdriv/agentic-reflection-commit-2026-01-08T13-43-55-498Z.md +178 -0
- package/output/kodrdriv/agentic-reflection-commit-2026-01-08T13-50-10-230Z.md +53 -0
- package/output/kodrdriv/agentic-reflection-commit-2026-01-08T13-50-35-136Z.md +52 -0
- package/output/kodrdriv/agentic-reflection-commit-2026-01-08T14-00-30-772Z.md +52 -0
- package/output/kodrdriv/agentic-reflection-commit-2026-01-10T15-17-43-324Z.md +53 -0
- package/output/kodrdriv/agentic-reflection-commit-2026-01-10T19-52-47-424Z.md +97 -0
- package/output/kodrdriv/agentic-reflection-commit-2026-01-11T02-50-23-123Z.md +138 -0
- package/output/kodrdriv/agentic-reflection-commit-2026-01-11T02-50-45-038Z.md +114 -0
- package/output/kodrdriv/agentic-reflection-commit-2026-01-11T02-50-49-467Z.md +114 -0
- package/output/kodrdriv/agentic-reflection-commit-2026-01-13T06-57-00-384Z.md +169 -0
- package/output/kodrdriv/agentic-reflection-commit-2026-01-13T07-17-29-292Z.md +114 -0
- package/output/kodrdriv/agentic-reflection-commit-2026-01-13T07-17-47-579Z.md +114 -0
- package/output/kodrdriv/agentic-reflection-commit-2026-01-13T08-48-55-599Z.md +144 -0
- package/output/kodrdriv/agentic-reflection-commit-2026-01-13T08-53-53-725Z.md +114 -0
- package/output/kodrdriv/agentic-reflection-commit-2026-01-13T08-54-11-600Z.md +97 -0
- package/output/kodrdriv/agentic-reflection-commit-2026-01-30T19-32-17-053Z.md +174 -0
- package/output/kodrdriv/agentic-reflection-commit-2026-01-30T19-35-00-887Z.md +152 -0
- package/output/kodrdriv/agentic-reflection-commit-2026-01-30T21-02-16-553Z.md +236 -0
- package/output/kodrdriv/agentic-reflection-commit-2026-01-30T21-17-22-227Z.md +347 -0
- package/output/kodrdriv/agentic-reflection-release-2026-01-08T12-39-08-279Z.md +507 -0
- package/output/kodrdriv/agentic-reflection-release-2026-01-08T13-50-57-683Z.md +183 -0
- package/output/kodrdriv/agentic-reflection-release-2026-01-11T02-52-39-082Z.md +347 -0
- package/output/kodrdriv/agentic-reflection-release-2026-01-13T07-18-21-218Z.md +315 -0
- package/output/kodrdriv/agentic-reflection-release-2026-01-13T08-54-59-340Z.md +354 -0
- package/package.json +80 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"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 configWithDefaults.concurrency = config.concurrency || (defaults?.concurrency || DEFAULT_CONCURRENCY);\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.limit = args.limit;\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';\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('YYYY-M-D');\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 let filesProcessed = 0;\n const files = await glob(options.pattern, { cwd: directory, nodir: true });\n const concurrency = options.concurrency || 1;\n let index = 0;\n async function worker() {\n while (index < files.length && (!options.limit || filesProcessed < options.limit)) {\n const i = index++;\n if (options.limit && filesProcessed >= options.limit) break;\n await callback(path.join(directory, files[i]));\n filesProcessed++;\n }\n }\n const workers = Array.from({ length: concurrency }, () => worker());\n await Promise.all(workers);\n if (options.limit && filesProcessed >= options.limit) {\n log(`Reached limit of ${options.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 logger: typeof console = console;\n const storage = Storage.create({ log: logger.debug });\n\n const validateInputDirectory = async (inputDirectory: string) => {\n // eslint-disable-next-line no-console\n const storage = Storage.create({ log: console.log });\n if (!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) {\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) {\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('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// 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 if (extensions.length === 1) {\n pattern = `**/*.${extensions[0]}`;\n } else {\n pattern = `**/*.{${extensions.join(',')}}`;\n }\n logger.debug(`Applying extension filter: ${extensions.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 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\n\n\n const date = new Date(Date.UTC(y, mo, d, h, mi));\n // Double check components as Date object might adjust invalid dates (e.g. Feb 30th -> Mar 2nd)\n if (date.getUTCFullYear() !== y || date.getUTCMonth() !== mo || date.getUTCDate() !== d || date.getUTCHours() !== h || date.getUTCMinutes() !== mi) {\n // console.debug(`Date validation failed for Y:${y} M:${mo} D:${d} H:${h} m:${mi}. JS Date adjusted it.`);\n return null;\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 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);\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, 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, 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, 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 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, 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 logger.warn(`Invalid start date provided in dateRange: ${dateRange.start}`);\n }\n if (dateRange?.end && (!dateRange.end || isNaN(dateRange.end.getTime()))) {\n logger.warn(`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 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// 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 // Ensure the pattern correctly handles extensions with or without recursion\n if (recursive) {\n filePattern = `**/*.{${extensions.join(',')}}`;\n } else {\n filePattern = `*.{${extensions.join(',')}}`;\n }\n logger.debug(`Applying extension filter: ${extensions.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) => 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, hyphen, underscore, or dot with an underscore\n return str.replace(/[^a-zA-Z0-9\\-_.]/g, '_')\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 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 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","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","filesProcessed","files","glob","cwd","nodir","index","worker","length","i","workers","from","Promise","all","err","readStream","createReadStream","hashFile","file","crypto","createHash","update","digest","slice","listFiles","readdir","validate","logger","storage","Storage","debug","validateInputDirectory","validateOutputDirectory","validateOutputStructure","validOptions","allowed","outputStructures","validateOutputFilenameOptions","split","invalidOptions","opt","validateInputStructure","inputStructures","validateInputFilenameOptions","validateTimezone","Dates","validateExtensions","ext","z","object","start","end","getFilePattern","startsWith","parseDateFromString","dateStr","shouldParseTime","year","month","day","y","mo","d","h","mi","cleanedDateStr","replace","parts","parseInt","timePartYD","substring","timePartMD","timePartD","isNaN","Date","UTC","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","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","dates","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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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
export interface Args {
|
|
4
|
+
recursive: boolean;
|
|
5
|
+
timezone: string;
|
|
6
|
+
inputDirectory: string;
|
|
7
|
+
inputStructure?: FilesystemStructure;
|
|
8
|
+
inputFilenameOptions?: FilenameOption[];
|
|
9
|
+
outputDirectory: string;
|
|
10
|
+
outputStructure?: FilesystemStructure;
|
|
11
|
+
outputFilenameOptions?: FilenameOption[];
|
|
12
|
+
extensions: string[];
|
|
13
|
+
start?: string;
|
|
14
|
+
end?: string;
|
|
15
|
+
limit?: number;
|
|
16
|
+
concurrency?: number;
|
|
17
|
+
}
|
|
18
|
+
export type Feature = 'input' | 'output' | 'structured-output' | 'structured-input' | 'extensions';
|
|
19
|
+
export declare const FilenameOptionSchema: z.ZodEnum<{
|
|
20
|
+
date: "date";
|
|
21
|
+
time: "time";
|
|
22
|
+
subject: "subject";
|
|
23
|
+
}>;
|
|
24
|
+
export type FilenameOption = z.infer<typeof FilenameOptionSchema>;
|
|
25
|
+
export declare const FilesystemStructureSchema: z.ZodEnum<{
|
|
26
|
+
none: "none";
|
|
27
|
+
year: "year";
|
|
28
|
+
month: "month";
|
|
29
|
+
day: "day";
|
|
30
|
+
}>;
|
|
31
|
+
export type FilesystemStructure = z.infer<typeof FilesystemStructureSchema>;
|
|
32
|
+
export interface DefaultOptions {
|
|
33
|
+
timezone?: string;
|
|
34
|
+
recursive?: boolean;
|
|
35
|
+
inputDirectory?: string;
|
|
36
|
+
inputStructure?: FilesystemStructure;
|
|
37
|
+
inputFilenameOptions?: FilenameOption[];
|
|
38
|
+
outputDirectory?: string;
|
|
39
|
+
outputStructure?: FilesystemStructure;
|
|
40
|
+
outputFilenameOptions?: FilenameOption[];
|
|
41
|
+
extensions?: string[];
|
|
42
|
+
startDate?: string;
|
|
43
|
+
endDate?: string;
|
|
44
|
+
limit?: number;
|
|
45
|
+
concurrency?: number;
|
|
46
|
+
}
|
|
47
|
+
export interface AllowedOptions {
|
|
48
|
+
inputStructures?: FilesystemStructure[];
|
|
49
|
+
inputFilenameOptions?: FilenameOption[];
|
|
50
|
+
outputStructures?: FilesystemStructure[];
|
|
51
|
+
outputFilenameOptions?: FilenameOption[];
|
|
52
|
+
extensions?: string[];
|
|
53
|
+
}
|
|
54
|
+
export interface Options {
|
|
55
|
+
defaults?: DefaultOptions;
|
|
56
|
+
allowed?: AllowedOptions;
|
|
57
|
+
features: Feature[];
|
|
58
|
+
addDefaults: boolean;
|
|
59
|
+
logger: Logger;
|
|
60
|
+
}
|
|
61
|
+
export interface Logger {
|
|
62
|
+
debug: (message: string, ...args: any[]) => void;
|
|
63
|
+
info: (message: string, ...args: any[]) => void;
|
|
64
|
+
warn: (message: string, ...args: any[]) => void;
|
|
65
|
+
error: (message: string, ...args: any[]) => void;
|
|
66
|
+
verbose: (message: string, ...args: any[]) => void;
|
|
67
|
+
silly: (message: string, ...args: any[]) => void;
|
|
68
|
+
}
|
|
69
|
+
export declare const DEFAULT_APP_OPTIONS: DefaultOptions;
|
|
70
|
+
export declare const DEFAULT_ALLOWED_OPTIONS: AllowedOptions;
|
|
71
|
+
export declare const DEFAULT_FEATURES: Feature[];
|
|
72
|
+
export declare const DEFAULT_LOGGER: Logger;
|
|
73
|
+
export declare const DEFAULT_OPTIONS: {
|
|
74
|
+
defaults: DefaultOptions;
|
|
75
|
+
allowed: AllowedOptions;
|
|
76
|
+
features: Feature[];
|
|
77
|
+
addDefaults: boolean;
|
|
78
|
+
logger: Logger;
|
|
79
|
+
};
|
|
80
|
+
export declare const ConfigSchema: z.ZodObject<{
|
|
81
|
+
timezone: z.ZodString;
|
|
82
|
+
inputDirectory: z.ZodOptional<z.ZodString>;
|
|
83
|
+
inputStructure: z.ZodOptional<z.ZodEnum<{
|
|
84
|
+
none: "none";
|
|
85
|
+
year: "year";
|
|
86
|
+
month: "month";
|
|
87
|
+
day: "day";
|
|
88
|
+
}>>;
|
|
89
|
+
inputFilenameOptions: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
90
|
+
date: "date";
|
|
91
|
+
time: "time";
|
|
92
|
+
subject: "subject";
|
|
93
|
+
}>>>;
|
|
94
|
+
recursive: z.ZodOptional<z.ZodBoolean>;
|
|
95
|
+
outputDirectory: z.ZodOptional<z.ZodString>;
|
|
96
|
+
outputStructure: z.ZodOptional<z.ZodEnum<{
|
|
97
|
+
none: "none";
|
|
98
|
+
year: "year";
|
|
99
|
+
month: "month";
|
|
100
|
+
day: "day";
|
|
101
|
+
}>>;
|
|
102
|
+
outputFilenameOptions: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
103
|
+
date: "date";
|
|
104
|
+
time: "time";
|
|
105
|
+
subject: "subject";
|
|
106
|
+
}>>>;
|
|
107
|
+
extensions: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
108
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
109
|
+
concurrency: z.ZodOptional<z.ZodNumber>;
|
|
110
|
+
}, z.core.$strip>;
|
|
111
|
+
export interface DateRange {
|
|
112
|
+
start: Date;
|
|
113
|
+
end: Date;
|
|
114
|
+
}
|
|
115
|
+
export type Config = z.infer<typeof ConfigSchema>;
|
|
116
|
+
export interface Operator {
|
|
117
|
+
process: (callback: (file: string) => Promise<void>, dateRange?: Partial<DateRange>, concurrency?: number) => Promise<void>;
|
|
118
|
+
constructFilename: (createDate: Date, type: string, hash: string, options?: {
|
|
119
|
+
subject?: string;
|
|
120
|
+
}) => Promise<string>;
|
|
121
|
+
constructOutputDirectory: (createDate: Date) => Promise<string>;
|
|
122
|
+
}
|
|
123
|
+
export interface DreadCabinet {
|
|
124
|
+
configure: (command: Command) => Promise<void>;
|
|
125
|
+
setLogger: (logger: Logger) => void;
|
|
126
|
+
read: (args: Args) => Promise<Partial<Config>>;
|
|
127
|
+
applyDefaults: (config: Partial<Config>) => Config;
|
|
128
|
+
validate: (config: Config) => Promise<void>;
|
|
129
|
+
operate: (config: Config) => Promise<Operator>;
|
|
130
|
+
}
|
|
131
|
+
export declare const create: (creationOptsParam?: Partial<Options>) => DreadCabinet;
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { configure } from './configure.js';
|
|
2
|
+
import { applyDefaults } from './defaults.js';
|
|
3
|
+
import { read } from './read.js';
|
|
4
|
+
import { validate } from './validate.js';
|
|
5
|
+
import { DEFAULT_CONCURRENCY, DEFAULT_EXTENSIONS, DEFAULT_OUTPUT_FILENAME_OPTIONS, DEFAULT_OUTPUT_STRUCTURE, DEFAULT_OUTPUT_DIRECTORY, DEFAULT_INPUT_FILENAME_OPTIONS, DEFAULT_INPUT_STRUCTURE, DEFAULT_INPUT_DIRECTORY, DEFAULT_RECURSIVE, DEFAULT_TIMEZONE, ALLOWED_EXTENSIONS, ALLOWED_OUTPUT_FILENAME_OPTIONS, ALLOWED_OUTPUT_STRUCTURES, ALLOWED_INPUT_FILENAME_OPTIONS, ALLOWED_INPUT_STRUCTURES } from './constants.js';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { create as create$1 } from './operate.js';
|
|
8
|
+
import { wrapLogger } from './logger.js';
|
|
9
|
+
|
|
10
|
+
const FilenameOptionSchema = z.enum([
|
|
11
|
+
'date',
|
|
12
|
+
'time',
|
|
13
|
+
'subject'
|
|
14
|
+
]);
|
|
15
|
+
const FilesystemStructureSchema = z.enum([
|
|
16
|
+
'none',
|
|
17
|
+
'year',
|
|
18
|
+
'month',
|
|
19
|
+
'day'
|
|
20
|
+
]);
|
|
21
|
+
const DEFAULT_APP_OPTIONS = {
|
|
22
|
+
timezone: DEFAULT_TIMEZONE,
|
|
23
|
+
recursive: DEFAULT_RECURSIVE,
|
|
24
|
+
inputDirectory: DEFAULT_INPUT_DIRECTORY,
|
|
25
|
+
inputStructure: DEFAULT_INPUT_STRUCTURE,
|
|
26
|
+
inputFilenameOptions: DEFAULT_INPUT_FILENAME_OPTIONS,
|
|
27
|
+
outputDirectory: DEFAULT_OUTPUT_DIRECTORY,
|
|
28
|
+
outputStructure: DEFAULT_OUTPUT_STRUCTURE,
|
|
29
|
+
outputFilenameOptions: DEFAULT_OUTPUT_FILENAME_OPTIONS,
|
|
30
|
+
extensions: DEFAULT_EXTENSIONS,
|
|
31
|
+
concurrency: DEFAULT_CONCURRENCY
|
|
32
|
+
};
|
|
33
|
+
const DEFAULT_ALLOWED_OPTIONS = {
|
|
34
|
+
inputStructures: ALLOWED_INPUT_STRUCTURES,
|
|
35
|
+
inputFilenameOptions: ALLOWED_INPUT_FILENAME_OPTIONS,
|
|
36
|
+
outputStructures: ALLOWED_OUTPUT_STRUCTURES,
|
|
37
|
+
outputFilenameOptions: ALLOWED_OUTPUT_FILENAME_OPTIONS,
|
|
38
|
+
extensions: ALLOWED_EXTENSIONS
|
|
39
|
+
};
|
|
40
|
+
const DEFAULT_FEATURES = [
|
|
41
|
+
'output',
|
|
42
|
+
'structured-output',
|
|
43
|
+
'input',
|
|
44
|
+
'extensions'
|
|
45
|
+
];
|
|
46
|
+
const DEFAULT_LOGGER = {
|
|
47
|
+
// eslint-disable-next-line no-console
|
|
48
|
+
debug: (message, ...args)=>console.debug(message, ...args),
|
|
49
|
+
// eslint-disable-next-line no-console
|
|
50
|
+
info: (message, ...args)=>console.info(message, ...args),
|
|
51
|
+
// eslint-disable-next-line no-console
|
|
52
|
+
warn: (message, ...args)=>console.warn(message, ...args),
|
|
53
|
+
// eslint-disable-next-line no-console
|
|
54
|
+
error: (message, ...args)=>console.error(message, ...args),
|
|
55
|
+
// eslint-disable-next-line no-console
|
|
56
|
+
verbose: (message, ...args)=>console.log(message, ...args),
|
|
57
|
+
// eslint-disable-next-line no-console
|
|
58
|
+
silly: (message, ...args)=>console.log(message, ...args)
|
|
59
|
+
};
|
|
60
|
+
const DEFAULT_OPTIONS = {
|
|
61
|
+
defaults: DEFAULT_APP_OPTIONS,
|
|
62
|
+
allowed: DEFAULT_ALLOWED_OPTIONS,
|
|
63
|
+
features: DEFAULT_FEATURES,
|
|
64
|
+
addDefaults: true,
|
|
65
|
+
logger: DEFAULT_LOGGER
|
|
66
|
+
};
|
|
67
|
+
const ConfigSchema = z.object({
|
|
68
|
+
timezone: z.string(),
|
|
69
|
+
inputDirectory: z.string().optional(),
|
|
70
|
+
inputStructure: FilesystemStructureSchema.optional(),
|
|
71
|
+
inputFilenameOptions: z.array(FilenameOptionSchema).optional(),
|
|
72
|
+
recursive: z.boolean().optional(),
|
|
73
|
+
outputDirectory: z.string().optional(),
|
|
74
|
+
outputStructure: FilesystemStructureSchema.optional(),
|
|
75
|
+
outputFilenameOptions: z.array(FilenameOptionSchema).optional(),
|
|
76
|
+
extensions: z.array(z.string()).optional(),
|
|
77
|
+
limit: z.number().optional(),
|
|
78
|
+
concurrency: z.number().optional()
|
|
79
|
+
});
|
|
80
|
+
const create = (creationOptsParam = {})=>{
|
|
81
|
+
let args;
|
|
82
|
+
const options = {
|
|
83
|
+
defaults: {
|
|
84
|
+
...DEFAULT_APP_OPTIONS,
|
|
85
|
+
...creationOptsParam.defaults
|
|
86
|
+
},
|
|
87
|
+
allowed: {
|
|
88
|
+
...DEFAULT_ALLOWED_OPTIONS,
|
|
89
|
+
...creationOptsParam.allowed
|
|
90
|
+
},
|
|
91
|
+
features: creationOptsParam.features || DEFAULT_FEATURES,
|
|
92
|
+
addDefaults: creationOptsParam.addDefaults === undefined ? DEFAULT_OPTIONS.addDefaults : creationOptsParam.addDefaults,
|
|
93
|
+
logger: wrapLogger(creationOptsParam.logger || DEFAULT_OPTIONS.logger)
|
|
94
|
+
};
|
|
95
|
+
return {
|
|
96
|
+
configure: async (command)=>configure(command, options.defaults || {}, options.addDefaults, options.features),
|
|
97
|
+
setLogger: (logger)=>{
|
|
98
|
+
options.logger = wrapLogger(logger);
|
|
99
|
+
},
|
|
100
|
+
read: async (pArgs)=>{
|
|
101
|
+
args = pArgs;
|
|
102
|
+
return read(args, options.features);
|
|
103
|
+
},
|
|
104
|
+
applyDefaults: (config)=>applyDefaults(config, options.features, options.defaults || {}),
|
|
105
|
+
validate: async (config)=>validate(config, options),
|
|
106
|
+
operate: async (config)=>create$1(config, args, options)
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
export { ConfigSchema, DEFAULT_ALLOWED_OPTIONS, DEFAULT_APP_OPTIONS, DEFAULT_FEATURES, DEFAULT_LOGGER, DEFAULT_OPTIONS, FilenameOptionSchema, FilesystemStructureSchema, create };
|
|
111
|
+
//# sourceMappingURL=dreadcabinet.js.map
|