From d50ec14a87c870329a0a56428016f47c8d820cfd Mon Sep 17 00:00:00 2001 From: Avi Goldman Date: Thu, 30 Nov 2017 14:49:55 -0800 Subject: [PATCH 1/6] moved the $node render process into a new function --- packages/heml-render/src/index.js | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/heml-render/src/index.js b/packages/heml-render/src/index.js index a188862..488ca1f 100644 --- a/packages/heml-render/src/index.js +++ b/packages/heml-render/src/index.js @@ -56,7 +56,6 @@ async function postRenderElements (elements, globals) { */ async function renderElements (elements, globals) { const { $ } = globals - const elementMap = keyBy(elements, 'tagName') const metaTagNames = filter(elements, { parent: [ 'head' ] }).map(({ tagName }) => tagName) const nonMetaTagNames = difference(elements.map(({ tagName }) => tagName), metaTagNames) @@ -65,8 +64,25 @@ async function renderElements (elements, globals) { ...$.findNodes(nonMetaTagNames).reverse() /** Render the elements last to first/outside to inside */ ] + renderNodes($nodes, globals) +} + + +/** + * renders the given element $nodes + * @param {Array[Cheerio]} $nodes + * @param {Object} globals { $, elements } + */ +function renderNodes($nodes, globals) { + const { elements } = globals + const elementMap = keyBy(elements, 'tagName') + for (let $node of $nodes) { - const element = elementMap[$node.prop('tagName').toLowerCase()] + const tagName = $node.prop('tagName').toLowerCase() + + if (!elementMap[tagName]) { return } + + const element = elementMap[tagName] const contents = $node.html() const attrs = $node[0].attribs From ddde8bd66186c3711134b8c90ebe75eeb1daefcd Mon Sep 17 00:00:00 2001 From: Avi Goldman Date: Thu, 30 Nov 2017 17:24:36 -0800 Subject: [PATCH 2/6] moved the single render into its own function --- packages/heml-render/src/index.js | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/packages/heml-render/src/index.js b/packages/heml-render/src/index.js index 488ca1f..213a85b 100644 --- a/packages/heml-render/src/index.js +++ b/packages/heml-render/src/index.js @@ -67,9 +67,8 @@ async function renderElements (elements, globals) { renderNodes($nodes, globals) } - /** - * renders the given element $nodes + * renders the given array of $nodes * @param {Array[Cheerio]} $nodes * @param {Object} globals { $, elements } */ @@ -80,14 +79,25 @@ function renderNodes($nodes, globals) { for (let $node of $nodes) { const tagName = $node.prop('tagName').toLowerCase() - if (!elementMap[tagName]) { return } + if (!elementMap[tagName]) { continue } const element = elementMap[tagName] - const contents = $node.html() - const attrs = $node[0].attribs - - const renderedValue = await Promise.resolve(renderElement(element, attrs, contents)) - $node.replaceWith(renderedValue.trim()) + renderNode($node, element) } } + + +/** + * renders a single $node of the given element + * @param {Cheerio} $node + * @param {Object} element + */ +function renderNode($node, element) { + const contents = $node.html() + const attrs = $node[0].attribs + + const renderedValue = await Promise.resolve(renderElement(element, attrs, contents)) + + $node.replaceWith(renderedValue.trim()) +} From 42a972b7e58e37956ebe5702a07ae8a71d123908 Mon Sep 17 00:00:00 2001 From: Avi Goldman Date: Thu, 30 Nov 2017 22:22:54 -0800 Subject: [PATCH 3/6] broke out meta and generic into 2 parts --- packages/heml-render/src/index.js | 36 ++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/packages/heml-render/src/index.js b/packages/heml-render/src/index.js index 213a85b..d1cdce1 100644 --- a/packages/heml-render/src/index.js +++ b/packages/heml-render/src/index.js @@ -18,6 +18,7 @@ export default async function render ($, options = {}) { const Meta = first(elements.filter(({ tagName }) => tagName === 'meta')) await preRenderElements(elements, globals) + await renderMetaElements(elements, globals) await renderElements(elements, globals) await postRenderElements(elements, globals) @@ -49,22 +50,33 @@ async function postRenderElements (elements, globals) { } /** - * Renders all HEML elements + * Renders meta HEML elements * @param {Array} elements List of element definitons * @param {Object} globals * @return {Promise} */ -async function renderElements (elements, globals) { +async function renderMetaElements (elements, globals) { const { $ } = globals - const metaTagNames = filter(elements, { parent: [ 'head' ] }).map(({ tagName }) => tagName) - const nonMetaTagNames = difference(elements.map(({ tagName }) => tagName), metaTagNames) + const metaTagNames = filter(elements, ({ meta }) => !!meta).map(({ tagName }) => tagName) + + /** Render the meta elements first to last */ + const $nodes = $.findNodes(metaTagNames) + await renderNodes($nodes, globals) +} - const $nodes = [ - ...$.findNodes(metaTagNames), /** Render the meta elements first to last */ - ...$.findNodes(nonMetaTagNames).reverse() /** Render the elements last to first/outside to inside */ - ] +/** + * Renders HEML elements + * @param {Array} elements List of element definitons + * @param {Object} globals + * @return {Promise} + */ +async function renderElements (elements, globals) { + const { $ } = globals + const nonMetaTagNames = filter(elements, ({ meta }) => !meta).map(({ tagName }) => tagName) - renderNodes($nodes, globals) + /** Render the elements last to first/outside to inside */ + const $nodes = $.findNodes(nonMetaTagNames).reverse() + await renderNodes($nodes, globals) } /** @@ -72,7 +84,7 @@ async function renderElements (elements, globals) { * @param {Array[Cheerio]} $nodes * @param {Object} globals { $, elements } */ -function renderNodes($nodes, globals) { +async function renderNodes($nodes, globals) { const { elements } = globals const elementMap = keyBy(elements, 'tagName') @@ -83,7 +95,7 @@ function renderNodes($nodes, globals) { const element = elementMap[tagName] - renderNode($node, element) + await renderNode($node, element) } } @@ -93,7 +105,7 @@ function renderNodes($nodes, globals) { * @param {Cheerio} $node * @param {Object} element */ -function renderNode($node, element) { +async function renderNode($node, element) { const contents = $node.html() const attrs = $node[0].attribs From a9fcec389ad28f86c68a6ae647f494a58e6bdad4 Mon Sep 17 00:00:00 2001 From: Avi Goldman Date: Thu, 30 Nov 2017 22:24:18 -0800 Subject: [PATCH 4/6] added create meta element function --- packages/heml-utils/src/createMetaElement.js | 18 ++++++++++++++++++ packages/heml-utils/src/index.js | 3 ++- 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 packages/heml-utils/src/createMetaElement.js diff --git a/packages/heml-utils/src/createMetaElement.js b/packages/heml-utils/src/createMetaElement.js new file mode 100644 index 0000000..fb21d3b --- /dev/null +++ b/packages/heml-utils/src/createMetaElement.js @@ -0,0 +1,18 @@ +import { defaults, isFunction } from 'lodash' +import createElement from './createElement' + +export default function (name, element) { + if (!name || name.trim().length === 0) { + throw new Error(`When creating an element, you must set the name. ${name.trim().length === 0 ? 'An empty string' : `"${name}"`} was given.`) + } + + if (isFunction(element)) { + element = { render: element } + } + + element.meta = true + + return createElement(name, element) +} + + diff --git a/packages/heml-utils/src/index.js b/packages/heml-utils/src/index.js index 77ebeed..ed45de2 100644 --- a/packages/heml-utils/src/index.js +++ b/packages/heml-utils/src/index.js @@ -1,8 +1,9 @@ import { renderElement } from '@heml/render' import cssGroups from 'css-groups' import createElement from './createElement' +import createMetaElement from './createMetaElement' import HEMLError from './HEMLError' import transforms from './transforms' import condition from './condition' -module.exports = { createElement, renderElement, HEMLError, cssGroups, transforms, condition } +module.exports = { createElement, createMetaElement, renderElement, HEMLError, cssGroups, transforms, condition } From 40a0bb5101ffc17afcf1a9437f3f70261ed952d8 Mon Sep 17 00:00:00 2001 From: Avi Goldman Date: Thu, 30 Nov 2017 22:32:48 -0800 Subject: [PATCH 5/6] =?UTF-8?q?linting=20=F0=9F=92=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/heml-render/src/index.js | 7 +++---- packages/heml-utils/src/createMetaElement.js | 4 +--- packages/heml/src/bin/heml.js | 2 +- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/packages/heml-render/src/index.js b/packages/heml-render/src/index.js index d1cdce1..a202315 100644 --- a/packages/heml-render/src/index.js +++ b/packages/heml-render/src/index.js @@ -1,4 +1,4 @@ -import { filter, difference, keyBy, first } from 'lodash' +import { filter, keyBy, first } from 'lodash' import renderElement from './renderElement' export { renderElement } @@ -84,7 +84,7 @@ async function renderElements (elements, globals) { * @param {Array[Cheerio]} $nodes * @param {Object} globals { $, elements } */ -async function renderNodes($nodes, globals) { +async function renderNodes ($nodes, globals) { const { elements } = globals const elementMap = keyBy(elements, 'tagName') @@ -99,13 +99,12 @@ async function renderNodes($nodes, globals) { } } - /** * renders a single $node of the given element * @param {Cheerio} $node * @param {Object} element */ -async function renderNode($node, element) { +async function renderNode ($node, element) { const contents = $node.html() const attrs = $node[0].attribs diff --git a/packages/heml-utils/src/createMetaElement.js b/packages/heml-utils/src/createMetaElement.js index fb21d3b..aea1b9f 100644 --- a/packages/heml-utils/src/createMetaElement.js +++ b/packages/heml-utils/src/createMetaElement.js @@ -1,4 +1,4 @@ -import { defaults, isFunction } from 'lodash' +import { isFunction } from 'lodash' import createElement from './createElement' export default function (name, element) { @@ -14,5 +14,3 @@ export default function (name, element) { return createElement(name, element) } - - diff --git a/packages/heml/src/bin/heml.js b/packages/heml/src/bin/heml.js index 62769f2..8c36fb3 100755 --- a/packages/heml/src/bin/heml.js +++ b/packages/heml/src/bin/heml.js @@ -27,7 +27,7 @@ cli .option('-v, --validate [level]', 'Sets the validation level', /^(none|soft|strict)$/i, 'soft') .action(build) -if (args.length === 0 || !commands.includes(first(args)) && !first(args).startsWith('-')) { +if (args.length === 0 || (!commands.includes(first(args)) && !first(args).startsWith('-'))) { cli.outputHelp() } From aab37d368c4e04cdb14fa3b23c5d0abd4134e78e Mon Sep 17 00:00:00 2001 From: Avi Goldman Date: Thu, 30 Nov 2017 22:40:19 -0800 Subject: [PATCH 6/6] use new createMetaElement function --- packages/heml-elements/src/Base.js | 4 ++-- packages/heml-elements/src/Meta.js | 4 ++-- packages/heml-elements/src/Preview.js | 4 ++-- packages/heml-elements/src/Style.js | 4 ++-- packages/heml-elements/src/Subject.js | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/heml-elements/src/Base.js b/packages/heml-elements/src/Base.js index 31fa3cb..6d89122 100644 --- a/packages/heml-elements/src/Base.js +++ b/packages/heml-elements/src/Base.js @@ -1,10 +1,10 @@ -import HEML, { createElement } from '@heml/utils' // eslint-disable-line no-unused-vars +import HEML, { createMetaElement } from '@heml/utils' // eslint-disable-line no-unused-vars import Meta from './Meta' import isAbsoluteUrl from 'is-absolute-url' import { resolve } from 'url' import { has, first } from 'lodash' -export default createElement('base', { +export default createMetaElement('base', { parent: [ 'head' ], children: false, unique: true, diff --git a/packages/heml-elements/src/Meta.js b/packages/heml-elements/src/Meta.js index 7c6db5b..634f475 100644 --- a/packages/heml-elements/src/Meta.js +++ b/packages/heml-elements/src/Meta.js @@ -1,8 +1,8 @@ -import HEML, { createElement } from '@heml/utils' // eslint-disable-line no-unused-vars +import HEML, { createMetaElement } from '@heml/utils' // eslint-disable-line no-unused-vars let metaMap -export default createElement('meta', { +export default createMetaElement('meta', { attrs: true, parent: [ 'head' ], diff --git a/packages/heml-elements/src/Preview.js b/packages/heml-elements/src/Preview.js index 8a49b99..3824084 100644 --- a/packages/heml-elements/src/Preview.js +++ b/packages/heml-elements/src/Preview.js @@ -1,7 +1,7 @@ -import HEML, { createElement } from '@heml/utils' // eslint-disable-line no-unused-vars +import HEML, { createMetaElement } from '@heml/utils' // eslint-disable-line no-unused-vars import Meta from './Meta' -export default createElement('preview', { +export default createMetaElement('preview', { parent: [ 'head' ], unique: true, diff --git a/packages/heml-elements/src/Style.js b/packages/heml-elements/src/Style.js index 37ae8aa..439b474 100644 --- a/packages/heml-elements/src/Style.js +++ b/packages/heml-elements/src/Style.js @@ -1,4 +1,4 @@ -import HEML, { createElement } from '@heml/utils' // eslint-disable-line no-unused-vars +import HEML, { createMetaElement } from '@heml/utils' // eslint-disable-line no-unused-vars import hemlstyles from '@heml/styles' import { castArray, isEqual, uniqWith, sortBy } from 'lodash' @@ -8,7 +8,7 @@ const START_INLINE_CSS = `/*!***START:INLINE_CSS*****/` let styleMap let options -export default createElement('style', { +export default createMetaElement('style', { parent: [ 'head' ], attrs: [ 'for', 'heml-embed' ], defaultAttrs: { diff --git a/packages/heml-elements/src/Subject.js b/packages/heml-elements/src/Subject.js index 081eb9e..3b7e1ee 100644 --- a/packages/heml-elements/src/Subject.js +++ b/packages/heml-elements/src/Subject.js @@ -1,7 +1,7 @@ -import HEML, { createElement } from '@heml/utils' // eslint-disable-line no-unused-vars +import HEML, { createMetaElement } from '@heml/utils' // eslint-disable-line no-unused-vars import Meta from './Meta' -export default createElement('subject', { +export default createMetaElement('subject', { parent: [ 'head' ], unique: true,