strip unused exports from config
This commit is contained in:
parent
69313d6c4f
commit
55be1e15e4
4 changed files with 15 additions and 154 deletions
|
|
@ -1,26 +0,0 @@
|
||||||
const path = require('path');
|
|
||||||
|
|
||||||
const dir = {
|
|
||||||
input: 'src/',
|
|
||||||
output: 'dist',
|
|
||||||
includes: '_includes',
|
|
||||||
layouts: '_layouts',
|
|
||||||
data: '_data',
|
|
||||||
assets: 'assets'
|
|
||||||
};
|
|
||||||
|
|
||||||
const imagePaths = {
|
|
||||||
source: path.join(dir.input, dir.assets, 'images'),
|
|
||||||
output: path.join(dir.output, dir.assets, 'images')
|
|
||||||
};
|
|
||||||
|
|
||||||
const scriptDirs = {
|
|
||||||
source: path.join(dir.input, dir.assets, 'scripts'),
|
|
||||||
output: path.join(dir.output, dir.assets, 'scripts')
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
dir,
|
|
||||||
imagePaths,
|
|
||||||
scriptDirs
|
|
||||||
};
|
|
||||||
|
|
@ -14,50 +14,15 @@ const limit = (array, limit) => {
|
||||||
return array.slice(0, limit);
|
return array.slice(0, limit);
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Sorts the given array of objects by a string denoting chained key paths. */
|
|
||||||
const sortByKey = (arrayOfObjects, keyPath, order = 'ASC') => {
|
|
||||||
const sorted = lodash.sortBy(arrayOfObjects, object => lodash.get(object, keyPath));
|
|
||||||
if (order === 'ASC') return sorted;
|
|
||||||
if (order === 'DESC') return sorted.reverse();
|
|
||||||
throw new Error(`Invalid sort order: ${order}`);
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Returns all entries from the given array that match the specified key:value pair. */
|
/** Returns all entries from the given array that match the specified key:value pair. */
|
||||||
const where = (arrayOfObjects, keyPath, value) =>
|
const where = (arrayOfObjects, keyPath, value) =>
|
||||||
arrayOfObjects.filter(object => lodash.get(object, keyPath) === value);
|
arrayOfObjects.filter(object => lodash.get(object, keyPath) === value);
|
||||||
|
|
||||||
/** Returns the word count of the given string. */
|
|
||||||
const wordCount = str => {
|
|
||||||
throwIfNotType(str, 'string');
|
|
||||||
const matches = str.match(/[\w\d’'-]+/gi);
|
|
||||||
return matches?.length ?? 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Converts the given markdown string to HTML, returning it as a string. */
|
/** Converts the given markdown string to HTML, returning it as a string. */
|
||||||
const toHtml = markdownString => {
|
const toHtml = markdownString => {
|
||||||
return markdownLib.renderInline(markdownString);
|
return markdownLib.renderInline(markdownString);
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Divides the first argument by the second. */
|
|
||||||
const dividedBy = (numerator, denominator) => {
|
|
||||||
if (denominator === 0) {
|
|
||||||
throw new Error(`Cannot divide by zero: ${numerator} / ${denominator}`);
|
|
||||||
}
|
|
||||||
return numerator / denominator;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Replaces every newline with a line break. */
|
|
||||||
const newlineToBr = str => {
|
|
||||||
throwIfNotType(str, 'string');
|
|
||||||
return str.replace(/\n/g, '<br>');
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Removes every newline from the given string. */
|
|
||||||
const stripNewlines = str => {
|
|
||||||
throwIfNotType(str, 'string');
|
|
||||||
return str.replace(/\n/g, '');
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Removes all tags from an HTML string. */
|
/** Removes all tags from an HTML string. */
|
||||||
const stripHtml = str => {
|
const stripHtml = str => {
|
||||||
throwIfNotType(str, 'string');
|
throwIfNotType(str, 'string');
|
||||||
|
|
@ -81,28 +46,6 @@ const toISOString = dateString => dayjs(dateString).toISOString();
|
||||||
/** Formats a date using dayjs's conventions: https://day.js.org/docs/en/display/format */
|
/** Formats a date using dayjs's conventions: https://day.js.org/docs/en/display/format */
|
||||||
const formatDate = (date, format) => dayjs(date).format(format);
|
const formatDate = (date, format) => dayjs(date).format(format);
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {*} collection - an array of collection items that are assumed to have either data.lastUpdated or a date property
|
|
||||||
* @returns the most recent date of update or publication among the given collection items, or undefined if the array is empty.
|
|
||||||
*/
|
|
||||||
const getLatestCollectionItemDate = collection => {
|
|
||||||
const itemsSortedByLatestDate = collection
|
|
||||||
.filter(item => !!item.data?.lastUpdated || !!item.date)
|
|
||||||
.sort((item1, item2) => {
|
|
||||||
const date1 = item1.data?.lastUpdated ?? item1.date;
|
|
||||||
const date2 = item2.data?.lastUpdated ?? item2.date;
|
|
||||||
if (dayjs(date1).isAfter(date2)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (dayjs(date2).isAfter(date1)) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
});
|
|
||||||
const latestItem = itemsSortedByLatestDate[0];
|
|
||||||
return latestItem?.data?.lastUpdated ?? latestItem?.date;
|
|
||||||
};
|
|
||||||
|
|
||||||
const minifyCss = code => new CleanCSS({}).minify(code).styles;
|
const minifyCss = code => new CleanCSS({}).minify(code).styles;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -135,18 +78,12 @@ const mdInline = (content, opts) => {
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
limit,
|
limit,
|
||||||
sortByKey,
|
|
||||||
where,
|
|
||||||
wordCount,
|
|
||||||
toHtml,
|
toHtml,
|
||||||
|
where,
|
||||||
toISOString,
|
toISOString,
|
||||||
formatDate,
|
formatDate,
|
||||||
dividedBy,
|
|
||||||
newlineToBr,
|
|
||||||
stripNewlines,
|
|
||||||
stripHtml,
|
|
||||||
toAbsoluteUrl,
|
toAbsoluteUrl,
|
||||||
getLatestCollectionItemDate,
|
stripHtml,
|
||||||
minifyCss,
|
minifyCss,
|
||||||
mdInline
|
mdInline
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,74 +1,24 @@
|
||||||
const sanitize = require('sanitize-html');
|
|
||||||
const slugify = require('slugify');
|
const slugify = require('slugify');
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns an array of all unique values from the given collection under the specified key.
|
|
||||||
* Credit: https://www.webstoemp.com/blog/basic-custom-taxonomies-with-eleventy/.
|
|
||||||
* @param {*} collectionItems - an array of collection items to map to their unique values under a key
|
|
||||||
* @param {*} key - the key to look up in the item's data object
|
|
||||||
* @returns
|
|
||||||
*/
|
|
||||||
const getAllUniqueKeyValues = (collectionItems, key) => {
|
|
||||||
// First map each collection item (e.g., blog post) to the value it holds under key.
|
|
||||||
let values = collectionItems.map(item => item.data[key] ?? []);
|
|
||||||
// Recursively flatten it to a 1D array
|
|
||||||
values = values.flat();
|
|
||||||
// Remove duplicates
|
|
||||||
values = [...new Set(values)];
|
|
||||||
// Sort alphabetically
|
|
||||||
values = values.sort((key1, key2) =>
|
|
||||||
key1.localeCompare(key2, 'en', {sensitivity: 'base'})
|
|
||||||
);
|
|
||||||
return values;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Converts the given string to a slug form. */
|
/** Converts the given string to a slug form. */
|
||||||
const slugifyString = str => {
|
const slugifyString = str => {
|
||||||
return slugify(str, {
|
return slugify(str, {
|
||||||
replacement: '-',
|
replacement: '-',
|
||||||
remove: /[#,&,+()$~%.'":*?<>{}]/g,
|
remove: /[#,&,+()$~%.'":*?<>{}]/g,
|
||||||
lower: true
|
lower: true
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Helper to throw an error if the provided argument is not of the expected. */
|
/** Helper to throw an error if the provided argument is not of the expected. */
|
||||||
const throwIfNotType = (arg, expectedType) => {
|
const throwIfNotType = (arg, expectedType) => {
|
||||||
if (typeof arg !== expectedType) {
|
if (typeof arg !== expectedType) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Expected argument of type ${expectedType} but instead got ${arg} (${typeof arg})`
|
`Expected argument of type ${expectedType} but instead got ${arg} (${typeof arg})`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
/** Maps a config of attribute-value pairs to an HTML string representing those same attribute-value pairs.
|
|
||||||
* There's also this, but it's ESM only: https://github.com/sindresorhus/stringify-attributes
|
|
||||||
*/
|
|
||||||
const stringifyAttributes = attributeMap => {
|
|
||||||
return Object.entries(attributeMap)
|
|
||||||
.map(([attribute, value]) => `${attribute}="${value}"`)
|
|
||||||
.join(' ');
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Sanitizes an HTML string. */
|
|
||||||
const sanitizeHtml = html => {
|
|
||||||
return sanitize(html, {
|
|
||||||
allowedAttributes: {
|
|
||||||
...sanitize.defaults.allowedAttributes,
|
|
||||||
// Syntax highlighting
|
|
||||||
pre: ['class'],
|
|
||||||
code: ['class'],
|
|
||||||
span: ['class'],
|
|
||||||
// Styled lists
|
|
||||||
ol: ['class'],
|
|
||||||
ul: ['class']
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
getAllUniqueKeyValues,
|
slugifyString,
|
||||||
slugifyString,
|
throwIfNotType
|
||||||
throwIfNotType,
|
|
||||||
stringifyAttributes,
|
|
||||||
sanitizeHtml
|
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "eleventy-excellent",
|
"name": "eleventy-excellent",
|
||||||
"version": "1.1.5",
|
"version": "1.1.6",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=16.x.x"
|
"node": ">=16.x.x"
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue