Merged keys
Configure how the data is merged
As explained in Shared data, the data assigned to every page is the result of merging the data directly assigned to the page (like the front matter) with the data of the parent folders (stored in the _data
files and folders).
├── _data.yaml
├── ...
└── documents
└── _data.json
└── ...
└── examples
└── _data.json
└── my-page.md
In this example the /documents/examples/my-page.md
file contains all data from the page front matter, merged with the data from /documents/examples/_data.json
, documents/_data.json
and /_data.yaml
files, in this order of priority.
Object mode merging
On merging variables, the complete value is overridden. But you may want to merge some values in a different way. For example, let's say we have the following two data files, one in the root and the other in a subfolder. Both files have a site
variable with different values:
site:
title: My humble site
author: Oscar Otero
site:
author: Laura Rubio
All pages in the subfolder (and sub-subfolders) will have the latest version of the variable that has the author
subkey but missing the title
value, because the whole variable is overridden. You can change this behaviour using the special value mergedKeys
. This value indicates to Lume how to merge some keys:
mergedKeys:
site: object
site:
title: My humble site
author: Oscar Otero
site:
author: Laura Rubio
In this example, we are indicating to Lume that the variable site
must be merged using the object
mode. Now, the result of the variable site
is an object including the properties of the parent variable and only overrides the properties with the same name. So the result will be something like this:
site:
title: My humble site
author: Laura Rubio
The object
merge mode is not recursive; it only works with the first-level properties. A recursive option may be added in the future.
Note
The mergedKeys
variable is also merged with other mergedKeys
variables in subfolders and pages and using always the object
mode. This means that you can define this variable in the root _data
file of the site and override it in specific subfolders.
array mode
There's another merge mode for arrays. In this mode, the merge result is an array with all values found in all _data
levels. For example:
mergedKeys:
category: array
category:
- programming
- deno
- javascript
category: typescript
The result of this merge is:
category:
- programming
- deno
- javascript
- typescript
It's an array with all values present in all parent _data
contexts. The result includes only unique values: if the same value is repeated in different _data
contexts, it's included only once in the result.
stringArray mode
There's a special case in which you want to make sure that all values of the array are strings. Let's see the following example:
mergedKeys:
category: array
category:
- errors
- 404
category: "404"
The result of this merge is:
category:
- errors
- 404
- "404"
As you can see, the value 404
is duplicated, once as a number and again as a string. To prevent this behavior, you may want to convert all values to strings to remove duplicates. Instead of array
, use the stringArray
mode:
mergedKeys:
category: stringArray
Now, the result of this merge is:
category:
- errors
- "404"
Note
For backward compatibility, Lume assigns the stringArray
merge mode to the key tags
automatically.
As of Lume 1.19, it's possible to configure the merged keys strategy from the _config.ts
file:
//_config.ts
site.mergeKey("category", "stringArray");