Skip to content

Commit 6e61e96

Browse files
committed
Adds 'strategy' option to allow overwriting existing values
1 parent 766cb13 commit 6e61e96

5 files changed

Lines changed: 35 additions & 5 deletions

File tree

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ A Metalsmith plugin for setting default values to file metadata.
1111
## Features
1212

1313
- sets default values for metadata keys and file contents on files matched by pattern
14-
- does not overwrite or transform key values that are already defined
14+
- does not overwrite or transform key values that are already defined, unless `strategy: 'overwrite'`.
1515
- can set computed defaults based on other metadata
1616

1717
## Installation
@@ -83,6 +83,7 @@ metalsmith.use(
8383

8484
- `pattern` (`string|string[]`): One or more glob patterns to match file paths. Defaults to `'**'` (all).
8585
- `defaults` (`Object<string, any>`): An object whose key-value pairs will be added to file metadata. You can also specify a function `callback(file)` to set dynamic defaults based on other, existing file metadata.
86+
- `strategy` (`'keep'|'overwrite'`): Strategy to handle setting defaults to keys that are aleady defined.
8687

8788
### Examples
8889

lib/index.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ export interface DefaultsSet {
99
defaults: {
1010
[key:string]: string;
1111
}
12+
/** Strategy to handle setting defaults to keys that are aleady defined. */
13+
strategy: 'keep'|'overwrite'
1214
}
1315
export type Options = DefaultsSet|DefaultsSet[]
1416
/**

src/index.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ import set_defaults from './set_defaults.js'
44
* @typedef {Object} DefaultsSet
55
* @property {string|string[]} [pattern="**"] 1 or more glob patterns to match files. Defaults to `'**'` (all).
66
* @property {Object} [defaults={}] an object whose keys will be set as file metadata keys
7+
* @property {'keep'|'overwrite'} strategy Strategy to handle setting defaults to keys that are aleady defined.
78
*/
89

910
/** @type {DefaultsSet} */
1011
const defaultDefaultsSet = {
1112
defaults: {},
13+
strategy: 'keep',
1214
pattern: '**'
1315
}
1416

@@ -41,12 +43,12 @@ function defaultValues(options) {
4143
const defaultSets = (options || []).map((defaultsSet) => Object.assign({}, defaultDefaultsSet, defaultsSet))
4244

4345
// Loop through configurations
44-
defaultSets.forEach(function ({ pattern, defaults }) {
46+
defaultSets.forEach(function ({ pattern, defaults, strategy }) {
4547
const matches = metalsmith.match(pattern, Object.keys(files))
4648
debug.info('Matched %s files to pattern "%s": %o', matches.length, pattern, matches)
4749
if (matches.length) {
4850
matches.forEach((file) => {
49-
set_defaults(defaults)(files[file])
51+
set_defaults(defaults, strategy)(files[file])
5052
debug.info(
5153
'Defaults set for file "%s", the resulting metadata is: %O',
5254
file,

src/set_defaults.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,19 @@ import set from 'lodash.set'
44
/**
55
* Sets defaults for object values
66
* @param {Object<string, *>} defaults
7+
* @param {'keep'|'overwrite'} strategy
78
* @return {function} Takes an object and sets defaults
89
*/
9-
function set_defaults(defaults) {
10+
function set_defaults(defaults, strategy) {
1011
return (item) => {
1112
Object.keys(defaults).forEach((key) => {
1213
const value = get(item, key)
13-
if (value === void 0 || value === null || (key === 'contents' && item.contents.toString().trim().length === 0)) {
14+
if (
15+
strategy === 'overwrite' ||
16+
value === void 0 ||
17+
value === null ||
18+
(key === 'contents' && item.contents.toString().trim().length === 0)
19+
) {
1420
let default_value = defaults[key]
1521
if (typeof defaults[key] === 'function') default_value = default_value(item)
1622
set(item, key, default_value)

test/index.cjs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,5 +226,24 @@ describe('@metalsmith/default-values', function () {
226226

227227
assert.deepStrictEqual(actual, expected)
228228
})
229+
230+
231+
it('overwrites a key when strategy is "overwrite"', function () {
232+
const defaults = {
233+
initial: 'no',
234+
default_val: true
235+
}
236+
const set_defaults = set_defaults_lib(defaults, 'overwrite')
237+
assert.strictEqual(typeof set_defaults, 'function', 'Function returned after initialisation')
238+
const actual = set_defaults({
239+
initial: 'yes'
240+
})
241+
const expected = {
242+
initial: 'no',
243+
default_val: true
244+
}
245+
246+
assert.deepStrictEqual(actual, expected)
247+
})
229248
})
230249
})

0 commit comments

Comments
 (0)