@theunwalked/cardigantime 0.0.12 → 0.0.13

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.
@@ -768,11 +768,13 @@ const create$1 = (params)=>{
768
768
  return {
769
769
  config: {},
770
770
  discoveredDirs: [],
771
+ resolvedConfigDirs: [],
771
772
  errors: []
772
773
  };
773
774
  }
774
775
  // Load configurations from each directory
775
776
  const configs = [];
777
+ const resolvedConfigDirs = [];
776
778
  const errors = [];
777
779
  // Sort by level (highest level first = lowest precedence first)
778
780
  const sortedDirs = [
@@ -783,6 +785,7 @@ const create$1 = (params)=>{
783
785
  const config = await loadConfigFromDirectory(dir.path, configFileName, encoding, logger, pathFields, resolvePathArray);
784
786
  if (config !== null) {
785
787
  configs.push(config);
788
+ resolvedConfigDirs.push(dir);
786
789
  logger === null || logger === void 0 ? void 0 : logger.debug(`Loaded config from level ${dir.level}: ${dir.path}`);
787
790
  } else {
788
791
  logger === null || logger === void 0 ? void 0 : logger.debug(`No valid config found at level ${dir.level}: ${dir.path}`);
@@ -799,6 +802,7 @@ const create$1 = (params)=>{
799
802
  return {
800
803
  config: mergedConfig,
801
804
  discoveredDirs,
805
+ resolvedConfigDirs,
802
806
  errors
803
807
  };
804
808
  }
@@ -966,6 +970,8 @@ const create$1 = (params)=>{
966
970
  const resolvedConfigDir = validateConfigDirectory$1(rawConfigDir);
967
971
  logger.verbose('Resolved config directory');
968
972
  let rawFileConfig = {};
973
+ let discoveredConfigDirs = [];
974
+ let resolvedConfigDirs = [];
969
975
  // Check if hierarchical configuration discovery is enabled
970
976
  if (options.features.includes('hierarchical')) {
971
977
  logger.verbose('Hierarchical configuration discovery enabled');
@@ -986,6 +992,8 @@ const create$1 = (params)=>{
986
992
  fieldOverlaps: options.defaults.fieldOverlaps
987
993
  });
988
994
  rawFileConfig = hierarchicalResult.config;
995
+ discoveredConfigDirs = hierarchicalResult.discoveredDirs.map((dir)=>dir.path);
996
+ resolvedConfigDirs = hierarchicalResult.resolvedConfigDirs.map((dir)=>dir.path);
989
997
  if (hierarchicalResult.discoveredDirs.length > 0) {
990
998
  logger.verbose(`Hierarchical discovery found ${hierarchicalResult.discoveredDirs.length} configuration directories`);
991
999
  hierarchicalResult.discoveredDirs.forEach((dir)=>{
@@ -994,6 +1002,12 @@ const create$1 = (params)=>{
994
1002
  } else {
995
1003
  logger.verbose('No configuration directories found in hierarchy');
996
1004
  }
1005
+ if (hierarchicalResult.resolvedConfigDirs.length > 0) {
1006
+ logger.verbose(`Found ${hierarchicalResult.resolvedConfigDirs.length} directories with actual configuration files`);
1007
+ hierarchicalResult.resolvedConfigDirs.forEach((dir)=>{
1008
+ logger.debug(` Config dir level ${dir.level}: ${dir.path}`);
1009
+ });
1010
+ }
997
1011
  if (hierarchicalResult.errors.length > 0) {
998
1012
  hierarchicalResult.errors.forEach((error)=>logger.warn(`Hierarchical config warning: ${error}`));
999
1013
  }
@@ -1002,11 +1016,33 @@ const create$1 = (params)=>{
1002
1016
  // Fall back to single directory mode
1003
1017
  logger.verbose('Falling back to single directory configuration loading');
1004
1018
  rawFileConfig = await loadSingleDirectoryConfig(resolvedConfigDir, options, logger);
1019
+ // Include the directory in both arrays (discovered but check if it had config)
1020
+ discoveredConfigDirs = [
1021
+ resolvedConfigDir
1022
+ ];
1023
+ if (rawFileConfig && Object.keys(rawFileConfig).length > 0) {
1024
+ resolvedConfigDirs = [
1025
+ resolvedConfigDir
1026
+ ];
1027
+ } else {
1028
+ resolvedConfigDirs = [];
1029
+ }
1005
1030
  }
1006
1031
  } else {
1007
1032
  // Use traditional single directory configuration loading
1008
1033
  logger.verbose('Using single directory configuration loading');
1009
1034
  rawFileConfig = await loadSingleDirectoryConfig(resolvedConfigDir, options, logger);
1035
+ // Include the directory in discovered, and in resolved only if it had config
1036
+ discoveredConfigDirs = [
1037
+ resolvedConfigDir
1038
+ ];
1039
+ if (rawFileConfig && Object.keys(rawFileConfig).length > 0) {
1040
+ resolvedConfigDirs = [
1041
+ resolvedConfigDir
1042
+ ];
1043
+ } else {
1044
+ resolvedConfigDirs = [];
1045
+ }
1010
1046
  }
1011
1047
  // Apply path resolution if configured
1012
1048
  let processedConfig = rawFileConfig;
@@ -1016,7 +1052,9 @@ const create$1 = (params)=>{
1016
1052
  const config = clean({
1017
1053
  ...processedConfig,
1018
1054
  ...{
1019
- configDirectory: resolvedConfigDir
1055
+ configDirectory: resolvedConfigDir,
1056
+ discoveredConfigDirs,
1057
+ resolvedConfigDirs
1020
1058
  }
1021
1059
  });
1022
1060
  return config;
@@ -1211,6 +1249,7 @@ const create$1 = (params)=>{
1211
1249
  logger.verbose(`Resolved config directory: ${resolvedConfigDir}`);
1212
1250
  let rawFileConfig = {};
1213
1251
  let discoveredDirs = [];
1252
+ let resolvedConfigDirs = [];
1214
1253
  let tracker = {};
1215
1254
  // Check if hierarchical configuration discovery is enabled
1216
1255
  if (options.features.includes('hierarchical')) {
@@ -1233,11 +1272,12 @@ const create$1 = (params)=>{
1233
1272
  });
1234
1273
  rawFileConfig = hierarchicalResult.config;
1235
1274
  discoveredDirs = hierarchicalResult.discoveredDirs;
1275
+ resolvedConfigDirs = hierarchicalResult.resolvedConfigDirs;
1236
1276
  // Build detailed source tracking by re-loading each config individually
1237
1277
  const trackers = [];
1238
1278
  // Sort by level (highest level first = lowest precedence first) to match merge order
1239
1279
  const sortedDirs = [
1240
- ...discoveredDirs
1280
+ ...resolvedConfigDirs
1241
1281
  ].sort((a, b)=>b.level - a.level);
1242
1282
  for (const dir of sortedDirs){
1243
1283
  const storage = create$1({
@@ -1272,12 +1312,23 @@ const create$1 = (params)=>{
1272
1312
  rawFileConfig = await loadSingleDirectoryConfig(resolvedConfigDir, options, logger);
1273
1313
  const configFilePath = path__namespace.join(resolvedConfigDir, options.defaults.configFile);
1274
1314
  tracker = trackConfigSources(rawFileConfig, configFilePath, 0);
1315
+ // Include the directory in discovered, and in resolved only if it had config
1275
1316
  discoveredDirs = [
1276
1317
  {
1277
1318
  path: resolvedConfigDir,
1278
1319
  level: 0
1279
1320
  }
1280
1321
  ];
1322
+ if (rawFileConfig && Object.keys(rawFileConfig).length > 0) {
1323
+ resolvedConfigDirs = [
1324
+ {
1325
+ path: resolvedConfigDir,
1326
+ level: 0
1327
+ }
1328
+ ];
1329
+ } else {
1330
+ resolvedConfigDirs = [];
1331
+ }
1281
1332
  }
1282
1333
  } else {
1283
1334
  // Use traditional single directory configuration loading
@@ -1285,12 +1336,23 @@ const create$1 = (params)=>{
1285
1336
  rawFileConfig = await loadSingleDirectoryConfig(resolvedConfigDir, options, logger);
1286
1337
  const configFilePath = path__namespace.join(resolvedConfigDir, options.defaults.configFile);
1287
1338
  tracker = trackConfigSources(rawFileConfig, configFilePath, 0);
1339
+ // Include the directory in discovered, and in resolved only if it had config
1288
1340
  discoveredDirs = [
1289
1341
  {
1290
1342
  path: resolvedConfigDir,
1291
1343
  level: 0
1292
1344
  }
1293
1345
  ];
1346
+ if (rawFileConfig && Object.keys(rawFileConfig).length > 0) {
1347
+ resolvedConfigDirs = [
1348
+ {
1349
+ path: resolvedConfigDir,
1350
+ level: 0
1351
+ }
1352
+ ];
1353
+ } else {
1354
+ resolvedConfigDirs = [];
1355
+ }
1294
1356
  }
1295
1357
  // Apply path resolution if configured (this doesn't change source tracking)
1296
1358
  let processedConfig = rawFileConfig;
@@ -1300,7 +1362,9 @@ const create$1 = (params)=>{
1300
1362
  // Build final configuration including built-in values
1301
1363
  const finalConfig = clean({
1302
1364
  ...processedConfig,
1303
- configDirectory: resolvedConfigDir
1365
+ configDirectory: resolvedConfigDir,
1366
+ discoveredConfigDirs: discoveredDirs.map((dir)=>dir.path),
1367
+ resolvedConfigDirs: resolvedConfigDirs.map((dir)=>dir.path)
1304
1368
  });
1305
1369
  // Add built-in configuration to tracker
1306
1370
  tracker['configDirectory'] = {
@@ -1309,6 +1373,18 @@ const create$1 = (params)=>{
1309
1373
  level: -1,
1310
1374
  sourceLabel: 'Built-in (runtime)'
1311
1375
  };
1376
+ tracker['discoveredConfigDirs'] = {
1377
+ value: discoveredDirs.map((dir)=>dir.path),
1378
+ sourcePath: 'built-in',
1379
+ level: -1,
1380
+ sourceLabel: 'Built-in (runtime)'
1381
+ };
1382
+ tracker['resolvedConfigDirs'] = {
1383
+ value: resolvedConfigDirs.map((dir)=>dir.path),
1384
+ sourcePath: 'built-in',
1385
+ level: -1,
1386
+ sourceLabel: 'Built-in (runtime)'
1387
+ };
1312
1388
  // Display the configuration with source information
1313
1389
  displayConfigWithSources(finalConfig, tracker, discoveredDirs, logger);
1314
1390
  };
@@ -1361,7 +1437,9 @@ class ConfigurationError extends Error {
1361
1437
  * Base Zod schema for core Cardigantime configuration.
1362
1438
  * Contains the minimum required configuration fields.
1363
1439
  */ const ConfigSchema = zod.z.object({
1364
- /** The resolved configuration directory path */ configDirectory: zod.z.string()
1440
+ /** The resolved configuration directory path */ configDirectory: zod.z.string(),
1441
+ /** Array of all directory paths that were discovered during hierarchical search */ discoveredConfigDirs: zod.z.array(zod.z.string()),
1442
+ /** Array of directory paths that actually contained valid configuration files */ resolvedConfigDirs: zod.z.array(zod.z.string())
1365
1443
  });
1366
1444
 
1367
1445
  /**
@@ -1722,7 +1800,7 @@ class ConfigurationError extends Error {
1722
1800
  * // Returns: { timeout: 5000, features: ['auth', 'logging'] }
1723
1801
  * // Note: apiKey is not included since it has no default
1724
1802
  * ```
1725
- */ const generateDefaultConfig = (configShape, configDirectory)=>{
1803
+ */ const generateDefaultConfig = (configShape, _configDirectory)=>{
1726
1804
  // Create the full schema by combining base and user schema
1727
1805
  const fullSchema = zod.z.object({
1728
1806
  ...configShape