UNPKG

@miyagi/core

Version:

miyagi is a component development tool for JavaScript template engines.

172 lines (151 loc) 5.15 kB
const resolveData = require("./resolve"); const config = require("../config.json"); const { cloneDeep } = require("../helpers"); const { extendTemplateData } = require("../render/helpers"); const helpers = require("../helpers"); module.exports = { getComponentData: async function getComponentData(app, file) { const templateFilePath = helpers.getFullPathFromShortPath(app, file); const componentJson = helpers.cloneDeep( app.get("state").fileContents[ helpers.getDataPathFromTemplatePath(app, templateFilePath) ] ); const hasTemplate = Object.values(app.get("state").partials).includes( templateFilePath ); let context = []; if (componentJson) { let componentData = helpers.removeInternalKeys(componentJson); const rootData = cloneDeep(componentData); const componentVariations = componentJson.$variants; let data; if (Object.keys(componentData).length > 0) { data = await resolveData(app, componentData); } else { data = { merged: componentData, resolved: componentData, }; } if (componentVariations) { const promises = []; let startIndex = context.length; for (const [index, variationJson] of componentVariations.entries()) { if (variationJson.$name) { promises.push( new Promise((resolve) => { const variationData = helpers.removeInternalKeys(variationJson); resolveData(app, variationData, rootData).then( async ({ merged, resolved }) => { const extendedData = hasTemplate ? await extendTemplateData( app.get("config"), resolved, file ) : {}; context[startIndex + index] = { component: file, data: extendedData, rawData: merged, name: variationJson.$name, }; resolve(); } ); }) ); } } return await Promise.all(promises).then(async () => { if (Object.keys(data.resolved).length > 0) { const extendedComponentData = await extendTemplateData( app.get("config"), data.resolved, file ); if (!componentJson.$hidden) { context.unshift({ component: file, data: extendedComponentData, rawData: data.merged, name: componentJson.$name || config.defaultVariationName, }); } } return context.filter((entry) => entry !== null); }); } else { if (Object.keys(componentData).length > 0) { const { merged, resolved } = await resolveData(app, componentData); const extendedComponentData = await extendTemplateData( app.get("config"), resolved, file ); context.unshift({ component: file, data: componentJson.$hidden ? {} : extendedComponentData, rawData: componentJson.$hidden ? {} : merged, name: componentJson.$name || config.defaultVariationName, }); } return context; } } return context; }, getVariationData: async function getVariationData(app, file, variation) { const fullFilePath = helpers.getFullPathFromShortPath(app, file); const componentJson = helpers.cloneDeep( app.get("state").fileContents[ helpers.getDataPathFromTemplatePath(app, fullFilePath) ] || {} ); const componentVariations = componentJson.$variants; let componentRootData = helpers.removeInternalKeys(componentJson); let componentData; if (componentJson.$hidden) { if (!variation) { return { raw: null, extended: null, }; } if (variation === "default") { if (componentVariations) { const componentVariationsIncludesDefault = Boolean( componentVariations.find((variant) => variant.$name === "default") ); if (!componentVariationsIncludesDefault) { return { raw: null, extended: null, }; } } } } if (componentVariations && variation) { let variationJson = componentVariations.find((vari) => { return ( helpers.normalizeString(vari.$name) === helpers.normalizeString(variation) ); }); if (variationJson) { componentData = helpers.removeInternalKeys(variationJson); } } const { merged, resolved } = await resolveData( app, componentData, componentRootData ); return { raw: merged, extended: await extendTemplateData(app.get("config"), resolved, file), }; }, };