@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.
Files changed (128) hide show
  1. package/.nvmrc +2 -0
  2. package/LICENSE +190 -0
  3. package/README.md +95 -0
  4. package/dist/configure.d.ts +5 -0
  5. package/dist/configure.js +44 -0
  6. package/dist/configure.js.map +1 -0
  7. package/dist/constants.d.ts +36 -0
  8. package/dist/constants.js +53 -0
  9. package/dist/constants.js.map +1 -0
  10. package/dist/defaults.d.ts +2 -0
  11. package/dist/defaults.js +32 -0
  12. package/dist/defaults.js.map +1 -0
  13. package/dist/dreadcabinet.cjs +1793 -0
  14. package/dist/dreadcabinet.cjs.map +1 -0
  15. package/dist/dreadcabinet.d.ts +131 -0
  16. package/dist/dreadcabinet.js +111 -0
  17. package/dist/dreadcabinet.js.map +1 -0
  18. package/dist/error/ArgumentError.d.ts +5 -0
  19. package/dist/error/ArgumentError.js +26 -0
  20. package/dist/error/ArgumentError.js.map +1 -0
  21. package/dist/input/input.d.ts +7 -0
  22. package/dist/input/input.js +13 -0
  23. package/dist/input/input.js.map +1 -0
  24. package/dist/input/process.d.ts +5 -0
  25. package/dist/input/process.js +36 -0
  26. package/dist/input/process.js.map +1 -0
  27. package/dist/input/structured.d.ts +15 -0
  28. package/dist/input/structured.js +324 -0
  29. package/dist/input/structured.js.map +1 -0
  30. package/dist/input/unstructured.d.ts +2 -0
  31. package/dist/input/unstructured.js +45 -0
  32. package/dist/input/unstructured.js.map +1 -0
  33. package/dist/logger.d.ts +2 -0
  34. package/dist/logger.js +19 -0
  35. package/dist/logger.js.map +1 -0
  36. package/dist/operate.d.ts +2 -0
  37. package/dist/operate.js +27 -0
  38. package/dist/operate.js.map +1 -0
  39. package/dist/output.d.ts +7 -0
  40. package/dist/output.js +99 -0
  41. package/dist/output.js.map +1 -0
  42. package/dist/read.d.ts +4 -0
  43. package/dist/read.js +30 -0
  44. package/dist/read.js.map +1 -0
  45. package/dist/util/dates.d.ts +60 -0
  46. package/dist/util/dates.js +699 -0
  47. package/dist/util/dates.js.map +1 -0
  48. package/dist/util/storage.d.ts +33 -0
  49. package/dist/util/storage.js +140 -0
  50. package/dist/util/storage.js.map +1 -0
  51. package/dist/validate.d.ts +4 -0
  52. package/dist/validate.js +134 -0
  53. package/dist/validate.js.map +1 -0
  54. package/guide/architecture.md +60 -0
  55. package/guide/configuration.md +132 -0
  56. package/guide/development.md +110 -0
  57. package/guide/index.md +62 -0
  58. package/guide/usage.md +166 -0
  59. package/output/kodrdriv/250703-0645-commit-message.md +21 -0
  60. package/output/kodrdriv/250703-0653-commit-message.md +1 -0
  61. package/output/kodrdriv/250703-0654-commit-message.md +1 -0
  62. package/output/kodrdriv/250703-0655-release-notes.md +51 -0
  63. package/output/kodrdriv/250703-0700-commit-message.md +1 -0
  64. package/output/kodrdriv/250703-0700-release-notes.md +8 -0
  65. package/output/kodrdriv/250703-0706-commit-message.md +1 -0
  66. package/output/kodrdriv/250703-0706-release-notes.md +11 -0
  67. package/output/kodrdriv/250703-0717-commit-message.md +1 -0
  68. package/output/kodrdriv/250703-0719-commit-message.md +1 -0
  69. package/output/kodrdriv/250703-0719-release-notes.md +17 -0
  70. package/output/kodrdriv/250703-0730-commit-message.md +1 -0
  71. package/output/kodrdriv/250703-0730-release-notes.md +11 -0
  72. package/output/kodrdriv/250703-1510-commit-message.md +1 -0
  73. package/output/kodrdriv/250710-0805-commit-message.md +3 -0
  74. package/output/kodrdriv/250710-0815-commit-message.md +1 -0
  75. package/output/kodrdriv/250710-0815-release-notes.md +39 -0
  76. package/output/kodrdriv/260107-2021-commit-message.md +37 -0
  77. package/output/kodrdriv/260108-0432-commit-message.md +6 -0
  78. package/output/kodrdriv/260108-0435-commit-message.md +3 -0
  79. package/output/kodrdriv/260108-0436-commit-message.md +4 -0
  80. package/output/kodrdriv/260108-0439-release-notes.md +63 -0
  81. package/output/kodrdriv/260108-0543-commit-message.md +19 -0
  82. package/output/kodrdriv/260108-0550-commit-message.md +3 -0
  83. package/output/kodrdriv/260108-0550-release-notes.md +19 -0
  84. package/output/kodrdriv/260108-0600-commit-message.md +3 -0
  85. package/output/kodrdriv/260110-0717-commit-message.md +4 -0
  86. package/output/kodrdriv/260110-1152-commit-message.md +1 -0
  87. package/output/kodrdriv/260110-1850-commit-message.md +1 -0
  88. package/output/kodrdriv/260110-1852-release-notes.md +33 -0
  89. package/output/kodrdriv/260112-2257-commit-message.md +5 -0
  90. package/output/kodrdriv/260112-2317-commit-message.md +1 -0
  91. package/output/kodrdriv/260112-2318-release-notes.md +42 -0
  92. package/output/kodrdriv/260113-0053-commit-message.md +1 -0
  93. package/output/kodrdriv/260113-0054-commit-message.md +1 -0
  94. package/output/kodrdriv/260113-0054-release-notes.md +49 -0
  95. package/output/kodrdriv/260130-1132-commit-message.md +1 -0
  96. package/output/kodrdriv/260130-1135-commit-message.md +1 -0
  97. package/output/kodrdriv/260130-1335-commit-message.md +10 -0
  98. package/output/kodrdriv/RELEASE_NOTES.md +47 -0
  99. package/output/kodrdriv/RELEASE_TITLE.md +1 -0
  100. package/output/kodrdriv/agentic-reflection-commit-2026-01-08T04-21-54-623Z.md +372 -0
  101. package/output/kodrdriv/agentic-reflection-commit-2026-01-08T12-32-36-513Z.md +55 -0
  102. package/output/kodrdriv/agentic-reflection-commit-2026-01-08T12-35-58-580Z.md +105 -0
  103. package/output/kodrdriv/agentic-reflection-commit-2026-01-08T12-36-05-658Z.md +53 -0
  104. package/output/kodrdriv/agentic-reflection-commit-2026-01-08T13-43-55-498Z.md +178 -0
  105. package/output/kodrdriv/agentic-reflection-commit-2026-01-08T13-50-10-230Z.md +53 -0
  106. package/output/kodrdriv/agentic-reflection-commit-2026-01-08T13-50-35-136Z.md +52 -0
  107. package/output/kodrdriv/agentic-reflection-commit-2026-01-08T14-00-30-772Z.md +52 -0
  108. package/output/kodrdriv/agentic-reflection-commit-2026-01-10T15-17-43-324Z.md +53 -0
  109. package/output/kodrdriv/agentic-reflection-commit-2026-01-10T19-52-47-424Z.md +97 -0
  110. package/output/kodrdriv/agentic-reflection-commit-2026-01-11T02-50-23-123Z.md +138 -0
  111. package/output/kodrdriv/agentic-reflection-commit-2026-01-11T02-50-45-038Z.md +114 -0
  112. package/output/kodrdriv/agentic-reflection-commit-2026-01-11T02-50-49-467Z.md +114 -0
  113. package/output/kodrdriv/agentic-reflection-commit-2026-01-13T06-57-00-384Z.md +169 -0
  114. package/output/kodrdriv/agentic-reflection-commit-2026-01-13T07-17-29-292Z.md +114 -0
  115. package/output/kodrdriv/agentic-reflection-commit-2026-01-13T07-17-47-579Z.md +114 -0
  116. package/output/kodrdriv/agentic-reflection-commit-2026-01-13T08-48-55-599Z.md +144 -0
  117. package/output/kodrdriv/agentic-reflection-commit-2026-01-13T08-53-53-725Z.md +114 -0
  118. package/output/kodrdriv/agentic-reflection-commit-2026-01-13T08-54-11-600Z.md +97 -0
  119. package/output/kodrdriv/agentic-reflection-commit-2026-01-30T19-32-17-053Z.md +174 -0
  120. package/output/kodrdriv/agentic-reflection-commit-2026-01-30T19-35-00-887Z.md +152 -0
  121. package/output/kodrdriv/agentic-reflection-commit-2026-01-30T21-02-16-553Z.md +236 -0
  122. package/output/kodrdriv/agentic-reflection-commit-2026-01-30T21-17-22-227Z.md +347 -0
  123. package/output/kodrdriv/agentic-reflection-release-2026-01-08T12-39-08-279Z.md +507 -0
  124. package/output/kodrdriv/agentic-reflection-release-2026-01-08T13-50-57-683Z.md +183 -0
  125. package/output/kodrdriv/agentic-reflection-release-2026-01-11T02-52-39-082Z.md +347 -0
  126. package/output/kodrdriv/agentic-reflection-release-2026-01-13T07-18-21-218Z.md +315 -0
  127. package/output/kodrdriv/agentic-reflection-release-2026-01-13T08-54-59-340Z.md +354 -0
  128. package/package.json +80 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dreadcabinet.js","sources":["../src/dreadcabinet.ts"],"sourcesContent":["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":["FilenameOptionSchema","z","enum","FilesystemStructureSchema","DEFAULT_APP_OPTIONS","timezone","DEFAULT_TIMEZONE","recursive","DEFAULT_RECURSIVE","inputDirectory","DEFAULT_INPUT_DIRECTORY","inputStructure","DEFAULT_INPUT_STRUCTURE","inputFilenameOptions","DEFAULT_INPUT_FILENAME_OPTIONS","outputDirectory","DEFAULT_OUTPUT_DIRECTORY","outputStructure","DEFAULT_OUTPUT_STRUCTURE","outputFilenameOptions","DEFAULT_OUTPUT_FILENAME_OPTIONS","extensions","DEFAULT_EXTENSIONS","concurrency","DEFAULT_CONCURRENCY","DEFAULT_ALLOWED_OPTIONS","inputStructures","ALLOWED_INPUT_STRUCTURES","ALLOWED_INPUT_FILENAME_OPTIONS","outputStructures","ALLOWED_OUTPUT_STRUCTURES","ALLOWED_OUTPUT_FILENAME_OPTIONS","ALLOWED_EXTENSIONS","DEFAULT_FEATURES","DEFAULT_LOGGER","debug","message","args","console","info","warn","error","verbose","log","silly","DEFAULT_OPTIONS","defaults","allowed","features","addDefaults","logger","ConfigSchema","object","string","optional","array","boolean","limit","number","create","creationOptsParam","options","undefined","wrapLogger","configure","command","setLogger","read","pArgs","applyDefaults","config","validate","operate","createOperator"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare class ArgumentError extends Error {
2
+ private argumentName;
3
+ constructor(argumentName: string, message: string);
4
+ get argument(): string;
5
+ }
@@ -0,0 +1,26 @@
1
+ function _define_property(obj, key, value) {
2
+ if (key in obj) {
3
+ Object.defineProperty(obj, key, {
4
+ value: value,
5
+ enumerable: true,
6
+ configurable: true,
7
+ writable: true
8
+ });
9
+ } else {
10
+ obj[key] = value;
11
+ }
12
+ return obj;
13
+ }
14
+ class ArgumentError extends Error {
15
+ get argument() {
16
+ return this.argumentName;
17
+ }
18
+ constructor(argumentName, message){
19
+ super(`${message}`), _define_property(this, "argumentName", void 0);
20
+ this.name = 'ArgumentError';
21
+ this.argumentName = argumentName;
22
+ }
23
+ }
24
+
25
+ export { ArgumentError };
26
+ //# sourceMappingURL=ArgumentError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArgumentError.js","sources":["../../src/error/ArgumentError.ts"],"sourcesContent":["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}"],"names":["ArgumentError","Error","argument","argumentName","message","name"],"mappings":";;;;;;;;;;;;;AAAO,MAAMA,aAAAA,SAAsBC,KAAAA,CAAAA;AAQ/B,IAAA,IAAIC,QAAAA,GAAmB;QACnB,OAAO,IAAI,CAACC,YAAY;AAC5B,IAAA;IARA,WAAA,CAAYA,YAAoB,EAAEC,OAAe,CAAE;AAC/C,QAAA,KAAK,CAAC,CAAA,EAAGA,OAAAA,CAAAA,CAAS,CAAA,EAFtB,gBAAA,CAAA,IAAA,EAAQD,gBAAR,MAAA,CAAA;QAGI,IAAI,CAACE,IAAI,GAAG,eAAA;QACZ,IAAI,CAACF,YAAY,GAAGA,YAAAA;AACxB,IAAA;AAKJ;;;;"}
@@ -0,0 +1,7 @@
1
+ import { Config, Options } from '../dreadcabinet';
2
+ export declare const create: (config: Config, options: Options) => {
3
+ process: (callback: (file: string, date?: Date) => Promise<void>, { start, end }?: {
4
+ start?: Date;
5
+ end?: Date;
6
+ }) => Promise<void>;
7
+ };
@@ -0,0 +1,13 @@
1
+ import { process } from './process.js';
2
+
3
+ const create = (config, options)=>{
4
+ return {
5
+ process: (callback, { start, end } = {})=>process(config, options.features, options.logger, callback, {
6
+ start,
7
+ end
8
+ })
9
+ };
10
+ };
11
+
12
+ export { create };
13
+ //# sourceMappingURL=input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.js","sources":["../../src/input/input.ts"],"sourcesContent":["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}"],"names":["create","config","options","process","callback","start","end","features","logger"],"mappings":";;AAGO,MAAMA,MAAAA,GAAS,CAACC,MAAAA,EAAgBC,OAAAA,GAAAA;IAGnC,OAAO;AACHC,QAAAA,OAAAA,EAAS,CAACC,QAAAA,EAA2B,EAAEC,KAAK,EAAEC,GAAG,EAAgC,GAAG,EAAE,GAAKH,OAAAA,CAAQF,QAAQC,OAAAA,CAAQK,QAAQ,EAAEL,OAAAA,CAAQM,MAAM,EAAEJ,QAAAA,EAAU;AAAEC,gBAAAA,KAAAA;AAAOC,gBAAAA;AAAI,aAAA;AACxK,KAAA;AACJ;;;;"}
@@ -0,0 +1,5 @@
1
+ import { Config, Feature, Logger } from '../dreadcabinet';
2
+ export declare const process: (config: Config, features: Feature[], logger: Logger, callback: (file: string) => Promise<void>, { start, end }?: {
3
+ start?: Date;
4
+ end?: Date;
5
+ }) => Promise<void>;
@@ -0,0 +1,36 @@
1
+ import { process as process$1 } from './structured.js';
2
+ import { process as process$2 } from './unstructured.js';
3
+
4
+ const process = async (config, features, logger, callback, { start, end } = {})=>{
5
+ if (!features.includes('input')) {
6
+ throw new Error('Input feature is not enabled, skipping input processing');
7
+ }
8
+ const concurrency = config.concurrency;
9
+ if (!concurrency) {
10
+ throw new Error('Concurrency is not configured');
11
+ }
12
+ const inputDirectory = config.inputDirectory;
13
+ if (!inputDirectory) {
14
+ throw new Error('Input directory is not configured');
15
+ }
16
+ let fileCount = 0;
17
+ if (features.includes('structured-input')) {
18
+ logger.debug('Processing Structured Input from %s with start date %s and end date %s', inputDirectory, start, end);
19
+ if (!start || !end) {
20
+ throw new Error('Start or end date are both required for structured input');
21
+ } else {
22
+ fileCount = await process$1(config.inputStructure, config.inputFilenameOptions, config.extensions, config.timezone, start, end, config.limit, features, logger, inputDirectory, callback, concurrency);
23
+ }
24
+ } else {
25
+ // Original Unstructured Input Logic
26
+ logger.debug('Processing Unstructured Input from %s', inputDirectory);
27
+ if (start || end) {
28
+ throw new Error('Start or end date is not allowed for unstructured input');
29
+ }
30
+ fileCount = await process$2(inputDirectory, config.recursive || false, config.extensions || [], config.limit, logger, callback, concurrency);
31
+ }
32
+ logger.info('Processed %d files matching criteria.', fileCount);
33
+ };
34
+
35
+ export { process };
36
+ //# sourceMappingURL=process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.js","sources":["../../src/input/process.ts"],"sourcesContent":["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"],"names":["process","config","features","logger","callback","start","end","includes","Error","concurrency","inputDirectory","fileCount","debug","processStructuredInput","inputStructure","inputFilenameOptions","extensions","timezone","limit","processUnstructuredInput","recursive","info"],"mappings":";;;AAIO,MAAMA,OAAAA,GAAU,OACnBC,MAAAA,EACAC,UACAC,MAAAA,EACAC,QAAAA,EACA,EAAEC,KAAK,EAAEC,GAAG,EAAgC,GAAG,EAAE,GAAA;AAEjD,IAAA,IAAI,CAACJ,QAAAA,CAASK,QAAQ,CAAC,OAAA,CAAA,EAAU;AAC7B,QAAA,MAAM,IAAIC,KAAAA,CAAM,yDAAA,CAAA;AACpB,IAAA;IAEA,MAAMC,WAAAA,GAAcR,OAAOQ,WAAW;AACtC,IAAA,IAAI,CAACA,WAAAA,EAAa;AACd,QAAA,MAAM,IAAID,KAAAA,CAAM,+BAAA,CAAA;AACpB,IAAA;IAEA,MAAME,cAAAA,GAAiBT,OAAOS,cAAc;AAC5C,IAAA,IAAI,CAACA,cAAAA,EAAgB;AACjB,QAAA,MAAM,IAAIF,KAAAA,CAAM,mCAAA,CAAA;AACpB,IAAA;AAEA,IAAA,IAAIG,SAAAA,GAAY,CAAA;IAEhB,IAAIT,QAAAA,CAASK,QAAQ,CAAC,kBAAA,CAAA,EAAqB;AACvCJ,QAAAA,MAAAA,CAAOS,KAAK,CAAC,wEAAA,EAA0EF,cAAAA,EAAgBL,KAAAA,EAAOC,GAAAA,CAAAA;QAE9G,IAAI,CAACD,KAAAA,IAAS,CAACC,GAAAA,EAAK;AAChB,YAAA,MAAM,IAAIE,KAAAA,CAAM,0DAAA,CAAA;QACpB,CAAA,MAAO;YACHG,SAAAA,GAAY,MAAME,UACdZ,MAAAA,CAAOa,cAAc,EACrBb,MAAAA,CAAOc,oBAAoB,EAC3Bd,MAAAA,CAAOe,UAAU,EACjBf,OAAOgB,QAAQ,EACfZ,OACAC,GAAAA,EACAL,MAAAA,CAAOiB,KAAK,EACZhB,QAAAA,EACAC,MAAAA,EACAO,cAAAA,EACAN,QAAAA,EACAK,WAAAA,CAAAA;AAER,QAAA;IAGJ,CAAA,MAAO;;QAEHN,MAAAA,CAAOS,KAAK,CAAC,uCAAA,EAAyCF,cAAAA,CAAAA;AAEtD,QAAA,IAAIL,SAASC,GAAAA,EAAK;AACd,YAAA,MAAM,IAAIE,KAAAA,CAAM,yDAAA,CAAA;AACpB,QAAA;AAEAG,QAAAA,SAAAA,GAAY,MAAMQ,SAAAA,CACdT,cAAAA,EACAT,MAAAA,CAAOmB,SAAS,IAAI,KAAA,EACpBnB,MAAAA,CAAOe,UAAU,IAAI,EAAE,EACvBf,MAAAA,CAAOiB,KAAK,EACZf,QACAC,QAAAA,EACAK,WAAAA,CAAAA;AAER,IAAA;IAEAN,MAAAA,CAAOkB,IAAI,CAAC,uCAAA,EAAyCV,SAAAA,CAAAA;AACzD;;;;"}
@@ -0,0 +1,15 @@
1
+ import { Feature, FilenameOption, FilesystemStructure, Logger } from '../dreadcabinet';
2
+ import { z } from 'zod';
3
+ export declare const DateRangeSchema: z.ZodObject<{
4
+ start: z.ZodDate;
5
+ end: z.ZodDate;
6
+ }, z.core.$strip>;
7
+ export type DateRange = z.infer<typeof DateRangeSchema>;
8
+ export declare const getFilePattern: (features: Feature[], extensions: string[], logger: Logger) => string;
9
+ export declare const parseDateFromString: (dateStr: string, format: "YYYY-M-D-HHmm" | "M-D-HHmm" | "D-HHmm" | "HHmm", shouldParseTime: boolean, // New required parameter
10
+ year?: number, month?: number, day?: number) => Date | null;
11
+ export declare const isDateInRange: (date: Date, range?: DateRange) => boolean;
12
+ export declare const calculateDateRange: (timezone: string, startDate: Date, endDate: Date) => DateRange;
13
+ export declare const parseDateFromFilePath: (relativePath: string, filename: string, structure: string, shouldParseTime: boolean, logger: Logger) => Date | null;
14
+ export declare const processStructuredFile: (filePath: string, inputDirectory: string, structure: string, shouldParseTime: boolean, callback: (file: string, date?: Date) => Promise<void>, pattern: string, dateRange: DateRange, logger: Logger) => Promise<boolean>;
15
+ export declare const process: (inputStructure: FilesystemStructure, inputFilenameOptions: FilenameOption[], extensions: string[], timezone: string, start: Date, end: Date, limit: number | undefined, features: Feature[], logger: Logger, inputDirectory: string, callback: (file: string, date?: Date) => Promise<void>, concurrency?: number) => Promise<number>;
@@ -0,0 +1,324 @@
1
+ import * as path from 'node:path';
2
+ import { z } from 'zod';
3
+ import { DATE_FORMAT_YEAR_MONTH_DAY } from '../constants.js';
4
+ import { ArgumentError } from '../error/ArgumentError.js';
5
+ import { create as create$1 } from '../util/dates.js';
6
+ import { create } from '../util/storage.js';
7
+
8
+ z.object({
9
+ start: z.date(),
10
+ end: z.date()
11
+ });
12
+ // Get the appropriate file pattern based on config and options
13
+ const getFilePattern = (features, extensions, logger)=>{
14
+ // Validate extensions: they should not start with a dot.
15
+ if (extensions && extensions.length > 0) {
16
+ for (const ext of extensions){
17
+ if (ext.startsWith('.')) {
18
+ // Throw an error as the dot is added automatically by the pattern generation.
19
+ // Using ArgumentError might be more consistent if available and appropriate here.
20
+ throw new Error(`Invalid extension format: "${ext}". Extensions should not start with a dot ('.').`);
21
+ }
22
+ }
23
+ }
24
+ let pattern = '**/*'; // Start with a broad pattern for recursive search
25
+ if (features.includes('extensions') && extensions && extensions.length > 0) {
26
+ if (extensions.length === 1) {
27
+ pattern = `**/*.${extensions[0]}`;
28
+ } else {
29
+ pattern = `**/*.{${extensions.join(',')}}`;
30
+ }
31
+ logger.debug(`Applying extension filter: ${extensions.join(',')}`);
32
+ } else {
33
+ pattern = `**/*.*`;
34
+ logger.debug(`No extension filter applied, using pattern: ${pattern}`);
35
+ }
36
+ return pattern;
37
+ };
38
+ // Helper function to parse date string based on expected format
39
+ // Returns null if parsing fails
40
+ const parseDateFromString = (dateStr, format, shouldParseTime, year, month, day)=>{
41
+ // Basic validation
42
+ if (!dateStr) return null;
43
+ try {
44
+ let y = year !== null && year !== void 0 ? year : 0;
45
+ let mo = month !== null && month !== void 0 ? month : 0; // JS months are 0-indexed
46
+ let d = day !== null && day !== void 0 ? day : 1; // JS days are 1-indexed
47
+ let h = 0; // Default to 0
48
+ let mi = 0; // Default to 0
49
+ // Remove potential leading/trailing non-alphanumeric if needed, split by common separators
50
+ const cleanedDateStr = dateStr.replace(/^[^\p{L}\p{N}]+|[^\p{L}\p{N}]+$/gu, '');
51
+ const parts = cleanedDateStr.split(/[-_]/); // Allow dash or underscore
52
+ switch(format){
53
+ case 'YYYY-M-D-HHmm':
54
+ {
55
+ if (parts.length < 4 && shouldParseTime) return null; // Need time part if parsing it
56
+ if (parts.length < 3 && !shouldParseTime) return null; // Need at least date part
57
+ y = parseInt(parts[0], 10);
58
+ mo = parseInt(parts[1], 10) - 1; // Adjust month
59
+ d = parseInt(parts[2], 10);
60
+ if (shouldParseTime) {
61
+ const timePartYD = parts[3];
62
+ if (timePartYD.length < 4) return null; // Ensure HHmm exists
63
+ h = parseInt(timePartYD.substring(0, 2), 10);
64
+ mi = parseInt(timePartYD.substring(2, 4), 10);
65
+ }
66
+ break;
67
+ }
68
+ case 'M-D-HHmm':
69
+ {
70
+ if (year === undefined) return null;
71
+ if (parts.length < 3 && shouldParseTime) return null;
72
+ if (parts.length < 2 && !shouldParseTime) return null;
73
+ mo = parseInt(parts[0], 10) - 1; // Adjust month
74
+ d = parseInt(parts[1], 10);
75
+ if (shouldParseTime) {
76
+ const timePartMD = parts[2];
77
+ if (timePartMD.length < 4) return null; // Ensure HHmm exists
78
+ h = parseInt(timePartMD.substring(0, 2), 10);
79
+ mi = parseInt(timePartMD.substring(2, 4), 10);
80
+ }
81
+ break;
82
+ }
83
+ case 'D-HHmm':
84
+ {
85
+ if (year === undefined || month === undefined) return null;
86
+ if (parts.length < 2 && shouldParseTime) return null;
87
+ if (parts.length < 1 && !shouldParseTime) return null;
88
+ d = parseInt(parts[0], 10);
89
+ if (shouldParseTime) {
90
+ const timePartD = parts[1];
91
+ if (timePartD.length < 4) return null; // Ensure HHmm exists
92
+ h = parseInt(timePartD.substring(0, 2), 10);
93
+ mi = parseInt(timePartD.substring(2, 4), 10);
94
+ }
95
+ break;
96
+ }
97
+ case 'HHmm':
98
+ if (year === undefined || month === undefined || day === undefined) return null;
99
+ if (shouldParseTime) {
100
+ if (parts[0].length !== 4) return null;
101
+ h = parseInt(parts[0].substring(0, 2), 10);
102
+ mi = parseInt(parts[0].substring(2, 4), 10);
103
+ } // Else h=0, mi=0 (set by defaults)
104
+ break;
105
+ default:
106
+ return null;
107
+ }
108
+ // Validate parsed numbers
109
+ if (isNaN(y) || isNaN(mo) || isNaN(d)) {
110
+ throw new Error(`Invalid date components in date string "${dateStr}" with format ${format}: Y:${y} M:${mo} D:${d}`);
111
+ }
112
+ // Set hour and minute to 0 if not provided
113
+ if (isNaN(h)) {
114
+ h = 0;
115
+ }
116
+ if (isNaN(mi)) {
117
+ mi = 0;
118
+ }
119
+ if (mo < 0 || mo > 11 || d < 1 || d > 31 || h < 0 || h > 23 || mi < 0 || mi > 59) {
120
+ throw new Error(`Invalid date components in date string "${dateStr}" with format ${format}: Y:${y} M:${mo + 1} D:${d} H:${h} m:${mi}`);
121
+ }
122
+ const date = new Date(Date.UTC(y, mo, d, h, mi));
123
+ // Double check components as Date object might adjust invalid dates (e.g. Feb 30th -> Mar 2nd)
124
+ if (date.getUTCFullYear() !== y || date.getUTCMonth() !== mo || date.getUTCDate() !== d || date.getUTCHours() !== h || date.getUTCMinutes() !== mi) {
125
+ // console.debug(`Date validation failed for Y:${y} M:${mo} D:${d} H:${h} m:${mi}. JS Date adjusted it.`);
126
+ return null;
127
+ }
128
+ return date;
129
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
130
+ } catch (e) {
131
+ // console.error(`Error parsing date string "${dateStr}" with format ${format}:`, e);
132
+ return null;
133
+ }
134
+ };
135
+ // Helper to check if date is within range (start inclusive, end exclusive)
136
+ const isDateInRange = (date, range)=>{
137
+ if (!range || !range.start && !range.end) return true; // No range or empty range means all dates are valid
138
+ // Ensure range dates are Date objects
139
+ const startDate = range.start ? range.start instanceof Date ? range.start : new Date(range.start) : null;
140
+ const endDate = range.end ? range.end instanceof Date ? range.end : new Date(range.end) : null;
141
+ // Validate parsed range dates
142
+ const isStartDateValid = startDate && !isNaN(startDate.getTime());
143
+ const isEndDateValid = endDate && !isNaN(endDate.getTime());
144
+ if (isStartDateValid && date < startDate) {
145
+ return false;
146
+ }
147
+ // End date is exclusive
148
+ if (isEndDateValid && date >= endDate) {
149
+ return false;
150
+ }
151
+ return true;
152
+ };
153
+ const calculateDateRange = (timezone, startDate, endDate)=>{
154
+ // Create date utility after timezone is validated
155
+ const dateUtil = create$1({
156
+ timezone
157
+ });
158
+ const now = dateUtil.now();
159
+ const range = {
160
+ start: dateUtil.subDays(now, 31),
161
+ end: now
162
+ };
163
+ // Note: Validation ensures dates are valid and start <= end if both are provided
164
+ if (startDate || endDate) {
165
+ // Handle end date
166
+ if (endDate) {
167
+ range.end = dateUtil.parse(endDate, DATE_FORMAT_YEAR_MONTH_DAY);
168
+ }
169
+ // Handle start date
170
+ if (startDate) {
171
+ range.start = dateUtil.parse(startDate, DATE_FORMAT_YEAR_MONTH_DAY);
172
+ }
173
+ // We re-check the order here after defaults might have been applied,
174
+ // although validateStartEndDates should catch explicit invalid orders.
175
+ if (dateUtil.isBefore(range.end, range.start)) {
176
+ // This case should theoretically not be reachable due to prior validation
177
+ // but is kept as a safeguard.
178
+ 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)}).`);
179
+ }
180
+ }
181
+ return range;
182
+ };
183
+ // Parse date from file path based on the input structure
184
+ const parseDateFromFilePath = (relativePath, filename, structure, shouldParseTime, logger)=>{
185
+ const pathParts = relativePath.split(path.sep);
186
+ const filenameWithoutExt = path.basename(filename, path.extname(filename));
187
+ let parsedDate = null;
188
+ let year;
189
+ let month; // 0-indexed month for Date constructor
190
+ let day;
191
+ switch(structure){
192
+ case 'none':
193
+ // Filename format: YYYY-M-D-HHmm...
194
+ parsedDate = parseDateFromString(filenameWithoutExt, 'YYYY-M-D-HHmm', shouldParseTime);
195
+ break;
196
+ case 'year':
197
+ // Path: YYYY / M-D-HHmm...
198
+ if (pathParts.length >= 1) {
199
+ year = parseInt(pathParts[0], 10);
200
+ if (!isNaN(year)) {
201
+ parsedDate = parseDateFromString(filenameWithoutExt, 'M-D-HHmm', shouldParseTime, year);
202
+ } else {
203
+ logger.warn(`Invalid year format in path: ${pathParts[0]}`);
204
+ }
205
+ } else {
206
+ logger.warn(`File path does not match expected 'year' structure (YYYY/...)`);
207
+ }
208
+ break;
209
+ case 'month':
210
+ // Path: YYYY / MM / D-HHmm...
211
+ if (pathParts.length >= 2) {
212
+ year = parseInt(pathParts[0], 10);
213
+ const monthDir = parseInt(pathParts[1], 10); // Month from dir (1-indexed)
214
+ if (!isNaN(year) && !isNaN(monthDir) && monthDir >= 1 && monthDir <= 12) {
215
+ month = monthDir - 1; // Adjust month for Date object (0-indexed)
216
+ parsedDate = parseDateFromString(filenameWithoutExt, 'D-HHmm', shouldParseTime, year, month);
217
+ } else {
218
+ logger.warn(`Invalid year/month format in path: ${pathParts[0]}/${pathParts[1]}`);
219
+ }
220
+ } else {
221
+ logger.warn(`File path does not match expected 'month' structure (YYYY/MM/...)`);
222
+ }
223
+ break;
224
+ case 'day':
225
+ // Path: YYYY / MM / DD / HHmm...
226
+ if (pathParts.length >= 3) {
227
+ year = parseInt(pathParts[0], 10);
228
+ const monthDir = parseInt(pathParts[1], 10); // Month from dir (1-indexed)
229
+ day = parseInt(pathParts[2], 10); // Day from dir (1-indexed)
230
+ if (!isNaN(year) && !isNaN(monthDir) && monthDir >= 1 && monthDir <= 12 && !isNaN(day) && day >= 1 && day <= 31) {
231
+ month = monthDir - 1; // Adjust month (0-indexed)
232
+ parsedDate = parseDateFromString(filenameWithoutExt, 'HHmm', shouldParseTime, year, month, day);
233
+ } else {
234
+ logger.warn(`Invalid year/month/day format in path: ${pathParts[0]}/${pathParts[1]}/${pathParts[2]}`);
235
+ }
236
+ } else {
237
+ logger.warn(`File path does not match expected 'day' structure (YYYY/MM/DD/...)`);
238
+ }
239
+ break;
240
+ default:
241
+ logger.error(`Fatal: Unknown input structure "${structure}" specified in config.`);
242
+ throw new Error(`Unknown input structure "${structure}" specified.`);
243
+ }
244
+ return parsedDate;
245
+ };
246
+ // Process a single file from the structured input
247
+ const processStructuredFile = async (filePath, inputDirectory, structure, shouldParseTime, callback, pattern, dateRange, logger)=>{
248
+ // Skip if filePath somehow points to the inputDirectory itself or is not a file
249
+ if (filePath === inputDirectory || !path.extname(filePath) && pattern.endsWith('*.*')) {
250
+ return false;
251
+ }
252
+ const relativePath = path.relative(inputDirectory, filePath);
253
+ const pathParts = relativePath.split(path.sep);
254
+ const filename = pathParts.pop(); // Filename is the last part
255
+ if (!filename) {
256
+ logger.warn(`Could not determine filename for path: ${filePath}`);
257
+ return false;
258
+ }
259
+ try {
260
+ const parsedDate = parseDateFromFilePath(relativePath, filename, structure, shouldParseTime, logger);
261
+ if (parsedDate) {
262
+ // Apply date range filtering
263
+ if (isDateInRange(parsedDate, dateRange)) {
264
+ logger.debug('Processing file %s with date %s', filePath, parsedDate.toISOString());
265
+ await callback(filePath, parsedDate);
266
+ return true;
267
+ } else {
268
+ const dateRangeDisplay = dateRange ? `from ${dateRange.start ? new Date(dateRange.start).toISOString() : 'beginning'} up to ${dateRange.end ? new Date(dateRange.end).toISOString() : 'end'}` : 'all dates';
269
+ logger.debug('Skipping file %s, date %s out of range %s', filePath, parsedDate.toISOString(), dateRangeDisplay);
270
+ }
271
+ } else {
272
+ logger.warn('Could not parse date for file %s with structure "%s" (filename base: "%s", path parts: %s)', filePath, structure, path.basename(filename, path.extname(filename)), pathParts.join('/'));
273
+ }
274
+ } catch (error) {
275
+ // Log error from the callback or date parsing/filtering itself
276
+ if (error instanceof Error) {
277
+ logger.error('Error processing file %s: %s\n%s', filePath, error.message, error.stack);
278
+ } else {
279
+ logger.error('Error processing file %s: %s', filePath, error);
280
+ }
281
+ }
282
+ return false;
283
+ };
284
+ const process = async (inputStructure, inputFilenameOptions, extensions, timezone, start, end, limit, features, logger, inputDirectory, callback, concurrency)=>{
285
+ var _ref;
286
+ const storage = create({
287
+ log: logger.debug
288
+ });
289
+ const dateRange = calculateDateRange(timezone, start, end);
290
+ let fileCount = 0;
291
+ // Validate date range dates if provided
292
+ if ((dateRange === null || dateRange === void 0 ? void 0 : dateRange.start) && (!dateRange.start || isNaN(dateRange.start.getTime()))) {
293
+ logger.warn(`Invalid start date provided in dateRange: ${dateRange.start}`);
294
+ }
295
+ if ((dateRange === null || dateRange === void 0 ? void 0 : dateRange.end) && (!dateRange.end || isNaN(dateRange.end.getTime()))) {
296
+ logger.warn(`Invalid end date provided in dateRange: ${dateRange.end}`);
297
+ }
298
+ // Structured Input Logic
299
+ const structure = inputStructure !== null && inputStructure !== void 0 ? inputStructure : 'none'; // Default to 'none' if not specified
300
+ logger.info(`Processing structured input with structure "${structure}" in %s for date range: ${JSON.stringify(dateRange)}`, inputDirectory);
301
+ // Determine if time should be parsed from filenames
302
+ const shouldParseTime = (_ref = inputFilenameOptions === null || inputFilenameOptions === void 0 ? void 0 : inputFilenameOptions.includes('time')) !== null && _ref !== void 0 ? _ref : false;
303
+ if (shouldParseTime) {
304
+ logger.debug('Filename time parsing enabled based on inputFilenameOptions.');
305
+ } else {
306
+ logger.debug('Filename time parsing disabled; defaulting times to 00:00 UTC.');
307
+ }
308
+ const filePattern = getFilePattern(features, extensions || [], logger);
309
+ logger.debug('Processing Structured Input with pattern %s from %s', filePattern, inputDirectory);
310
+ await storage.forEachFileIn(inputDirectory, async (filePath)=>{
311
+ const processed = await processStructuredFile(filePath, inputDirectory, structure, shouldParseTime, callback, filePattern, dateRange, logger);
312
+ if (processed) {
313
+ fileCount++;
314
+ }
315
+ }, {
316
+ pattern: filePattern,
317
+ limit,
318
+ concurrency
319
+ });
320
+ return fileCount;
321
+ };
322
+
323
+ export { calculateDateRange, getFilePattern, isDateInRange, parseDateFromFilePath, parseDateFromString, process, processStructuredFile };
324
+ //# sourceMappingURL=structured.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structured.js","sources":["../../src/input/structured.ts"],"sourcesContent":["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"],"names":["z","object","start","date","end","getFilePattern","features","extensions","logger","length","ext","startsWith","Error","pattern","includes","join","debug","parseDateFromString","dateStr","format","shouldParseTime","year","month","day","y","mo","d","h","mi","cleanedDateStr","replace","parts","split","parseInt","timePartYD","substring","undefined","timePartMD","timePartD","isNaN","Date","UTC","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","e","isDateInRange","range","startDate","endDate","isStartDateValid","getTime","isEndDateValid","calculateDateRange","timezone","dateUtil","Dates","now","subDays","parse","DATE_FORMAT_YEAR_MONTH_DAY","isBefore","ArgumentError","parseDateFromFilePath","relativePath","filename","structure","pathParts","path","sep","filenameWithoutExt","basename","extname","parsedDate","warn","monthDir","error","processStructuredFile","filePath","inputDirectory","callback","dateRange","endsWith","relative","pop","toISOString","dateRangeDisplay","message","stack","process","inputStructure","inputFilenameOptions","limit","concurrency","storage","Storage","log","fileCount","info","JSON","stringify","filePattern","forEachFileIn","processed"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Logger } from '../dreadcabinet';
2
+ export declare const process: (inputDirectory: string, recursive: boolean, extensions: string[], limit: number | undefined, logger: Logger, callback: (file: string) => Promise<void>, concurrency?: number) => Promise<number>;
@@ -0,0 +1,45 @@
1
+ import { create } from '../util/storage.js';
2
+
3
+ // Process files with unstructured input pattern
4
+ const process = async (inputDirectory, recursive, extensions, limit, logger, callback, concurrency)=>{
5
+ const storage = create({
6
+ log: logger.debug
7
+ });
8
+ let fileCount = 0;
9
+ let filePattern = `${recursive ? '**/' : ''}*`;
10
+ if (extensions && extensions.length > 0) {
11
+ // Ensure the pattern correctly handles extensions with or without recursion
12
+ if (recursive) {
13
+ filePattern = `**/*.{${extensions.join(',')}}`;
14
+ } else {
15
+ filePattern = `*.{${extensions.join(',')}}`;
16
+ }
17
+ logger.debug(`Applying extension filter: ${extensions.join(',')}`);
18
+ } else if (!recursive) {
19
+ // Non-recursive without extension filter: only files in the top directory
20
+ filePattern = `*.*`; // Adjust if files without extensions need matching
21
+ }
22
+ logger.info('Processing unstructured files %s in %s with pattern %s', recursive ? 'recursively' : 'non-recursively', inputDirectory, filePattern);
23
+ await storage.forEachFileIn(inputDirectory, async (file)=>{
24
+ try {
25
+ logger.debug('Processing file %s', file);
26
+ // Call callback without date for unstructured input
27
+ await callback(file); // Pass undefined for the date parameter
28
+ fileCount++;
29
+ } catch (error) {
30
+ if (error instanceof Error) {
31
+ logger.error('Error processing file %s: %s\n%s', file, error.message, error.stack);
32
+ } else {
33
+ logger.error('Error processing file %s: %s', file, error);
34
+ }
35
+ }
36
+ }, {
37
+ pattern: filePattern,
38
+ limit,
39
+ concurrency
40
+ });
41
+ return fileCount;
42
+ };
43
+
44
+ export { process };
45
+ //# sourceMappingURL=unstructured.js.map