mirror of https://github.com/Budibase/budibase.git
5 changed files with 91 additions and 2 deletions
@ -0,0 +1,76 @@ |
|||
const dayjs = require("dayjs") |
|||
|
|||
/** |
|||
* This file was largely taken from the helper-date package - we did this for two reasons: |
|||
* 1. It made use of both moment of date.js - this caused some weird bugs with some relatively simple |
|||
* syntax and didn't offer much in return. |
|||
* 2. Replacing moment with dayjs helps massively reduce bundle size. |
|||
* The original package can be found here: |
|||
* https://github.com/helpers/helper-date
|
|||
*/ |
|||
|
|||
function isOptions(val) { |
|||
return typeof(val) === "object" && typeof(val.hash) === "object" |
|||
} |
|||
|
|||
function isApp(thisArg) { |
|||
return typeof(thisArg) === "object" |
|||
&& typeof(thisArg.options) === "object" |
|||
&& typeof(thisArg.app) === "object" |
|||
} |
|||
|
|||
function getContext(thisArg, locals, options) { |
|||
if (isOptions(thisArg)) { |
|||
return getContext({}, locals, thisArg) |
|||
} |
|||
// ensure args are in the correct order
|
|||
if (isOptions(locals)) { |
|||
return getContext(thisArg, options, locals) |
|||
} |
|||
const appContext = isApp(thisArg) ? thisArg.context : {} |
|||
options = options || {} |
|||
|
|||
// if "options" is not handlebars options, merge it onto locals
|
|||
if (!isOptions(options)) { |
|||
locals = Object.assign({}, locals, options) |
|||
} |
|||
// merge handlebars root data onto locals if specified on the hash
|
|||
if (isOptions(options) && options.hash.root === true) { |
|||
locals = Object.assign({}, options.data.root, locals) |
|||
} |
|||
let context = Object.assign({}, appContext, locals, options.hash) |
|||
if (!isApp(thisArg)) { |
|||
context = Object.assign({}, thisArg, context) |
|||
} |
|||
if (isApp(thisArg) && thisArg.view && thisArg.view.data) { |
|||
context = Object.assign({}, context, thisArg.view.data) |
|||
} |
|||
return context |
|||
} |
|||
|
|||
module.exports = function dateHelper(str, pattern, options) { |
|||
if (isOptions(pattern)) { |
|||
options = pattern |
|||
pattern = null |
|||
} |
|||
|
|||
if (isOptions(str)) { |
|||
options = str |
|||
pattern = null |
|||
str = null |
|||
} |
|||
|
|||
// if no args are passed, return a formatted date
|
|||
if (str == null && pattern == null) { |
|||
dayjs.locale("en") |
|||
return dayjs().format("MMMM DD, YYYY") |
|||
} |
|||
|
|||
const defaults = {lang: "en", date: new Date(str)} |
|||
const opts = getContext(this, defaults, options) |
|||
|
|||
// set the language to use
|
|||
dayjs.locale(opts.lang || opts.language) |
|||
|
|||
return dayjs(new Date(str)).format(pattern) |
|||
} |
|||
Loading…
Reference in new issue