# Changes

## 2026-05-22

- [2.14.1] Bug fix in ```helper.buildBaseConfig()```
- [2.14.1] Bug fix in ```helper.collectHooks()```

## 2026-05-16

- [2.14.0] Add ```bajo:beforeReadConfig()``` hook
- [2.14.0] Add ```bajo.override:beforeReadConfig()``` hook
- [2.14.0] Add ```bajo.extend:beforeReadConfig()``` hook
- [2.14.0] Add ```bajo:afterReadConfig()``` hook
- [2.14.0] Add ```bajo.override:afterReadConfig()``` hook
- [2.14.0] Add ```bajo.extend:afterReadConfig()``` hook

## 2026-05-02

- [2.13.1] Bug fix in ```app.t()```
- [2.13.1] Bug fix in ```bajo.join()```

## 2026-04-28

- [2.13.0] Add ```options.merge``` to ```readConfig()```
- [2.13.0] Bug fix in ```err.js```

## 2026-04-25

- [2.12.1] Bug fix in ```readConfig()```

## 2026-04-23

- [2.12.0] Remove ```breakNsPathFromFile()```
- [2.12.0] Add feature to read in extended path ```readConfig()```

## 2026-04-11

- [2.11.1] Bug fix in ```join()```
- [2.11.1] Bug fix in ```format()```

## 2026-04-07

- [2.11.0] Change ```dispose()``` to be an async function
- [2.11.0] Bug fix in ```_prepTrans()```

## 2026-03-30

- [2.10.0] Add ability to pass options of ```configHandlers``` with type ```.js```
- [2.10.0] Freezing config object now occurs ```{ns}:afterStart()```
- [2.10.0] Bug fix in ```print.fatal()``` when argument is an Error object
- [2.10.1] Bug fix in ```fromJs()```

## 2026-03-25

- [2.9.0] Add ```dump()``` now available through out plugins
- [2.9.0] Bug fix in ```buildCollections()```, now items to be collected are parsed with ```aneka.parseObject()```

## 2026-03-22

- [2.8.0] Add ```options.readFromFile``` in ```readConfig()```
- [2.8.0] Bug fix in ```readConfig()``` while reading ```json``` file
- [2.8.0] Bug fix in ```fromJson()```
- [2.8.0] Bug fix in ```toJson()```

## 2026-03-15

- [2.7.3] Bug fix in checking plugin dependency handler

## 2026-03-11

- [2.7.2] Bug fix in env dependent config building
- [2.7.2] ```selfBind()``` now also accept string for single method

## 2026-03-10

- [2.7.1] Using ```textToArray()``` from ```aneka``` instead of custom function to parse text into array

## 2026-03-02

- [2.7.0] Add ```useDefaultName``` parameter to ```buildCollection()```
- [2.7.0] Add some translations

## 2026-02-26

- [2.6.2] Bug fix in ```getMethod()```

## 2026-02-23

- [2.6.1] Bug fix in ```readConfig()```
- [2.6.1] Bug fix in ```base.loadConfig()```

## 2026-02-20

- [2.6.0] Upgrade to ```aneka@0.12.0```
- [2.6.0] Add ```te()```
- [2.6.0] Bug fix in ```formatErrorDetails()``` in ```Err``` class

## 2026-02-08

- [2.5.0] Bug fix in handling log for ```error``` level
- [2.5.0] Add ```log.getErrorMessage()``` to get the right value of error message
- [2.5.0] Add ```timeZone``` in config for datetime data type

## 2026-01-29

- [2.4.0] Hooks can now be added through ```config``` object. This is specially usefull if you provide a custom config object on app boot
- [2.4.1] Bug fix in ```runHook()``` resolver. Source defaults to ```main``` if not provided. Scope defaults to ```bajo``` if not found/initialized yet
- [2.4.2] Bug fix in getting wrongly parsed ```env``` value

## 2026-01-24

- [2.3.2] Hook now can be executed without waiting if property ```noWait``` is ```true```

## 2026-01-21

- [2.3.1] Bug fix in keys that needs to be used while reading plugin's config files

## 2026-01-18

- [2.3.0] ```App``` constructor now accept an object as its parameter. For details, please see documentation
- [2.3.0] Package upgrade to ```aneka@0.11.0```
- [2.3.0] Bug fix in ```checkDependencies()```

## 2026-01-16

- [2.2.1] Bug fix in multiple appearance of loaded plugins info
- [2.2.1] Bug fix in ```app.lib.parseObject()``` wrapper

## 2026-01-11

- [2.2.0] Simplify numerous things by putting most of static properties back as normal class properties

## 2025-12-29

- [2.2.0] Add ```this.selfBind()``` to class ```Plugin```

## 2025-12-27

- [2.2.0] Add some translations

## 2025-12-27

- [2.2.0] Add config object ```this.config.runtime``` to adjust some runtime settings

## 2025-12-24

- [2.2.0] Pass ```true``` to ```this.app.exit()``` to exit abruptly. Defaults to ```SIGINT```
- [2.2.0] Add ```detailsMessage``` to ```Err``` class if error object has ```details``` in payload
- [2.2.0] Upgrade ```aneka@0.10.0```
- [2.2.0] Bugfix: program arguments should not parsed as object

## 2025-12-21

- [2.2.0] ```runHook()``` now accept both ```alias``` & ```ns``` prefixed name
- [2.2.0] In case of unknown plugin or plugin isn't loaded, ```runHook``` simply exit silently
- [2.2.0] ```this.app.pluginClass``` is now ```this.app.baseClass``` and all containing class definition keys are pascal cased to match with their constructor names

## 2025-12-20

- [2.2.0] Removing dynamically attached methods because its problematic and leads to confusion

## 2025-12-19

- [2.2.0] Upgrade to ```aneka@0.9.0```

## 2025-12-13

- [2.2.0] Add ```app.lib.formatText()```
- [2.2.0] Move most bajo methods that doesn't relate to Bajo to app.lib functions

## 2025-12-11

- [2.1.1] Upgrade to ```aneka@0.5.0```

## 2025-12-09

- [2.1.1] Upgrade to ```aneka@0.2.3```
- [2.1.1] Some organizatory file location changes
- [2.1.1] Typo on class ```Tools```

## 2025-12-05

- [2.1.1] Upgrade to ```aneka@0.2.1```
- [2.1.1] New class ```Tools```, serves as anchestor for ```Err``` & ```Print```

## 2025-12-03

- [2.1.1] Add method ```getPkgInfo()``` to plugins main class.
- [2.1.1] Now you can put your plugins either in ```{dataDir}/config/.plugins``` or directly as an array in your app ```package.json``` under the ```bajo.plugins``` tree. The later takes precedence.
