UNPKG

@christianwiedemann/drupal-twig-extensions

Version:

JavaScript implementation of Drupal’s Twig extensions

88 lines (87 loc) 2.45 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.callable = callable; exports.default = void 0; var _isPlainObject = require("is-plain-object"); var _twing = require("../../helpers/twing.cjs"); var _definition = require("./definition.cjs"); function isTraversable(value) { if ((0, _isPlainObject.isPlainObject)(value)) { return true; } if (value !== null && value !== undefined) { if (typeof value === 'string') { return false; } if (typeof value['entries'] === 'function') { return true; } if (typeof value[Symbol.iterator] === 'function' || typeof value['next'] === 'function') { return true; } } return false; } function iteratorToArray(value) { if (Array.isArray(value)) { return value; } else { let result = []; if (value.entries) { for (let entry of value.entries()) { result.push(entry[1]); } } else if (typeof value[Symbol.iterator] === 'function') { for (let entry of value) { result.push(entry); } } else if (typeof value['next'] === 'function') { let next; while ((next = value.next()) && !next.done) { result.push(next.value); } } else { for (let k in value) { result.push(value[k]); } } return result; } } const joinSynchronously = (value, glue, and) => { if (value == null) { return ''; } if (glue == null) { glue = ''; } if (isTraversable(value)) { value = iteratorToArray(value); // this is ugly, but we have to ensure that each element of the array is rendered as PHP would render it const safeValue = value.map(item => { if (typeof item === 'boolean') { return item === true ? '1' : ''; } if (Array.isArray(item)) { return 'Array'; } return item; }); if (and == null || and === glue) { return safeValue.join(glue); } if (safeValue.length === 1) { return safeValue[0]; } return safeValue.slice(0, -1).join(glue) + and + safeValue[safeValue.length - 1]; } return ''; }; function callable(value, glue) { const newValue = typeof value === 'object' && !isTraversable(value) ? Object.values(value) : value; return joinSynchronously(newValue, glue); } var _default = (0, _twing.newTwingFilter)(_definition.name, callable, _definition.options, _definition.acceptedArguments); exports.default = _default;