@theunwalked/cardigantime 0.0.12 → 0.0.14
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/dist/cardigantime.cjs +83 -5
- package/dist/cardigantime.cjs.map +1 -1
- package/dist/cardigantime.js.map +1 -1
- package/dist/configure.js.map +1 -1
- package/dist/constants.js.map +1 -1
- package/dist/error/ArgumentError.js.map +1 -1
- package/dist/error/ConfigurationError.js.map +1 -1
- package/dist/error/FileSystemError.js.map +1 -1
- package/dist/read.js +75 -3
- package/dist/read.js.map +1 -1
- package/dist/types.d.ts +8 -0
- package/dist/types.js +3 -1
- package/dist/types.js.map +1 -1
- package/dist/util/hierarchical.d.ts +2 -0
- package/dist/util/hierarchical.js +4 -0
- package/dist/util/hierarchical.js.map +1 -1
- package/dist/util/schema-defaults.d.ts +1 -1
- package/dist/util/schema-defaults.js +1 -1
- package/dist/util/schema-defaults.js.map +1 -1
- package/dist/util/storage.js.map +1 -1
- package/dist/validate.js.map +1 -1
- package/package.json +9 -9
package/dist/cardigantime.cjs
CHANGED
|
@@ -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
|
-
...
|
|
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,
|
|
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
|