From e64c6f42e668effb43aa771214e293b214bf00c2 Mon Sep 17 00:00:00 2001 From: Alex Parlato Date: Fri, 2 Dec 2022 10:33:15 -0500 Subject: [PATCH] Warn on missing variables (#17) --- CHANGELOG | 2 + dist/main.js | 4 +- dist/main.js.map | 2 +- dist/module.js | 4 +- dist/module.js.map | 2 +- .../build/simple-style/style.json | 36 ++++++++++++ .../templates/layers/layer1.js | 24 ++++++++ .../templates/layers/layer2.js | 24 ++++++++ .../templates/styles/simple-style.js | 24 ++++++++ package.json | 1 + src/lib/__test__/merge-overrides.test.js | 56 +++++++++++-------- src/lib/merge-overrides.js | 5 +- yarn.lock | 5 ++ 13 files changed, 160 insertions(+), 29 deletions(-) create mode 100644 examples/missing-variable-error/build/simple-style/style.json create mode 100644 examples/missing-variable-error/templates/layers/layer1.js create mode 100644 examples/missing-variable-error/templates/layers/layer2.js create mode 100644 examples/missing-variable-error/templates/styles/simple-style.js diff --git a/CHANGELOG b/CHANGELOG index 1b4b323..5be302a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,8 @@ ## Unreleased +- Fix missing validation for undefined properties bug + ## 0.5.1 - Bug with bad merge missing changes in release diff --git a/dist/main.js b/dist/main.js index 744ec2a..f4ba9e3 100644 --- a/dist/main.js +++ b/dist/main.js @@ -1,6 +1,7 @@ var $imiQD$fs = require("fs"); var $imiQD$path = require("path"); var $imiQD$chalk = require("chalk"); +var $imiQD$lodashclonedeep = require("lodash.clonedeep"); var $imiQD$jsonstringifyprettycompact = require("json-stringify-pretty-compact"); var $imiQD$mapboxmapboxglstylespec = require("@mapbox/mapbox-gl-style-spec"); @@ -20,8 +21,9 @@ $parcel$export(module.exports, "createVariantTemplate", () => $0b794c55e18208b3$ + const $a4d055c1a05e10fc$export$e8f23fe521397581 = (baseStyle, overrides)=>{ - const extended = JSON.parse(JSON.stringify(baseStyle)); + const extended = ($parcel$interopDefault($imiQD$lodashclonedeep))(baseStyle); Object.entries(overrides).forEach(([k, v])=>{ if (k === 'layout' || k === 'paint') extended[k] = { ...extended[k], diff --git a/dist/main.js.map b/dist/main.js.map index 3df5f6c..e695efd 100644 --- a/dist/main.js.map +++ b/dist/main.js.map @@ -1 +1 @@ -{"mappings":"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","sources":["stamen/mapbox-gl-style-build/src/index.js","stamen/mapbox-gl-style-build/src/lib/build-style.js","stamen/mapbox-gl-style-build/src/lib/merge-overrides.js","stamen/mapbox-gl-style-build/src/lib/merge-variables.js","stamen/mapbox-gl-style-build/src/lib/modify-number-variables.js","stamen/mapbox-gl-style-build/src/lib/create-template.js"],"sourcesContent":["import { buildStyle } from './lib/build-style';\nimport { mergeOverrides } from './lib/merge-overrides';\nimport { mergeVariables } from './lib/merge-variables';\nimport { modifyNumberVariables } from './lib/modify-number-variables';\nimport {\n createLayerTemplate,\n createVariantTemplate\n} from './lib/create-template';\n\nexport {\n mergeOverrides,\n buildStyle,\n mergeVariables,\n modifyNumberVariables,\n createLayerTemplate,\n createVariantTemplate\n};\n","#!/usr/bin/env node\nimport fs from 'fs';\nimport path from 'path';\nimport chalk from 'chalk';\n\nimport { mergeOverrides } from './merge-overrides';\n\n/**\n * Check if a file exists\n *\n * @param {string} path - the file path\n * @return {boolean} whether the file exists\n */\nconst fileExists = (path) => {\n try {\n fs.accessSync(path, fs.constants.R_OK);\n } catch (e) {\n return false;\n }\n return true;\n};\n\n/**\n * Determine whether a value is or contains undefined within it\n *\n * @param {*} v - the value to check\n * @returns {boolean|array}\n */\nconst findUndefined = v => {\n if (v == undefined) return true;\n\n // For objects and arrays, we want to know the keys/indices\n // that contain undefined values\n if (typeof v === 'object' || Array.isArray(v)) {\n const undefinedValues = Object.keys(v)\n .map(key => {\n const undefinedProps = findUndefined(v[key]);\n if (!undefinedProps) return null;\n\n // This is the leaf node, just return the key\n if (typeof undefinedProps === 'boolean') return key;\n\n // Undefined properties are deeper, include key and further branches\n return { [key]: undefinedProps };\n })\n .filter(v => !!v);\n\n return undefinedValues.length ? undefinedValues : false;\n }\n\n return false;\n};\n\n/**\n * Check built layer for validity\n *\n * @param {object} layer - the layer to check\n * @returns {array} an array of validation messages\n */\nconst validateLayer = layer => {\n let messages = [];\n\n const undefinedProps = findUndefined(layer);\n if (undefinedProps?.length) {\n messages = [\n ...messages,\n ...undefinedProps.map(undefinedProp => {\n return `Undefined property at ${JSON.stringify(undefinedProp)}`;\n })\n ];\n }\n\n return messages;\n};\n\n/**\n * Get a useful error message when something goes wrong while building a layer\n *\n * Avoid stack traces, try to find error description and line in the layer file.\n *\n * @param {Error} error - the error object thrown\n * @param {string} name - the layer name\n * @param {string} path - the file path to the layer\n * @returns {string}\n */\nconst getLayerBuildErrorMessage = (error, name, path) => {\n const { stack } = error;\n\n // Get first \"at\" line of stack trace, split : to get line number\n const lineNumber = stack.split('\\n')[1].split(':')[1];\n\n // Load file and get the line at the given lineNumber\n const layerFile = fs.readFileSync(path, 'utf8');\n const layerLine = layerFile.split('\\n')[lineNumber - 1];\n\n return `${chalk.red.bold('Error:')} Couldn't build layer ${chalk.blue(name)}.\n\nDetails: ${error.message} in\n ${chalk.blue(path)}\n\n${lineNumber}: ${layerLine}`;\n};\n\n/**\n * Nicely format a file does not exist error message\n *\n * @param {string} fileType - 'layer' or 'style'\n * @param {string} name - the name of the file being loaded\n * @param {string} path - the file path being loaded\n * @returns {string}\n */\nconst getFileDoesNotExistMessage = (fileType, name, path) => {\n return `\\n${chalk.red.bold('Error:')} Couldn't load ${fileType} ${chalk.blue(name)}, does it exist? Attempted to load from\n ${chalk.blue(path)}\n`;\n};\n\n/**\n * Nicely format a file error message\n *\n * @param {string} fileType - 'layer' or 'style'\n * @param {string} name - the name of the file being loaded\n * @param {string} path - the file path being loaded\n * @param {string} error - the error message\n * @returns {string}\n */\nconst getFileErrorMessage = (fileType, name, path, error) => {\n return `\\n${chalk.red.bold('Error:')} Couldn't load ${fileType} ${chalk.blue(name)}. Received this error:\n\n${chalk.red(error.stack)}\n`;\n};\n\n/**\n * Nicely format and log validation messages for a style\n *\n * @param {string} style - the name of the style\n * @param {object} validationMessages - the validation messages, keyed by layer name\n * @returns {Void}\n */\nconst logValidationMessages = (style, validationMessages) => {\n console.warn(`Found issues in style ${chalk.blue(style)}:`);\n\n Object.keys(validationMessages).forEach(layer => {\n console.warn(` Layer ${chalk.blue(layer)}:`);\n validationMessages[layer].forEach(message => {\n console.warn(` ${message}`);\n });\n });\n\n console.warn('');\n};\n\n/**\n * Load the function that will build the layer.\n *\n * @param {string} name - the layer name\n * @param {string} path - the file path to the layer\n * @returns {function} the layer builder\n */\nconst loadLayerBuilder = (name, path) => {\n if (!fileExists(path)) {\n throw new Error(getFileDoesNotExistMessage('layer', name, path));\n }\n\n try {\n return require(path).default;\n } catch (error) {\n throw new Error(getFileErrorMessage('layer', name, path, error));\n }\n};\n\n/**\n * Load a style, wrapped here to catch and format errors.\n *\n * @param {string} path - the file path to the style\n * @param {string} name - the style name\n * @returns {object}\n */\nconst loadStyle = (name, path) => {\n if (!fileExists(path)) {\n throw new Error(getFileDoesNotExistMessage('style', name, path));\n }\n\n try {\n return require(path);\n } catch (error) {\n throw new Error(getFileErrorMessage('style', name, path, error));\n }\n};\n\n/**\n * Build a layer\n *\n * @param {object} context - the context, which contains variables for the layer\n * @param {string} name - the layer name\n * @param {string} path - the file path to the layer\n * @returns {object}\n */\nconst buildLayer = (context, name, path) => {\n const builder = loadLayerBuilder(name, path);\n\n let layer;\n try {\n layer = builder(context);\n } catch (error) {\n throw new Error(getLayerBuildErrorMessage(error, name, path));\n }\n\n return mergeOverrides(layer.baseStyle, layer.overrides);\n};\n\n/**\n * Build style\n *\n * @param {string} name - the name of the style to build\n * @param {string} styleDir - the input directory that contains styles\n * @param {string} layerDir - the input directory that contains layers\n * @returns {Object}\n */\nexport const buildStyle = (stylePath, layerDir, options = {}) => {\n if (!stylePath) {\n throw new Error('Must provide stylePath.');\n }\n if (!layerDir) {\n throw new Error('Must provide layerDir.');\n }\n\n const name = path.basename(stylePath, '.js');\n\n const verbose = options?.verbose ?? false;\n\n const { context, template } = loadStyle(name, path.resolve(stylePath));\n\n const styleJson = JSON.parse(JSON.stringify(template));\n\n let validationMessages = {};\n\n if (verbose) {\n console.log(`Building style ${chalk.blue(name)}`);\n }\n\n styleJson.layers = template.layers.map(layerName => {\n if (verbose) {\n console.log(` Adding layer ${chalk.blue(layerName)}`);\n }\n\n const layerPath = path.resolve(layerDir, `${layerName}.js`);\n const layer = buildLayer(context, layerName, layerPath);\n\n // Collect validation messages for each layer\n const layerValidationMessages = validateLayer(layer);\n if (layerValidationMessages.length) {\n validationMessages[layerName] = layerValidationMessages;\n }\n\n return layer;\n });\n\n if (Object.keys(validationMessages).length > 0) {\n logValidationMessages(name, validationMessages);\n }\n\n return styleJson;\n};\n","/**\n * Merge overrides with a baseStyle or other overrides\n *\n * paint and layout overrides do not fully overwrite paint and layout values in\n * the baseStyle, however, they add or replaces specific properties. In this\n * way, an overrides object can specify a single paint property to modify or add\n * without overwriting all of the paint properties of the baseStyle.\n *\n * @param {object} baseStyle\n * @param {object} overrides\n * @returns {object}\n */\nexport const mergeOverrides = (baseStyle, overrides) => {\n const extended = JSON.parse(JSON.stringify(baseStyle));\n\n Object.entries(overrides).forEach(([k, v]) => {\n if (k === 'layout' || k === 'paint') {\n extended[k] = { ...extended[k], ...v };\n } else {\n extended[k] = v;\n }\n });\n\n return extended;\n};\n\n","const isObject = v => typeof v === 'object' && !Array.isArray(v) && !!v;\n\n/**\n * Merge the current object of variables with an extender object. Variables\n * defined in extender will override variables defined in the current variables,\n * if there is overlap. Nested variables are taken into account.\n * @param {Object} current - the original variable object\n * @param {Object} extender - the extender variable object, containing overrides\n * @returns {Object} - the merged variables\n */\nconst merge = (current, extender) => {\n const merged = JSON.parse(JSON.stringify(current));\n\n Object.keys(extender).forEach(k => {\n // Handle nested variables\n if (isObject(current[k]) && isObject(extender[k])) {\n merged[k] = merge(current[k], extender[k]);\n }\n else {\n merged[k] = JSON.parse(JSON.stringify(extender[k]));\n }\n });\n\n return merged;\n};\n\n\n/**\n * Merge any number of variable objects\n * @param {...Object} variableGroups - one or many variable objects, each \n * passed as a separate parameter\n * @returns {Object} the merged variable object\n */\nexport const mergeVariables = (...variableGroups) => {\n return variableGroups.reduce((acc, cur) => merge(acc, cur), {});\n};\n","/**\n * Returns a new function that divides a number by the modifier passed here\n * @param {number} divisor - number to divide by in the output function\n * @returns {Function} - a function that multiplies a number by the modifier passed\n */\nconst getDivideFn = divisor => {\n return num => num / divisor;\n};\n/**\n * Returns a new function that subtracts from a number by the modifier passed here\n * @param {number} toSubtract - number to subtract in the output function\n * @returns {Function} - a function that multiplies a number by the modifier passed\n */\nconst getSubtractFn = toSubtract => {\n return num => num - toSubtract;\n};\n/**\n * Returns a new function that adds to a number by the modifier passed here\n * @param {number} toAdd - number to add in the output function\n * @returns {Function} - a function that multiplies a number by the modifier passed\n */\nconst getAddFn = toAdd => {\n return num => num + toAdd;\n};\n/**\n * Returns a new function that multiplies a number by the modifier passed here\n * @param {number} multiplier - number to multiply by in the output function\n * @returns {Function} - a function that multiplies a number by the modifier passed\n */\nconst getMultiplyFn = multiplier => {\n return num => num * multiplier;\n};\n\n/**\n * Modifies the property value after the transform function using options\n * @param {Array|number} value - property value of the variable\n * @param {Object} [options] - options object with keys: round?: boolean, floor?: boolean, ceil?: boolean, toFixed?: number\n * @returns {Array|number} - the modified property values from the options\n */\nconst handleOptions = (value, options) => {\n const { round, floor, ceil, toFixed } = options;\n if (round) return Math.round(value);\n if (floor) return Math.floor(value);\n if (ceil) return Math.ceil(value);\n if (toFixed !== undefined) return Number(value.toFixed(toFixed));\n return value;\n};\n\n/**\n * Modifies the property value of the variable with the transform function\n * @param {Array|number} propertyValue - property value of the variable\n * @param {Function} fn - function to run the value or expression output values through\n * @param {Object} [options] - options object with keys: round?: boolean, floor?: boolean, ceil?: boolean, toFixed?: number\n * @returns {Array|number} - the modified property values\n */\nconst modifyValue = (propertyValue, fn, options) => {\n if (typeof propertyValue === 'number') {\n return handleOptions(fn(propertyValue), options);\n }\n if (!Array.isArray(propertyValue)) return propertyValue;\n\n const expressionType = propertyValue[0];\n let sliceIndex;\n let outputCondition;\n let fallback;\n\n switch (expressionType) {\n case 'interpolate':\n case 'interpolate-hcl':\n case 'interpolate-lab': {\n sliceIndex = 3;\n outputCondition = i => i % 2 !== 0;\n break;\n }\n case 'step': {\n sliceIndex = 2;\n outputCondition = i => i % 2 === 0;\n break;\n }\n case 'case': {\n sliceIndex = 1;\n outputCondition = i => i % 2 !== 0;\n fallback = propertyValue.pop();\n break;\n }\n case 'match': {\n sliceIndex = 2;\n outputCondition = i => i % 2 !== 0;\n fallback = propertyValue.pop();\n break;\n }\n }\n\n // Rebuild modified expression\n const nextValue = propertyValue.slice(0, sliceIndex);\n const inputOutputs = propertyValue.slice(sliceIndex);\n inputOutputs.forEach((val, i) => {\n if (outputCondition(i)) {\n nextValue.push(modifyValue(val, fn, options));\n } else {\n nextValue.push(val);\n }\n });\n if (fallback !== undefined) {\n nextValue.push(modifyValue(fallback, fn, options));\n }\n\n return nextValue;\n};\n\n/**\n * Recurses the variables object to find the actual property values\n * @param {Object|Array|number} variables - the original variable object or variable\n * @param {Function} fn - function to run the value or expression output values through\n * @param {Object} [options] - options object with keys: round?: boolean, floor?: boolean, ceil?: boolean, toFixed?: number\n * @returns {Object} - the modified variables\n */\nconst replaceVariables = (variables, fn, options) => {\n if (typeof variables !== 'object' || Array.isArray(variables)) {\n return modifyValue(variables, fn, options);\n }\n return Object.keys(variables).reduce((acc, key) => {\n acc[key] = replaceVariables(variables[key], fn, options);\n return acc;\n }, {});\n};\n\n/**\n * Modify number values in variables using a math operation\n * @param {Object|Array|number} variables - the original variable object or variable\n * @param {string} operator - Math operation, one of - '*', '/', '+', '-'\n * @param {number} modifier - number argument to modify value by\n * @param {Object} [options] - options object with keys: round?: boolean, floor?: boolean, ceil?: boolean, toFixed?: number\n * @returns {Object} - the modified variables\n */\nconst modifyNumberVariables = (variables, operator, modifier, options = {}) => {\n let nextVariables = JSON.parse(JSON.stringify(variables));\n let mathFn = num => num;\n\n switch (operator) {\n case '*': {\n mathFn = getMultiplyFn(modifier);\n break;\n }\n case '/': {\n mathFn = getDivideFn(modifier);\n break;\n }\n case '+': {\n mathFn = getAddFn(modifier);\n break;\n }\n case '-': {\n mathFn = getSubtractFn(modifier);\n break;\n }\n default: {\n throw new Error(`${operator} is not a valid operator.`);\n }\n }\n\n nextVariables = replaceVariables(variables, mathFn, options);\n\n return nextVariables;\n};\n\nexport { modifyNumberVariables };\n","import stringifyPretty from 'json-stringify-pretty-compact';\nimport { latest } from '@mapbox/mapbox-gl-style-spec';\n\nexport const createLayerTemplate = (baseLayer, variants) => {\n let layer = baseLayer;\n if (!layer) layer = Object.values(variants)[0];\n\n let baseStyle = stringifyPretty(layer, { indent: 2 })\n .split('\\n')\n .join('\\n ');\n\n let allOverrides = '';\n\n // TODO currently making the primary differentiator style id until we sort differences\n for (const styleName in variants) {\n let overrides = {};\n\n if (layer && Object.keys(variants).length) {\n let variantLayer = variants[styleName];\n\n Object.entries(variantLayer).forEach(([k, v]) => {\n if (k === 'layout' || k === 'paint') return;\n if (JSON.stringify(v) === JSON.stringify(layer[k])) return;\n overrides[k] = v;\n });\n\n if (variantLayer.layout) {\n // If a property does not exist on a variant, override with the default\n const defaultLayout = Object.keys(layer.layout || {}).reduce(\n (acc, k) => {\n acc[k] = latest[`layout_${layer.type}`][k].default;\n return acc;\n },\n {}\n );\n\n const fullLayout = { ...defaultLayout, ...variantLayer.layout };\n\n Object.entries(fullLayout).forEach(([k, v]) => {\n if (JSON.stringify(v) === JSON.stringify(layer?.layout?.[k])) return;\n if (!overrides.layout) overrides.layout = {};\n overrides.layout[k] = v;\n });\n }\n\n if (variantLayer.paint) {\n // If a property does not exist on a variant, override with the default\n const defaultPaint = Object.keys(layer.paint || {}).reduce((acc, k) => {\n acc[k] = latest[`paint_${layer.type}`][k].default;\n return acc;\n }, {});\n\n const fullPaint = { ...defaultPaint, ...variantLayer.paint };\n\n Object.entries(fullPaint).forEach(([k, v]) => {\n if (JSON.stringify(v) === JSON.stringify(layer?.paint?.[k])) return;\n if (!overrides.paint) overrides.paint = {};\n overrides.paint[k] = v;\n });\n }\n }\n overrides = stringifyPretty(overrides, { indent: 2 })\n .split('\\n')\n .join('\\n ');\n\n allOverrides += `${\n !!allOverrides ? ' else if' : 'if'\n } (context.styleName === '${styleName}') {\n overrides = ${overrides};\n }`;\n }\n\n const fileContent = `module.exports.default = (context) => {\n const baseStyle = ${baseStyle};\n let overrides = {};\n ${allOverrides}\n return {\n baseStyle,\n overrides\n };\n};`;\n\n return fileContent;\n};\n\nexport const createVariantTemplate = style => {\n const templateStyle = {\n ...style,\n layers: style.layers.map(l => l.id)\n };\n\n const fileContent = `module.exports.context = {\n colors: {\n },\n styleName: '${style.name}'\n};\n\nmodule.exports.template = ${JSON.stringify(templateStyle, null, 2)};\n`;\n\n return fileContent;\n};\n"],"names":[],"version":3,"file":"main.js.map"} \ No newline at end of file +{"mappings":"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","sources":["stamen/mapbox-gl-style-build/src/index.js","stamen/mapbox-gl-style-build/src/lib/build-style.js","stamen/mapbox-gl-style-build/src/lib/merge-overrides.js","stamen/mapbox-gl-style-build/src/lib/merge-variables.js","stamen/mapbox-gl-style-build/src/lib/modify-number-variables.js","stamen/mapbox-gl-style-build/src/lib/create-template.js"],"sourcesContent":["import { buildStyle } from './lib/build-style';\nimport { mergeOverrides } from './lib/merge-overrides';\nimport { mergeVariables } from './lib/merge-variables';\nimport { modifyNumberVariables } from './lib/modify-number-variables';\nimport {\n createLayerTemplate,\n createVariantTemplate\n} from './lib/create-template';\n\nexport {\n mergeOverrides,\n buildStyle,\n mergeVariables,\n modifyNumberVariables,\n createLayerTemplate,\n createVariantTemplate\n};\n","#!/usr/bin/env node\nimport fs from 'fs';\nimport path from 'path';\nimport chalk from 'chalk';\n\nimport { mergeOverrides } from './merge-overrides';\n\n/**\n * Check if a file exists\n *\n * @param {string} path - the file path\n * @return {boolean} whether the file exists\n */\nconst fileExists = (path) => {\n try {\n fs.accessSync(path, fs.constants.R_OK);\n } catch (e) {\n return false;\n }\n return true;\n};\n\n/**\n * Determine whether a value is or contains undefined within it\n *\n * @param {*} v - the value to check\n * @returns {boolean|array}\n */\nconst findUndefined = v => {\n if (v == undefined) return true;\n\n // For objects and arrays, we want to know the keys/indices\n // that contain undefined values\n if (typeof v === 'object' || Array.isArray(v)) {\n const undefinedValues = Object.keys(v)\n .map(key => {\n const undefinedProps = findUndefined(v[key]);\n if (!undefinedProps) return null;\n\n // This is the leaf node, just return the key\n if (typeof undefinedProps === 'boolean') return key;\n\n // Undefined properties are deeper, include key and further branches\n return { [key]: undefinedProps };\n })\n .filter(v => !!v);\n\n return undefinedValues.length ? undefinedValues : false;\n }\n\n return false;\n};\n\n/**\n * Check built layer for validity\n *\n * @param {object} layer - the layer to check\n * @returns {array} an array of validation messages\n */\nconst validateLayer = layer => {\n let messages = [];\n\n const undefinedProps = findUndefined(layer);\n if (undefinedProps?.length) {\n messages = [\n ...messages,\n ...undefinedProps.map(undefinedProp => {\n return `Undefined property at ${JSON.stringify(undefinedProp)}`;\n })\n ];\n }\n\n return messages;\n};\n\n/**\n * Get a useful error message when something goes wrong while building a layer\n *\n * Avoid stack traces, try to find error description and line in the layer file.\n *\n * @param {Error} error - the error object thrown\n * @param {string} name - the layer name\n * @param {string} path - the file path to the layer\n * @returns {string}\n */\nconst getLayerBuildErrorMessage = (error, name, path) => {\n const { stack } = error;\n\n // Get first \"at\" line of stack trace, split : to get line number\n const lineNumber = stack.split('\\n')[1].split(':')[1];\n\n // Load file and get the line at the given lineNumber\n const layerFile = fs.readFileSync(path, 'utf8');\n const layerLine = layerFile.split('\\n')[lineNumber - 1];\n\n return `${chalk.red.bold('Error:')} Couldn't build layer ${chalk.blue(name)}.\n\nDetails: ${error.message} in\n ${chalk.blue(path)}\n\n${lineNumber}: ${layerLine}`;\n};\n\n/**\n * Nicely format a file does not exist error message\n *\n * @param {string} fileType - 'layer' or 'style'\n * @param {string} name - the name of the file being loaded\n * @param {string} path - the file path being loaded\n * @returns {string}\n */\nconst getFileDoesNotExistMessage = (fileType, name, path) => {\n return `\\n${chalk.red.bold('Error:')} Couldn't load ${fileType} ${chalk.blue(name)}, does it exist? Attempted to load from\n ${chalk.blue(path)}\n`;\n};\n\n/**\n * Nicely format a file error message\n *\n * @param {string} fileType - 'layer' or 'style'\n * @param {string} name - the name of the file being loaded\n * @param {string} path - the file path being loaded\n * @param {string} error - the error message\n * @returns {string}\n */\nconst getFileErrorMessage = (fileType, name, path, error) => {\n return `\\n${chalk.red.bold('Error:')} Couldn't load ${fileType} ${chalk.blue(name)}. Received this error:\n\n${chalk.red(error.stack)}\n`;\n};\n\n/**\n * Nicely format and log validation messages for a style\n *\n * @param {string} style - the name of the style\n * @param {object} validationMessages - the validation messages, keyed by layer name\n * @returns {Void}\n */\nconst logValidationMessages = (style, validationMessages) => {\n console.warn(`Found issues in style ${chalk.blue(style)}:`);\n\n Object.keys(validationMessages).forEach(layer => {\n console.warn(` Layer ${chalk.blue(layer)}:`);\n validationMessages[layer].forEach(message => {\n console.warn(` ${message}`);\n });\n });\n\n console.warn('');\n};\n\n/**\n * Load the function that will build the layer.\n *\n * @param {string} name - the layer name\n * @param {string} path - the file path to the layer\n * @returns {function} the layer builder\n */\nconst loadLayerBuilder = (name, path) => {\n if (!fileExists(path)) {\n throw new Error(getFileDoesNotExistMessage('layer', name, path));\n }\n\n try {\n return require(path).default;\n } catch (error) {\n throw new Error(getFileErrorMessage('layer', name, path, error));\n }\n};\n\n/**\n * Load a style, wrapped here to catch and format errors.\n *\n * @param {string} path - the file path to the style\n * @param {string} name - the style name\n * @returns {object}\n */\nconst loadStyle = (name, path) => {\n if (!fileExists(path)) {\n throw new Error(getFileDoesNotExistMessage('style', name, path));\n }\n\n try {\n return require(path);\n } catch (error) {\n throw new Error(getFileErrorMessage('style', name, path, error));\n }\n};\n\n/**\n * Build a layer\n *\n * @param {object} context - the context, which contains variables for the layer\n * @param {string} name - the layer name\n * @param {string} path - the file path to the layer\n * @returns {object}\n */\nconst buildLayer = (context, name, path) => {\n const builder = loadLayerBuilder(name, path);\n\n let layer;\n try {\n layer = builder(context);\n } catch (error) {\n throw new Error(getLayerBuildErrorMessage(error, name, path));\n }\n\n return mergeOverrides(layer.baseStyle, layer.overrides);\n};\n\n/**\n * Build style\n *\n * @param {string} name - the name of the style to build\n * @param {string} styleDir - the input directory that contains styles\n * @param {string} layerDir - the input directory that contains layers\n * @returns {Object}\n */\nexport const buildStyle = (stylePath, layerDir, options = {}) => {\n if (!stylePath) {\n throw new Error('Must provide stylePath.');\n }\n if (!layerDir) {\n throw new Error('Must provide layerDir.');\n }\n\n const name = path.basename(stylePath, '.js');\n\n const verbose = options?.verbose ?? false;\n\n const { context, template } = loadStyle(name, path.resolve(stylePath));\n\n const styleJson = JSON.parse(JSON.stringify(template));\n\n let validationMessages = {};\n\n if (verbose) {\n console.log(`Building style ${chalk.blue(name)}`);\n }\n\n styleJson.layers = template.layers.map(layerName => {\n if (verbose) {\n console.log(` Adding layer ${chalk.blue(layerName)}`);\n }\n\n const layerPath = path.resolve(layerDir, `${layerName}.js`);\n const layer = buildLayer(context, layerName, layerPath);\n\n // Collect validation messages for each layer\n const layerValidationMessages = validateLayer(layer);\n if (layerValidationMessages.length) {\n validationMessages[layerName] = layerValidationMessages;\n }\n\n return layer;\n });\n\n if (Object.keys(validationMessages).length > 0) {\n logValidationMessages(name, validationMessages);\n }\n\n return styleJson;\n};\n","import cloneDeep from 'lodash.clonedeep';\n\n/**\n * Merge overrides with a baseStyle or other overrides\n *\n * paint and layout overrides do not fully overwrite paint and layout values in\n * the baseStyle, however, they add or replaces specific properties. In this\n * way, an overrides object can specify a single paint property to modify or add\n * without overwriting all of the paint properties of the baseStyle.\n *\n * @param {object} baseStyle\n * @param {object} overrides\n * @returns {object}\n */\nexport const mergeOverrides = (baseStyle, overrides) => {\n const extended = cloneDeep(baseStyle);\n\n Object.entries(overrides).forEach(([k, v]) => {\n if (k === 'layout' || k === 'paint') {\n extended[k] = { ...extended[k], ...v };\n } else {\n extended[k] = v;\n }\n });\n\n return extended;\n};\n","const isObject = v => typeof v === 'object' && !Array.isArray(v) && !!v;\n\n/**\n * Merge the current object of variables with an extender object. Variables\n * defined in extender will override variables defined in the current variables,\n * if there is overlap. Nested variables are taken into account.\n * @param {Object} current - the original variable object\n * @param {Object} extender - the extender variable object, containing overrides\n * @returns {Object} - the merged variables\n */\nconst merge = (current, extender) => {\n const merged = JSON.parse(JSON.stringify(current));\n\n Object.keys(extender).forEach(k => {\n // Handle nested variables\n if (isObject(current[k]) && isObject(extender[k])) {\n merged[k] = merge(current[k], extender[k]);\n }\n else {\n merged[k] = JSON.parse(JSON.stringify(extender[k]));\n }\n });\n\n return merged;\n};\n\n\n/**\n * Merge any number of variable objects\n * @param {...Object} variableGroups - one or many variable objects, each \n * passed as a separate parameter\n * @returns {Object} the merged variable object\n */\nexport const mergeVariables = (...variableGroups) => {\n return variableGroups.reduce((acc, cur) => merge(acc, cur), {});\n};\n","/**\n * Returns a new function that divides a number by the modifier passed here\n * @param {number} divisor - number to divide by in the output function\n * @returns {Function} - a function that multiplies a number by the modifier passed\n */\nconst getDivideFn = divisor => {\n return num => num / divisor;\n};\n/**\n * Returns a new function that subtracts from a number by the modifier passed here\n * @param {number} toSubtract - number to subtract in the output function\n * @returns {Function} - a function that multiplies a number by the modifier passed\n */\nconst getSubtractFn = toSubtract => {\n return num => num - toSubtract;\n};\n/**\n * Returns a new function that adds to a number by the modifier passed here\n * @param {number} toAdd - number to add in the output function\n * @returns {Function} - a function that multiplies a number by the modifier passed\n */\nconst getAddFn = toAdd => {\n return num => num + toAdd;\n};\n/**\n * Returns a new function that multiplies a number by the modifier passed here\n * @param {number} multiplier - number to multiply by in the output function\n * @returns {Function} - a function that multiplies a number by the modifier passed\n */\nconst getMultiplyFn = multiplier => {\n return num => num * multiplier;\n};\n\n/**\n * Modifies the property value after the transform function using options\n * @param {Array|number} value - property value of the variable\n * @param {Object} [options] - options object with keys: round?: boolean, floor?: boolean, ceil?: boolean, toFixed?: number\n * @returns {Array|number} - the modified property values from the options\n */\nconst handleOptions = (value, options) => {\n const { round, floor, ceil, toFixed } = options;\n if (round) return Math.round(value);\n if (floor) return Math.floor(value);\n if (ceil) return Math.ceil(value);\n if (toFixed !== undefined) return Number(value.toFixed(toFixed));\n return value;\n};\n\n/**\n * Modifies the property value of the variable with the transform function\n * @param {Array|number} propertyValue - property value of the variable\n * @param {Function} fn - function to run the value or expression output values through\n * @param {Object} [options] - options object with keys: round?: boolean, floor?: boolean, ceil?: boolean, toFixed?: number\n * @returns {Array|number} - the modified property values\n */\nconst modifyValue = (propertyValue, fn, options) => {\n if (typeof propertyValue === 'number') {\n return handleOptions(fn(propertyValue), options);\n }\n if (!Array.isArray(propertyValue)) return propertyValue;\n\n const expressionType = propertyValue[0];\n let sliceIndex;\n let outputCondition;\n let fallback;\n\n switch (expressionType) {\n case 'interpolate':\n case 'interpolate-hcl':\n case 'interpolate-lab': {\n sliceIndex = 3;\n outputCondition = i => i % 2 !== 0;\n break;\n }\n case 'step': {\n sliceIndex = 2;\n outputCondition = i => i % 2 === 0;\n break;\n }\n case 'case': {\n sliceIndex = 1;\n outputCondition = i => i % 2 !== 0;\n fallback = propertyValue.pop();\n break;\n }\n case 'match': {\n sliceIndex = 2;\n outputCondition = i => i % 2 !== 0;\n fallback = propertyValue.pop();\n break;\n }\n }\n\n // Rebuild modified expression\n const nextValue = propertyValue.slice(0, sliceIndex);\n const inputOutputs = propertyValue.slice(sliceIndex);\n inputOutputs.forEach((val, i) => {\n if (outputCondition(i)) {\n nextValue.push(modifyValue(val, fn, options));\n } else {\n nextValue.push(val);\n }\n });\n if (fallback !== undefined) {\n nextValue.push(modifyValue(fallback, fn, options));\n }\n\n return nextValue;\n};\n\n/**\n * Recurses the variables object to find the actual property values\n * @param {Object|Array|number} variables - the original variable object or variable\n * @param {Function} fn - function to run the value or expression output values through\n * @param {Object} [options] - options object with keys: round?: boolean, floor?: boolean, ceil?: boolean, toFixed?: number\n * @returns {Object} - the modified variables\n */\nconst replaceVariables = (variables, fn, options) => {\n if (typeof variables !== 'object' || Array.isArray(variables)) {\n return modifyValue(variables, fn, options);\n }\n return Object.keys(variables).reduce((acc, key) => {\n acc[key] = replaceVariables(variables[key], fn, options);\n return acc;\n }, {});\n};\n\n/**\n * Modify number values in variables using a math operation\n * @param {Object|Array|number} variables - the original variable object or variable\n * @param {string} operator - Math operation, one of - '*', '/', '+', '-'\n * @param {number} modifier - number argument to modify value by\n * @param {Object} [options] - options object with keys: round?: boolean, floor?: boolean, ceil?: boolean, toFixed?: number\n * @returns {Object} - the modified variables\n */\nconst modifyNumberVariables = (variables, operator, modifier, options = {}) => {\n let nextVariables = JSON.parse(JSON.stringify(variables));\n let mathFn = num => num;\n\n switch (operator) {\n case '*': {\n mathFn = getMultiplyFn(modifier);\n break;\n }\n case '/': {\n mathFn = getDivideFn(modifier);\n break;\n }\n case '+': {\n mathFn = getAddFn(modifier);\n break;\n }\n case '-': {\n mathFn = getSubtractFn(modifier);\n break;\n }\n default: {\n throw new Error(`${operator} is not a valid operator.`);\n }\n }\n\n nextVariables = replaceVariables(variables, mathFn, options);\n\n return nextVariables;\n};\n\nexport { modifyNumberVariables };\n","import stringifyPretty from 'json-stringify-pretty-compact';\nimport { latest } from '@mapbox/mapbox-gl-style-spec';\n\nexport const createLayerTemplate = (baseLayer, variants) => {\n let layer = baseLayer;\n if (!layer) layer = Object.values(variants)[0];\n\n let baseStyle = stringifyPretty(layer, { indent: 2 })\n .split('\\n')\n .join('\\n ');\n\n let allOverrides = '';\n\n // TODO currently making the primary differentiator style id until we sort differences\n for (const styleName in variants) {\n let overrides = {};\n\n if (layer && Object.keys(variants).length) {\n let variantLayer = variants[styleName];\n\n Object.entries(variantLayer).forEach(([k, v]) => {\n if (k === 'layout' || k === 'paint') return;\n if (JSON.stringify(v) === JSON.stringify(layer[k])) return;\n overrides[k] = v;\n });\n\n if (variantLayer.layout) {\n // If a property does not exist on a variant, override with the default\n const defaultLayout = Object.keys(layer.layout || {}).reduce(\n (acc, k) => {\n acc[k] = latest[`layout_${layer.type}`][k].default;\n return acc;\n },\n {}\n );\n\n const fullLayout = { ...defaultLayout, ...variantLayer.layout };\n\n Object.entries(fullLayout).forEach(([k, v]) => {\n if (JSON.stringify(v) === JSON.stringify(layer?.layout?.[k])) return;\n if (!overrides.layout) overrides.layout = {};\n overrides.layout[k] = v;\n });\n }\n\n if (variantLayer.paint) {\n // If a property does not exist on a variant, override with the default\n const defaultPaint = Object.keys(layer.paint || {}).reduce((acc, k) => {\n acc[k] = latest[`paint_${layer.type}`][k].default;\n return acc;\n }, {});\n\n const fullPaint = { ...defaultPaint, ...variantLayer.paint };\n\n Object.entries(fullPaint).forEach(([k, v]) => {\n if (JSON.stringify(v) === JSON.stringify(layer?.paint?.[k])) return;\n if (!overrides.paint) overrides.paint = {};\n overrides.paint[k] = v;\n });\n }\n }\n overrides = stringifyPretty(overrides, { indent: 2 })\n .split('\\n')\n .join('\\n ');\n\n allOverrides += `${\n !!allOverrides ? ' else if' : 'if'\n } (context.styleName === '${styleName}') {\n overrides = ${overrides};\n }`;\n }\n\n const fileContent = `module.exports.default = (context) => {\n const baseStyle = ${baseStyle};\n let overrides = {};\n ${allOverrides}\n return {\n baseStyle,\n overrides\n };\n};`;\n\n return fileContent;\n};\n\nexport const createVariantTemplate = style => {\n const templateStyle = {\n ...style,\n layers: style.layers.map(l => l.id)\n };\n\n const fileContent = `module.exports.context = {\n colors: {\n },\n styleName: '${style.name}'\n};\n\nmodule.exports.template = ${JSON.stringify(templateStyle, null, 2)};\n`;\n\n return fileContent;\n};\n"],"names":[],"version":3,"file":"main.js.map"} \ No newline at end of file diff --git a/dist/module.js b/dist/module.js index c5196f2..cf6c3d0 100644 --- a/dist/module.js +++ b/dist/module.js @@ -1,14 +1,16 @@ import $ilDKq$fs from "fs"; import $ilDKq$path from "path"; import $ilDKq$chalk from "chalk"; +import $ilDKq$lodashclonedeep from "lodash.clonedeep"; import $ilDKq$jsonstringifyprettycompact from "json-stringify-pretty-compact"; import {latest as $ilDKq$latest} from "@mapbox/mapbox-gl-style-spec"; + const $3b9d4e5c487c058b$export$e8f23fe521397581 = (baseStyle, overrides)=>{ - const extended = JSON.parse(JSON.stringify(baseStyle)); + const extended = $ilDKq$lodashclonedeep(baseStyle); Object.entries(overrides).forEach(([k, v])=>{ if (k === 'layout' || k === 'paint') extended[k] = { ...extended[k], diff --git a/dist/module.js.map b/dist/module.js.map index 339f322..44feb2a 100644 --- a/dist/module.js.map +++ b/dist/module.js.map @@ -1 +1 @@ -{"mappings":"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","sources":["stamen/mapbox-gl-style-build/src/index.js","stamen/mapbox-gl-style-build/src/lib/build-style.js","stamen/mapbox-gl-style-build/src/lib/merge-overrides.js","stamen/mapbox-gl-style-build/src/lib/merge-variables.js","stamen/mapbox-gl-style-build/src/lib/modify-number-variables.js","stamen/mapbox-gl-style-build/src/lib/create-template.js"],"sourcesContent":["import { buildStyle } from './lib/build-style';\nimport { mergeOverrides } from './lib/merge-overrides';\nimport { mergeVariables } from './lib/merge-variables';\nimport { modifyNumberVariables } from './lib/modify-number-variables';\nimport {\n createLayerTemplate,\n createVariantTemplate\n} from './lib/create-template';\n\nexport {\n mergeOverrides,\n buildStyle,\n mergeVariables,\n modifyNumberVariables,\n createLayerTemplate,\n createVariantTemplate\n};\n","#!/usr/bin/env node\nimport fs from 'fs';\nimport path from 'path';\nimport chalk from 'chalk';\n\nimport { mergeOverrides } from './merge-overrides';\n\n/**\n * Check if a file exists\n *\n * @param {string} path - the file path\n * @return {boolean} whether the file exists\n */\nconst fileExists = (path) => {\n try {\n fs.accessSync(path, fs.constants.R_OK);\n } catch (e) {\n return false;\n }\n return true;\n};\n\n/**\n * Determine whether a value is or contains undefined within it\n *\n * @param {*} v - the value to check\n * @returns {boolean|array}\n */\nconst findUndefined = v => {\n if (v == undefined) return true;\n\n // For objects and arrays, we want to know the keys/indices\n // that contain undefined values\n if (typeof v === 'object' || Array.isArray(v)) {\n const undefinedValues = Object.keys(v)\n .map(key => {\n const undefinedProps = findUndefined(v[key]);\n if (!undefinedProps) return null;\n\n // This is the leaf node, just return the key\n if (typeof undefinedProps === 'boolean') return key;\n\n // Undefined properties are deeper, include key and further branches\n return { [key]: undefinedProps };\n })\n .filter(v => !!v);\n\n return undefinedValues.length ? undefinedValues : false;\n }\n\n return false;\n};\n\n/**\n * Check built layer for validity\n *\n * @param {object} layer - the layer to check\n * @returns {array} an array of validation messages\n */\nconst validateLayer = layer => {\n let messages = [];\n\n const undefinedProps = findUndefined(layer);\n if (undefinedProps?.length) {\n messages = [\n ...messages,\n ...undefinedProps.map(undefinedProp => {\n return `Undefined property at ${JSON.stringify(undefinedProp)}`;\n })\n ];\n }\n\n return messages;\n};\n\n/**\n * Get a useful error message when something goes wrong while building a layer\n *\n * Avoid stack traces, try to find error description and line in the layer file.\n *\n * @param {Error} error - the error object thrown\n * @param {string} name - the layer name\n * @param {string} path - the file path to the layer\n * @returns {string}\n */\nconst getLayerBuildErrorMessage = (error, name, path) => {\n const { stack } = error;\n\n // Get first \"at\" line of stack trace, split : to get line number\n const lineNumber = stack.split('\\n')[1].split(':')[1];\n\n // Load file and get the line at the given lineNumber\n const layerFile = fs.readFileSync(path, 'utf8');\n const layerLine = layerFile.split('\\n')[lineNumber - 1];\n\n return `${chalk.red.bold('Error:')} Couldn't build layer ${chalk.blue(name)}.\n\nDetails: ${error.message} in\n ${chalk.blue(path)}\n\n${lineNumber}: ${layerLine}`;\n};\n\n/**\n * Nicely format a file does not exist error message\n *\n * @param {string} fileType - 'layer' or 'style'\n * @param {string} name - the name of the file being loaded\n * @param {string} path - the file path being loaded\n * @returns {string}\n */\nconst getFileDoesNotExistMessage = (fileType, name, path) => {\n return `\\n${chalk.red.bold('Error:')} Couldn't load ${fileType} ${chalk.blue(name)}, does it exist? Attempted to load from\n ${chalk.blue(path)}\n`;\n};\n\n/**\n * Nicely format a file error message\n *\n * @param {string} fileType - 'layer' or 'style'\n * @param {string} name - the name of the file being loaded\n * @param {string} path - the file path being loaded\n * @param {string} error - the error message\n * @returns {string}\n */\nconst getFileErrorMessage = (fileType, name, path, error) => {\n return `\\n${chalk.red.bold('Error:')} Couldn't load ${fileType} ${chalk.blue(name)}. Received this error:\n\n${chalk.red(error.stack)}\n`;\n};\n\n/**\n * Nicely format and log validation messages for a style\n *\n * @param {string} style - the name of the style\n * @param {object} validationMessages - the validation messages, keyed by layer name\n * @returns {Void}\n */\nconst logValidationMessages = (style, validationMessages) => {\n console.warn(`Found issues in style ${chalk.blue(style)}:`);\n\n Object.keys(validationMessages).forEach(layer => {\n console.warn(` Layer ${chalk.blue(layer)}:`);\n validationMessages[layer].forEach(message => {\n console.warn(` ${message}`);\n });\n });\n\n console.warn('');\n};\n\n/**\n * Load the function that will build the layer.\n *\n * @param {string} name - the layer name\n * @param {string} path - the file path to the layer\n * @returns {function} the layer builder\n */\nconst loadLayerBuilder = (name, path) => {\n if (!fileExists(path)) {\n throw new Error(getFileDoesNotExistMessage('layer', name, path));\n }\n\n try {\n return require(path).default;\n } catch (error) {\n throw new Error(getFileErrorMessage('layer', name, path, error));\n }\n};\n\n/**\n * Load a style, wrapped here to catch and format errors.\n *\n * @param {string} path - the file path to the style\n * @param {string} name - the style name\n * @returns {object}\n */\nconst loadStyle = (name, path) => {\n if (!fileExists(path)) {\n throw new Error(getFileDoesNotExistMessage('style', name, path));\n }\n\n try {\n return require(path);\n } catch (error) {\n throw new Error(getFileErrorMessage('style', name, path, error));\n }\n};\n\n/**\n * Build a layer\n *\n * @param {object} context - the context, which contains variables for the layer\n * @param {string} name - the layer name\n * @param {string} path - the file path to the layer\n * @returns {object}\n */\nconst buildLayer = (context, name, path) => {\n const builder = loadLayerBuilder(name, path);\n\n let layer;\n try {\n layer = builder(context);\n } catch (error) {\n throw new Error(getLayerBuildErrorMessage(error, name, path));\n }\n\n return mergeOverrides(layer.baseStyle, layer.overrides);\n};\n\n/**\n * Build style\n *\n * @param {string} name - the name of the style to build\n * @param {string} styleDir - the input directory that contains styles\n * @param {string} layerDir - the input directory that contains layers\n * @returns {Object}\n */\nexport const buildStyle = (stylePath, layerDir, options = {}) => {\n if (!stylePath) {\n throw new Error('Must provide stylePath.');\n }\n if (!layerDir) {\n throw new Error('Must provide layerDir.');\n }\n\n const name = path.basename(stylePath, '.js');\n\n const verbose = options?.verbose ?? false;\n\n const { context, template } = loadStyle(name, path.resolve(stylePath));\n\n const styleJson = JSON.parse(JSON.stringify(template));\n\n let validationMessages = {};\n\n if (verbose) {\n console.log(`Building style ${chalk.blue(name)}`);\n }\n\n styleJson.layers = template.layers.map(layerName => {\n if (verbose) {\n console.log(` Adding layer ${chalk.blue(layerName)}`);\n }\n\n const layerPath = path.resolve(layerDir, `${layerName}.js`);\n const layer = buildLayer(context, layerName, layerPath);\n\n // Collect validation messages for each layer\n const layerValidationMessages = validateLayer(layer);\n if (layerValidationMessages.length) {\n validationMessages[layerName] = layerValidationMessages;\n }\n\n return layer;\n });\n\n if (Object.keys(validationMessages).length > 0) {\n logValidationMessages(name, validationMessages);\n }\n\n return styleJson;\n};\n","/**\n * Merge overrides with a baseStyle or other overrides\n *\n * paint and layout overrides do not fully overwrite paint and layout values in\n * the baseStyle, however, they add or replaces specific properties. In this\n * way, an overrides object can specify a single paint property to modify or add\n * without overwriting all of the paint properties of the baseStyle.\n *\n * @param {object} baseStyle\n * @param {object} overrides\n * @returns {object}\n */\nexport const mergeOverrides = (baseStyle, overrides) => {\n const extended = JSON.parse(JSON.stringify(baseStyle));\n\n Object.entries(overrides).forEach(([k, v]) => {\n if (k === 'layout' || k === 'paint') {\n extended[k] = { ...extended[k], ...v };\n } else {\n extended[k] = v;\n }\n });\n\n return extended;\n};\n\n","const isObject = v => typeof v === 'object' && !Array.isArray(v) && !!v;\n\n/**\n * Merge the current object of variables with an extender object. Variables\n * defined in extender will override variables defined in the current variables,\n * if there is overlap. Nested variables are taken into account.\n * @param {Object} current - the original variable object\n * @param {Object} extender - the extender variable object, containing overrides\n * @returns {Object} - the merged variables\n */\nconst merge = (current, extender) => {\n const merged = JSON.parse(JSON.stringify(current));\n\n Object.keys(extender).forEach(k => {\n // Handle nested variables\n if (isObject(current[k]) && isObject(extender[k])) {\n merged[k] = merge(current[k], extender[k]);\n }\n else {\n merged[k] = JSON.parse(JSON.stringify(extender[k]));\n }\n });\n\n return merged;\n};\n\n\n/**\n * Merge any number of variable objects\n * @param {...Object} variableGroups - one or many variable objects, each \n * passed as a separate parameter\n * @returns {Object} the merged variable object\n */\nexport const mergeVariables = (...variableGroups) => {\n return variableGroups.reduce((acc, cur) => merge(acc, cur), {});\n};\n","/**\n * Returns a new function that divides a number by the modifier passed here\n * @param {number} divisor - number to divide by in the output function\n * @returns {Function} - a function that multiplies a number by the modifier passed\n */\nconst getDivideFn = divisor => {\n return num => num / divisor;\n};\n/**\n * Returns a new function that subtracts from a number by the modifier passed here\n * @param {number} toSubtract - number to subtract in the output function\n * @returns {Function} - a function that multiplies a number by the modifier passed\n */\nconst getSubtractFn = toSubtract => {\n return num => num - toSubtract;\n};\n/**\n * Returns a new function that adds to a number by the modifier passed here\n * @param {number} toAdd - number to add in the output function\n * @returns {Function} - a function that multiplies a number by the modifier passed\n */\nconst getAddFn = toAdd => {\n return num => num + toAdd;\n};\n/**\n * Returns a new function that multiplies a number by the modifier passed here\n * @param {number} multiplier - number to multiply by in the output function\n * @returns {Function} - a function that multiplies a number by the modifier passed\n */\nconst getMultiplyFn = multiplier => {\n return num => num * multiplier;\n};\n\n/**\n * Modifies the property value after the transform function using options\n * @param {Array|number} value - property value of the variable\n * @param {Object} [options] - options object with keys: round?: boolean, floor?: boolean, ceil?: boolean, toFixed?: number\n * @returns {Array|number} - the modified property values from the options\n */\nconst handleOptions = (value, options) => {\n const { round, floor, ceil, toFixed } = options;\n if (round) return Math.round(value);\n if (floor) return Math.floor(value);\n if (ceil) return Math.ceil(value);\n if (toFixed !== undefined) return Number(value.toFixed(toFixed));\n return value;\n};\n\n/**\n * Modifies the property value of the variable with the transform function\n * @param {Array|number} propertyValue - property value of the variable\n * @param {Function} fn - function to run the value or expression output values through\n * @param {Object} [options] - options object with keys: round?: boolean, floor?: boolean, ceil?: boolean, toFixed?: number\n * @returns {Array|number} - the modified property values\n */\nconst modifyValue = (propertyValue, fn, options) => {\n if (typeof propertyValue === 'number') {\n return handleOptions(fn(propertyValue), options);\n }\n if (!Array.isArray(propertyValue)) return propertyValue;\n\n const expressionType = propertyValue[0];\n let sliceIndex;\n let outputCondition;\n let fallback;\n\n switch (expressionType) {\n case 'interpolate':\n case 'interpolate-hcl':\n case 'interpolate-lab': {\n sliceIndex = 3;\n outputCondition = i => i % 2 !== 0;\n break;\n }\n case 'step': {\n sliceIndex = 2;\n outputCondition = i => i % 2 === 0;\n break;\n }\n case 'case': {\n sliceIndex = 1;\n outputCondition = i => i % 2 !== 0;\n fallback = propertyValue.pop();\n break;\n }\n case 'match': {\n sliceIndex = 2;\n outputCondition = i => i % 2 !== 0;\n fallback = propertyValue.pop();\n break;\n }\n }\n\n // Rebuild modified expression\n const nextValue = propertyValue.slice(0, sliceIndex);\n const inputOutputs = propertyValue.slice(sliceIndex);\n inputOutputs.forEach((val, i) => {\n if (outputCondition(i)) {\n nextValue.push(modifyValue(val, fn, options));\n } else {\n nextValue.push(val);\n }\n });\n if (fallback !== undefined) {\n nextValue.push(modifyValue(fallback, fn, options));\n }\n\n return nextValue;\n};\n\n/**\n * Recurses the variables object to find the actual property values\n * @param {Object|Array|number} variables - the original variable object or variable\n * @param {Function} fn - function to run the value or expression output values through\n * @param {Object} [options] - options object with keys: round?: boolean, floor?: boolean, ceil?: boolean, toFixed?: number\n * @returns {Object} - the modified variables\n */\nconst replaceVariables = (variables, fn, options) => {\n if (typeof variables !== 'object' || Array.isArray(variables)) {\n return modifyValue(variables, fn, options);\n }\n return Object.keys(variables).reduce((acc, key) => {\n acc[key] = replaceVariables(variables[key], fn, options);\n return acc;\n }, {});\n};\n\n/**\n * Modify number values in variables using a math operation\n * @param {Object|Array|number} variables - the original variable object or variable\n * @param {string} operator - Math operation, one of - '*', '/', '+', '-'\n * @param {number} modifier - number argument to modify value by\n * @param {Object} [options] - options object with keys: round?: boolean, floor?: boolean, ceil?: boolean, toFixed?: number\n * @returns {Object} - the modified variables\n */\nconst modifyNumberVariables = (variables, operator, modifier, options = {}) => {\n let nextVariables = JSON.parse(JSON.stringify(variables));\n let mathFn = num => num;\n\n switch (operator) {\n case '*': {\n mathFn = getMultiplyFn(modifier);\n break;\n }\n case '/': {\n mathFn = getDivideFn(modifier);\n break;\n }\n case '+': {\n mathFn = getAddFn(modifier);\n break;\n }\n case '-': {\n mathFn = getSubtractFn(modifier);\n break;\n }\n default: {\n throw new Error(`${operator} is not a valid operator.`);\n }\n }\n\n nextVariables = replaceVariables(variables, mathFn, options);\n\n return nextVariables;\n};\n\nexport { modifyNumberVariables };\n","import stringifyPretty from 'json-stringify-pretty-compact';\nimport { latest } from '@mapbox/mapbox-gl-style-spec';\n\nexport const createLayerTemplate = (baseLayer, variants) => {\n let layer = baseLayer;\n if (!layer) layer = Object.values(variants)[0];\n\n let baseStyle = stringifyPretty(layer, { indent: 2 })\n .split('\\n')\n .join('\\n ');\n\n let allOverrides = '';\n\n // TODO currently making the primary differentiator style id until we sort differences\n for (const styleName in variants) {\n let overrides = {};\n\n if (layer && Object.keys(variants).length) {\n let variantLayer = variants[styleName];\n\n Object.entries(variantLayer).forEach(([k, v]) => {\n if (k === 'layout' || k === 'paint') return;\n if (JSON.stringify(v) === JSON.stringify(layer[k])) return;\n overrides[k] = v;\n });\n\n if (variantLayer.layout) {\n // If a property does not exist on a variant, override with the default\n const defaultLayout = Object.keys(layer.layout || {}).reduce(\n (acc, k) => {\n acc[k] = latest[`layout_${layer.type}`][k].default;\n return acc;\n },\n {}\n );\n\n const fullLayout = { ...defaultLayout, ...variantLayer.layout };\n\n Object.entries(fullLayout).forEach(([k, v]) => {\n if (JSON.stringify(v) === JSON.stringify(layer?.layout?.[k])) return;\n if (!overrides.layout) overrides.layout = {};\n overrides.layout[k] = v;\n });\n }\n\n if (variantLayer.paint) {\n // If a property does not exist on a variant, override with the default\n const defaultPaint = Object.keys(layer.paint || {}).reduce((acc, k) => {\n acc[k] = latest[`paint_${layer.type}`][k].default;\n return acc;\n }, {});\n\n const fullPaint = { ...defaultPaint, ...variantLayer.paint };\n\n Object.entries(fullPaint).forEach(([k, v]) => {\n if (JSON.stringify(v) === JSON.stringify(layer?.paint?.[k])) return;\n if (!overrides.paint) overrides.paint = {};\n overrides.paint[k] = v;\n });\n }\n }\n overrides = stringifyPretty(overrides, { indent: 2 })\n .split('\\n')\n .join('\\n ');\n\n allOverrides += `${\n !!allOverrides ? ' else if' : 'if'\n } (context.styleName === '${styleName}') {\n overrides = ${overrides};\n }`;\n }\n\n const fileContent = `module.exports.default = (context) => {\n const baseStyle = ${baseStyle};\n let overrides = {};\n ${allOverrides}\n return {\n baseStyle,\n overrides\n };\n};`;\n\n return fileContent;\n};\n\nexport const createVariantTemplate = style => {\n const templateStyle = {\n ...style,\n layers: style.layers.map(l => l.id)\n };\n\n const fileContent = `module.exports.context = {\n colors: {\n },\n styleName: '${style.name}'\n};\n\nmodule.exports.template = ${JSON.stringify(templateStyle, null, 2)};\n`;\n\n return fileContent;\n};\n"],"names":[],"version":3,"file":"module.js.map"} \ No newline at end of file +{"mappings":";;;;;;;;;;;AEcO,KAAK,CAAC,yCAAc,IAAI,SAAS,EAAE,SAAS,GAAK,CAAC;IACvD,KAAK,CAAC,QAAQ,GAAG,sBAAS,CAAC,SAAS;IAEpC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,GAAG,CAAC,EAAE,CAAC,IAAM,CAAC;QAC7C,EAAE,EAAE,CAAC,KAAK,CAAQ,WAAI,CAAC,KAAK,CAAO,QACjC,QAAQ,CAAC,CAAC,IAAI,CAAC;eAAI,QAAQ,CAAC,CAAC;eAAM,CAAC;QAAC,CAAC;aAEtC,QAAQ,CAAC,CAAC,IAAI,CAAC;IAEnB,CAAC;IAED,MAAM,CAAC,QAAQ;AACjB,CAAC;;;ADnBD,EAKG,AALH;;;;;CAKG,AALH,EAKG,CACH,KAAK,CAAC,gCAAU,IAAI,IAAI,GAAK,CAAC;IAC5B,GAAG,CAAC,CAAC;QACH,SAAE,CAAC,UAAU,CAAC,IAAI,EAAE,SAAE,CAAC,SAAS,CAAC,IAAI;IACvC,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,KAAK;IACd,CAAC;IACD,MAAM,CAAC,IAAI;AACb,CAAC;AAED,EAKG,AALH;;;;;CAKG,AALH,EAKG,CACH,KAAK,CAAC,mCAAa,IAAG,EAAC,GAAI,CAAC;IAC1B,EAAE,EAAE,EAAC,IAAI,SAAS,EAAE,MAAM,CAAC,IAAI;IAE/B,EAA2D,AAA3D,yDAA2D;IAC3D,EAAgC,AAAhC,8BAAgC;IAChC,EAAE,EAAE,MAAM,CAAC,EAAC,KAAK,CAAQ,WAAI,KAAK,CAAC,OAAO,CAAC,EAAC,GAAG,CAAC;QAC9C,KAAK,CAAC,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,EAAC,EAClC,GAAG,EAAC,GAAG,GAAI,CAAC;YACX,KAAK,CAAC,cAAc,GAAG,mCAAa,CAAC,EAAC,CAAC,GAAG;YAC1C,EAAE,GAAG,cAAc,EAAE,MAAM,CAAC,IAAI;YAEhC,EAA6C,AAA7C,2CAA6C;YAC7C,EAAE,EAAE,MAAM,CAAC,cAAc,KAAK,CAAS,UAAE,MAAM,CAAC,GAAG;YAEnD,EAAoE,AAApE,kEAAoE;YACpE,MAAM,CAAC,CAAC;iBAAE,GAAG,GAAG,cAAc;YAAC,CAAC;QAClC,CAAC,EACA,MAAM,EAAC,CAAC,KAAM,CAAC;;QAElB,MAAM,CAAC,eAAe,CAAC,MAAM,GAAG,eAAe,GAAG,KAAK;IACzD,CAAC;IAED,MAAM,CAAC,KAAK;AACd,CAAC;AAED,EAKG,AALH;;;;;CAKG,AALH,EAKG,CACH,KAAK,CAAC,mCAAa,IAAG,KAAK,GAAI,CAAC;IAC9B,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,CAAC,cAAc,GAAG,mCAAa,CAAC,KAAK;IAC1C,EAAE,EAAE,cAAc,EAAE,MAAM,EACxB,QAAQ,GAAG,CAAC;WACP,QAAQ;WACR,cAAc,CAAC,GAAG,EAAC,aAAa,GAAI,CAAC;YACtC,MAAM,EAAE,sBAAsB,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa;QAC9D,CAAC;IACH,CAAC;IAGH,MAAM,CAAC,QAAQ;AACjB,CAAC;AAED,EASG,AATH;;;;;;;;;CASG,AATH,EASG,CACH,KAAK,CAAC,+CAAyB,IAAI,KAAK,EAAE,IAAI,EAAE,IAAI,GAAK,CAAC;IACxD,KAAK,CAAC,CAAC,QAAC,KAAK,EAAC,CAAC,GAAG,KAAK;IAEvB,EAAiE,AAAjE,+DAAiE;IACjE,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAI,KAAE,CAAC,EAAE,KAAK,CAAC,CAAG,IAAE,CAAC;IAEpD,EAAqD,AAArD,mDAAqD;IACrD,KAAK,CAAC,SAAS,GAAG,SAAE,CAAC,YAAY,CAAC,IAAI,EAAE,CAAM;IAC9C,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAI,KAAE,UAAU,GAAG,CAAC;IAEtD,MAAM,IAAI,YAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAQ,SAAE,sBAAsB,EAAE,YAAK,CAAC,IAAI,CAAC,IAAI,EAAE;;SAErE,EAAE,KAAK,CAAC,OAAO,CAAC;EACvB,EAAE,YAAK,CAAC,IAAI,CAAC,IAAI,EAAE;;AAErB,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS;AAC1B,CAAC;AAED,EAOG,AAPH;;;;;;;CAOG,AAPH,EAOG,CACH,KAAK,CAAC,gDAA0B,IAAI,QAAQ,EAAE,IAAI,EAAE,IAAI,GAAK,CAAC;IAC5D,MAAM,EAAE,EAAE,EAAE,YAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAQ,SAAE,eAAe,EAAE,QAAQ,CAAC,CAAC,EAAE,YAAK,CAAC,IAAI,CAAC,IAAI,EAAE;EACnF,EAAE,YAAK,CAAC,IAAI,CAAC,IAAI,EAAE;AACrB;AACA,CAAC;AAED,EAQG,AARH;;;;;;;;CAQG,AARH,EAQG,CACH,KAAK,CAAC,yCAAmB,IAAI,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,GAAK,CAAC;IAC5D,MAAM,EAAE,EAAE,EAAE,YAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAQ,SAAE,eAAe,EAAE,QAAQ,CAAC,CAAC,EAAE,YAAK,CAAC,IAAI,CAAC,IAAI,EAAE;;AAErF,EAAE,YAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE;AACzB;AACA,CAAC;AAED,EAMG,AANH;;;;;;CAMG,AANH,EAMG,CACH,KAAK,CAAC,2CAAqB,IAAI,KAAK,EAAE,kBAAkB,GAAK,CAAC;IAC5D,OAAO,CAAC,IAAI,EAAE,sBAAsB,EAAE,YAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAEzD,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAC,KAAK,GAAI,CAAC;QAChD,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3C,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAC,OAAO,GAAI,CAAC;YAC5C,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAE;AACjB,CAAC;AAED,EAMG,AANH;;;;;;CAMG,AANH,EAMG,CACH,KAAK,CAAC,sCAAgB,IAAI,IAAI,EAAE,IAAI,GAAK,CAAC;IACxC,EAAE,GAAG,gCAAU,CAAC,IAAI,GAClB,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,gDAA0B,CAAC,CAAO,QAAE,IAAI,EAAE,IAAI;IAGhE,GAAG,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO;IAC9B,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;QACf,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,yCAAmB,CAAC,CAAO,QAAE,IAAI,EAAE,IAAI,EAAE,KAAK;IAChE,CAAC;AACH,CAAC;AAED,EAMG,AANH;;;;;;CAMG,AANH,EAMG,CACH,KAAK,CAAC,+BAAS,IAAI,IAAI,EAAE,IAAI,GAAK,CAAC;IACjC,EAAE,GAAG,gCAAU,CAAC,IAAI,GAClB,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,gDAA0B,CAAC,CAAO,QAAE,IAAI,EAAE,IAAI;IAGhE,GAAG,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,IAAI;IACrB,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;QACf,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,yCAAmB,CAAC,CAAO,QAAE,IAAI,EAAE,IAAI,EAAE,KAAK;IAChE,CAAC;AACH,CAAC;AAED,EAOG,AAPH;;;;;;;CAOG,AAPH,EAOG,CACH,KAAK,CAAC,gCAAU,IAAI,OAAO,EAAE,IAAI,EAAE,IAAI,GAAK,CAAC;IAC3C,KAAK,CAAC,OAAO,GAAG,sCAAgB,CAAC,IAAI,EAAE,IAAI;IAE3C,GAAG,CAAC,KAAK;IACT,GAAG,CAAC,CAAC;QACH,KAAK,GAAG,OAAO,CAAC,OAAO;IACzB,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;QACf,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,+CAAyB,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI;IAC7D,CAAC;IAED,MAAM,CAAC,yCAAc,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS;AACxD,CAAC;AAUM,KAAK,CAAC,yCAAU,IAAI,SAAS,EAAE,QAAQ,EAAE,OAAO,GAAG,CAAC;AAAA,CAAC,GAAK,CAAC;IAChE,EAAE,GAAG,SAAS,EACZ,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAyB;IAE3C,EAAE,GAAG,QAAQ,EACX,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAwB;IAG1C,KAAK,CAAC,IAAI,GAAG,WAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAK;IAE3C,KAAK,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,KAAK;IAEzC,KAAK,CAAC,CAAC,UAAC,OAAO,aAAE,QAAQ,EAAC,CAAC,GAAG,+BAAS,CAAC,IAAI,EAAE,WAAI,CAAC,OAAO,CAAC,SAAS;IAEpE,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ;IAEpD,GAAG,CAAC,kBAAkB,GAAG,CAAC;IAAA,CAAC;IAE3B,EAAE,EAAE,OAAO,EACT,OAAO,CAAC,GAAG,EAAE,eAAe,EAAE,YAAK,CAAC,IAAI,CAAC,IAAI;IAG/C,SAAS,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAC,SAAS,GAAI,CAAC;QACnD,EAAE,EAAE,OAAO,EACT,OAAO,CAAC,GAAG,EAAE,eAAe,EAAE,YAAK,CAAC,IAAI,CAAC,SAAS;QAGpD,KAAK,CAAC,SAAS,GAAG,WAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,GAAG;QACzD,KAAK,CAAC,KAAK,GAAG,gCAAU,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS;QAEtD,EAA6C,AAA7C,2CAA6C;QAC7C,KAAK,CAAC,uBAAuB,GAAG,mCAAa,CAAC,KAAK;QACnD,EAAE,EAAE,uBAAuB,CAAC,MAAM,EAChC,kBAAkB,CAAC,SAAS,IAAI,uBAAuB;QAGzD,MAAM,CAAC,KAAK;IACd,CAAC;IAED,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,MAAM,GAAG,CAAC,EAC5C,2CAAqB,CAAC,IAAI,EAAE,kBAAkB;IAGhD,MAAM,CAAC,SAAS;AAClB,CAAC;;;;AExQD,KAAK,CAAC,8BAAQ,IAAG,CAAC,GAAI,MAAM,CAAC,CAAC,KAAK,CAAQ,YAAK,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;;AAEvE,EAOG,AAPH;;;;;;;CAOG,AAPH,EAOG,CACH,KAAK,CAAC,2BAAK,IAAI,OAAO,EAAE,QAAQ,GAAK,CAAC;IACpC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO;IAEhD,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAC,CAAC,GAAI,CAAC;QAClC,EAA0B,AAA1B,wBAA0B;QAC1B,EAAE,EAAE,8BAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,8BAAQ,CAAC,QAAQ,CAAC,CAAC,IAC7C,MAAM,CAAC,CAAC,IAAI,2BAAK,CAAC,OAAO,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;aAGxC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEpD,CAAC;IAED,MAAM,CAAC,MAAM;AACf,CAAC;AASM,KAAK,CAAC,yCAAc,OAAO,cAAc,GAAK,CAAC;IACpD,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,GAAK,2BAAK,CAAC,GAAG,EAAE,GAAG;MAAG,CAAC;IAAA,CAAC;AAChE,CAAC;;;ACnCD,EAIG,AAJH;;;;CAIG,AAJH,EAIG,CACH,KAAK,CAAC,iCAAW,IAAG,OAAO,GAAI,CAAC;IAC9B,MAAM,EAAC,GAAG,GAAI,GAAG,GAAG,OAAO;;AAC7B,CAAC;AACD,EAIG,AAJH;;;;CAIG,AAJH,EAIG,CACH,KAAK,CAAC,mCAAa,IAAG,UAAU,GAAI,CAAC;IACnC,MAAM,EAAC,GAAG,GAAI,GAAG,GAAG,UAAU;;AAChC,CAAC;AACD,EAIG,AAJH;;;;CAIG,AAJH,EAIG,CACH,KAAK,CAAC,8BAAQ,IAAG,KAAK,GAAI,CAAC;IACzB,MAAM,EAAC,GAAG,GAAI,GAAG,GAAG,KAAK;;AAC3B,CAAC;AACD,EAIG,AAJH;;;;CAIG,AAJH,EAIG,CACH,KAAK,CAAC,mCAAa,IAAG,UAAU,GAAI,CAAC;IACnC,MAAM,EAAC,GAAG,GAAI,GAAG,GAAG,UAAU;;AAChC,CAAC;AAED,EAKG,AALH;;;;;CAKG,AALH,EAKG,CACH,KAAK,CAAC,mCAAa,IAAI,KAAK,EAAE,OAAO,GAAK,CAAC;IACzC,KAAK,CAAC,CAAC,QAAC,KAAK,UAAE,KAAK,SAAE,IAAI,YAAE,OAAO,EAAC,CAAC,GAAG,OAAO;IAC/C,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK;IAClC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK;IAClC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;IAChC,EAAE,EAAE,OAAO,KAAK,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO;IAC9D,MAAM,CAAC,KAAK;AACd,CAAC;AAED,EAMG,AANH;;;;;;CAMG,AANH,EAMG,CACH,KAAK,CAAC,iCAAW,IAAI,aAAa,EAAE,EAAE,EAAE,OAAO,GAAK,CAAC;IACnD,EAAE,EAAE,MAAM,CAAC,aAAa,KAAK,CAAQ,SACnC,MAAM,CAAC,mCAAa,CAAC,EAAE,CAAC,aAAa,GAAG,OAAO;IAEjD,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa;IAEvD,KAAK,CAAC,cAAc,GAAG,aAAa,CAAC,CAAC;IACtC,GAAG,CAAC,UAAU;IACd,GAAG,CAAC,eAAe;IACnB,GAAG,CAAC,QAAQ;IAEZ,MAAM,CAAE,cAAc;QACpB,IAAI,CAAC,CAAa;QAClB,IAAI,CAAC,CAAiB;QACtB,IAAI,CAAC,CAAiB;YACpB,UAAU,GAAG,CAAC;YACd,eAAe,IAAG,CAAC,GAAI,CAAC,GAAG,CAAC,KAAK,CAAC;;YAClC,KAAK;QAEP,IAAI,CAAC,CAAM;YACT,UAAU,GAAG,CAAC;YACd,eAAe,IAAG,CAAC,GAAI,CAAC,GAAG,CAAC,KAAK,CAAC;;YAClC,KAAK;QAEP,IAAI,CAAC,CAAM;YACT,UAAU,GAAG,CAAC;YACd,eAAe,IAAG,CAAC,GAAI,CAAC,GAAG,CAAC,KAAK,CAAC;;YAClC,QAAQ,GAAG,aAAa,CAAC,GAAG;YAC5B,KAAK;QAEP,IAAI,CAAC,CAAO;YACV,UAAU,GAAG,CAAC;YACd,eAAe,IAAG,CAAC,GAAI,CAAC,GAAG,CAAC,KAAK,CAAC;;YAClC,QAAQ,GAAG,aAAa,CAAC,GAAG;YAC5B,KAAK;;IAIT,EAA8B,AAA9B,4BAA8B;IAC9B,KAAK,CAAC,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU;IACnD,KAAK,CAAC,YAAY,GAAG,aAAa,CAAC,KAAK,CAAC,UAAU;IACnD,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,GAAK,CAAC;QAChC,EAAE,EAAE,eAAe,CAAC,CAAC,GACnB,SAAS,CAAC,IAAI,CAAC,iCAAW,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO;aAE3C,SAAS,CAAC,IAAI,CAAC,GAAG;IAEtB,CAAC;IACD,EAAE,EAAE,QAAQ,KAAK,SAAS,EACxB,SAAS,CAAC,IAAI,CAAC,iCAAW,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO;IAGlD,MAAM,CAAC,SAAS;AAClB,CAAC;AAED,EAMG,AANH;;;;;;CAMG,AANH,EAMG,CACH,KAAK,CAAC,sCAAgB,IAAI,SAAS,EAAE,EAAE,EAAE,OAAO,GAAK,CAAC;IACpD,EAAE,EAAE,MAAM,CAAC,SAAS,KAAK,CAAQ,WAAI,KAAK,CAAC,OAAO,CAAC,SAAS,GAC1D,MAAM,CAAC,iCAAW,CAAC,SAAS,EAAE,EAAE,EAAE,OAAO;IAE3C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAK,CAAC;QAClD,GAAG,CAAC,GAAG,IAAI,sCAAgB,CAAC,SAAS,CAAC,GAAG,GAAG,EAAE,EAAE,OAAO;QACvD,MAAM,CAAC,GAAG;IACZ,CAAC,EAAE,CAAC;IAAA,CAAC;AACP,CAAC;AAED,EAOG,AAPH;;;;;;;CAOG,AAPH,EAOG,CACH,KAAK,CAAC,yCAAqB,IAAI,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,GAAG,CAAC;AAAA,CAAC,GAAK,CAAC;IAC9E,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS;IACvD,GAAG,CAAC,MAAM,IAAG,GAAG,GAAI,GAAG;;IAEvB,MAAM,CAAE,QAAQ;QACd,IAAI,CAAC,CAAG;YACN,MAAM,GAAG,mCAAa,CAAC,QAAQ;YAC/B,KAAK;QAEP,IAAI,CAAC,CAAG;YACN,MAAM,GAAG,iCAAW,CAAC,QAAQ;YAC7B,KAAK;QAEP,IAAI,CAAC,CAAG;YACN,MAAM,GAAG,8BAAQ,CAAC,QAAQ;YAC1B,KAAK;QAEP,IAAI,CAAC,CAAG;YACN,MAAM,GAAG,mCAAa,CAAC,QAAQ;YAC/B,KAAK;;YAGL,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,QAAQ,CAAC,yBAAyB;;IAIzD,aAAa,GAAG,sCAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO;IAE3D,MAAM,CAAC,aAAa;AACtB,CAAC;;;;;ACjKM,KAAK,CAAC,yCAAmB,IAAI,SAAS,EAAE,QAAQ,GAAK,CAAC;IAC3D,GAAG,CAAC,KAAK,GAAG,SAAS;IACrB,EAAE,GAAG,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;IAE7C,GAAG,CAAC,SAAS,GAAG,iCAAe,CAAC,KAAK,EAAE,CAAC;QAAC,MAAM,EAAE,CAAC;IAAC,CAAC,EACjD,KAAK,CAAC,CAAI,KACV,IAAI,CAAC,CAAM;IAEd,GAAG,CAAC,YAAY,GAAG,CAAE;IAErB,EAAsF,AAAtF,oFAAsF;IACtF,GAAG,CAAE,KAAK,CAAC,SAAS,IAAI,QAAQ,CAAE,CAAC;QACjC,GAAG,CAAC,SAAS,GAAG,CAAC;QAAA,CAAC;QAElB,EAAE,EAAE,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;YAC1C,GAAG,CAAC,YAAY,GAAG,QAAQ,CAAC,SAAS;YAErC,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,GAAG,CAAC,EAAE,CAAC,IAAM,CAAC;gBAChD,EAAE,EAAE,CAAC,KAAK,CAAQ,WAAI,CAAC,KAAK,CAAO,QAAE,MAAM;gBAC3C,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM;gBAC1D,SAAS,CAAC,CAAC,IAAI,CAAC;YAClB,CAAC;YAED,EAAE,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC;gBACxB,EAAuE,AAAvE,qEAAuE;gBACvE,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC;gBAAA,CAAC,EAAE,MAAM,EACzD,GAAG,EAAE,CAAC,GAAK,CAAC;oBACX,GAAG,CAAC,CAAC,IAAI,aAAM,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,EAAE,OAAO;oBAClD,MAAM,CAAC,GAAG;gBACZ,CAAC,EACD,CAAC;gBAAA,CAAC;gBAGJ,KAAK,CAAC,UAAU,GAAG,CAAC;uBAAI,aAAa;uBAAK,YAAY,CAAC,MAAM;gBAAC,CAAC;gBAE/D,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,GAAG,CAAC,EAAE,CAAC,IAAM,CAAC;oBAC9C,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,IAAI,MAAM;oBACpE,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC;oBAAA,CAAC;oBAC5C,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;gBACzB,CAAC;YACH,CAAC;YAED,EAAE,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC;gBACvB,EAAuE,AAAvE,qEAAuE;gBACvE,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;gBAAA,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,GAAK,CAAC;oBACtE,GAAG,CAAC,CAAC,IAAI,aAAM,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,EAAE,OAAO;oBACjD,MAAM,CAAC,GAAG;gBACZ,CAAC,EAAE,CAAC;gBAAA,CAAC;gBAEL,KAAK,CAAC,SAAS,GAAG,CAAC;uBAAI,YAAY;uBAAK,YAAY,CAAC,KAAK;gBAAC,CAAC;gBAE5D,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,GAAG,CAAC,EAAE,CAAC,IAAM,CAAC;oBAC7C,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,IAAI,MAAM;oBACnE,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,GAAG,CAAC;oBAAA,CAAC;oBAC1C,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;QACD,SAAS,GAAG,iCAAe,CAAC,SAAS,EAAE,CAAC;YAAC,MAAM,EAAE,CAAC;QAAC,CAAC,EACjD,KAAK,CAAC,CAAI,KACV,IAAI,CAAC,CAAQ;QAEhB,YAAY,SACR,YAAY,GAAG,CAAU,YAAG,CAAI,IACnC,yBAAyB,EAAE,SAAS,CAAC;kBACxB,EAAE,SAAS,CAAC;GAC3B;IACD,CAAC;IAED,KAAK,CAAC,WAAW,IAAI;oBACH,EAAE,SAAS,CAAC;;EAE9B,EAAE,YAAY,CAAC;;;;;EAKf;IAEA,MAAM,CAAC,WAAW;AACpB,CAAC;AAEM,KAAK,CAAC,yCAAqB,IAAG,KAAK,GAAI,CAAC;IAC7C,KAAK,CAAC,aAAa,GAAG,CAAC;WAClB,KAAK;QACR,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,EAAC,CAAC,GAAI,CAAC,CAAC,EAAE;;IACpC,CAAC;IAED,KAAK,CAAC,WAAW,IAAI;;;cAGT,EAAE,KAAK,CAAC,IAAI,CAAC;;;0BAGD,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE;AACnE;IAEE,MAAM,CAAC,WAAW;AACpB,CAAC;;","sources":["stamen/mapbox-gl-style-build/src/index.js","stamen/mapbox-gl-style-build/src/lib/build-style.js","stamen/mapbox-gl-style-build/src/lib/merge-overrides.js","stamen/mapbox-gl-style-build/src/lib/merge-variables.js","stamen/mapbox-gl-style-build/src/lib/modify-number-variables.js","stamen/mapbox-gl-style-build/src/lib/create-template.js"],"sourcesContent":["import { buildStyle } from './lib/build-style';\nimport { mergeOverrides } from './lib/merge-overrides';\nimport { mergeVariables } from './lib/merge-variables';\nimport { modifyNumberVariables } from './lib/modify-number-variables';\nimport {\n createLayerTemplate,\n createVariantTemplate\n} from './lib/create-template';\n\nexport {\n mergeOverrides,\n buildStyle,\n mergeVariables,\n modifyNumberVariables,\n createLayerTemplate,\n createVariantTemplate\n};\n","#!/usr/bin/env node\nimport fs from 'fs';\nimport path from 'path';\nimport chalk from 'chalk';\n\nimport { mergeOverrides } from './merge-overrides';\n\n/**\n * Check if a file exists\n *\n * @param {string} path - the file path\n * @return {boolean} whether the file exists\n */\nconst fileExists = (path) => {\n try {\n fs.accessSync(path, fs.constants.R_OK);\n } catch (e) {\n return false;\n }\n return true;\n};\n\n/**\n * Determine whether a value is or contains undefined within it\n *\n * @param {*} v - the value to check\n * @returns {boolean|array}\n */\nconst findUndefined = v => {\n if (v == undefined) return true;\n\n // For objects and arrays, we want to know the keys/indices\n // that contain undefined values\n if (typeof v === 'object' || Array.isArray(v)) {\n const undefinedValues = Object.keys(v)\n .map(key => {\n const undefinedProps = findUndefined(v[key]);\n if (!undefinedProps) return null;\n\n // This is the leaf node, just return the key\n if (typeof undefinedProps === 'boolean') return key;\n\n // Undefined properties are deeper, include key and further branches\n return { [key]: undefinedProps };\n })\n .filter(v => !!v);\n\n return undefinedValues.length ? undefinedValues : false;\n }\n\n return false;\n};\n\n/**\n * Check built layer for validity\n *\n * @param {object} layer - the layer to check\n * @returns {array} an array of validation messages\n */\nconst validateLayer = layer => {\n let messages = [];\n\n const undefinedProps = findUndefined(layer);\n if (undefinedProps?.length) {\n messages = [\n ...messages,\n ...undefinedProps.map(undefinedProp => {\n return `Undefined property at ${JSON.stringify(undefinedProp)}`;\n })\n ];\n }\n\n return messages;\n};\n\n/**\n * Get a useful error message when something goes wrong while building a layer\n *\n * Avoid stack traces, try to find error description and line in the layer file.\n *\n * @param {Error} error - the error object thrown\n * @param {string} name - the layer name\n * @param {string} path - the file path to the layer\n * @returns {string}\n */\nconst getLayerBuildErrorMessage = (error, name, path) => {\n const { stack } = error;\n\n // Get first \"at\" line of stack trace, split : to get line number\n const lineNumber = stack.split('\\n')[1].split(':')[1];\n\n // Load file and get the line at the given lineNumber\n const layerFile = fs.readFileSync(path, 'utf8');\n const layerLine = layerFile.split('\\n')[lineNumber - 1];\n\n return `${chalk.red.bold('Error:')} Couldn't build layer ${chalk.blue(name)}.\n\nDetails: ${error.message} in\n ${chalk.blue(path)}\n\n${lineNumber}: ${layerLine}`;\n};\n\n/**\n * Nicely format a file does not exist error message\n *\n * @param {string} fileType - 'layer' or 'style'\n * @param {string} name - the name of the file being loaded\n * @param {string} path - the file path being loaded\n * @returns {string}\n */\nconst getFileDoesNotExistMessage = (fileType, name, path) => {\n return `\\n${chalk.red.bold('Error:')} Couldn't load ${fileType} ${chalk.blue(name)}, does it exist? Attempted to load from\n ${chalk.blue(path)}\n`;\n};\n\n/**\n * Nicely format a file error message\n *\n * @param {string} fileType - 'layer' or 'style'\n * @param {string} name - the name of the file being loaded\n * @param {string} path - the file path being loaded\n * @param {string} error - the error message\n * @returns {string}\n */\nconst getFileErrorMessage = (fileType, name, path, error) => {\n return `\\n${chalk.red.bold('Error:')} Couldn't load ${fileType} ${chalk.blue(name)}. Received this error:\n\n${chalk.red(error.stack)}\n`;\n};\n\n/**\n * Nicely format and log validation messages for a style\n *\n * @param {string} style - the name of the style\n * @param {object} validationMessages - the validation messages, keyed by layer name\n * @returns {Void}\n */\nconst logValidationMessages = (style, validationMessages) => {\n console.warn(`Found issues in style ${chalk.blue(style)}:`);\n\n Object.keys(validationMessages).forEach(layer => {\n console.warn(` Layer ${chalk.blue(layer)}:`);\n validationMessages[layer].forEach(message => {\n console.warn(` ${message}`);\n });\n });\n\n console.warn('');\n};\n\n/**\n * Load the function that will build the layer.\n *\n * @param {string} name - the layer name\n * @param {string} path - the file path to the layer\n * @returns {function} the layer builder\n */\nconst loadLayerBuilder = (name, path) => {\n if (!fileExists(path)) {\n throw new Error(getFileDoesNotExistMessage('layer', name, path));\n }\n\n try {\n return require(path).default;\n } catch (error) {\n throw new Error(getFileErrorMessage('layer', name, path, error));\n }\n};\n\n/**\n * Load a style, wrapped here to catch and format errors.\n *\n * @param {string} path - the file path to the style\n * @param {string} name - the style name\n * @returns {object}\n */\nconst loadStyle = (name, path) => {\n if (!fileExists(path)) {\n throw new Error(getFileDoesNotExistMessage('style', name, path));\n }\n\n try {\n return require(path);\n } catch (error) {\n throw new Error(getFileErrorMessage('style', name, path, error));\n }\n};\n\n/**\n * Build a layer\n *\n * @param {object} context - the context, which contains variables for the layer\n * @param {string} name - the layer name\n * @param {string} path - the file path to the layer\n * @returns {object}\n */\nconst buildLayer = (context, name, path) => {\n const builder = loadLayerBuilder(name, path);\n\n let layer;\n try {\n layer = builder(context);\n } catch (error) {\n throw new Error(getLayerBuildErrorMessage(error, name, path));\n }\n\n return mergeOverrides(layer.baseStyle, layer.overrides);\n};\n\n/**\n * Build style\n *\n * @param {string} name - the name of the style to build\n * @param {string} styleDir - the input directory that contains styles\n * @param {string} layerDir - the input directory that contains layers\n * @returns {Object}\n */\nexport const buildStyle = (stylePath, layerDir, options = {}) => {\n if (!stylePath) {\n throw new Error('Must provide stylePath.');\n }\n if (!layerDir) {\n throw new Error('Must provide layerDir.');\n }\n\n const name = path.basename(stylePath, '.js');\n\n const verbose = options?.verbose ?? false;\n\n const { context, template } = loadStyle(name, path.resolve(stylePath));\n\n const styleJson = JSON.parse(JSON.stringify(template));\n\n let validationMessages = {};\n\n if (verbose) {\n console.log(`Building style ${chalk.blue(name)}`);\n }\n\n styleJson.layers = template.layers.map(layerName => {\n if (verbose) {\n console.log(` Adding layer ${chalk.blue(layerName)}`);\n }\n\n const layerPath = path.resolve(layerDir, `${layerName}.js`);\n const layer = buildLayer(context, layerName, layerPath);\n\n // Collect validation messages for each layer\n const layerValidationMessages = validateLayer(layer);\n if (layerValidationMessages.length) {\n validationMessages[layerName] = layerValidationMessages;\n }\n\n return layer;\n });\n\n if (Object.keys(validationMessages).length > 0) {\n logValidationMessages(name, validationMessages);\n }\n\n return styleJson;\n};\n","import cloneDeep from 'lodash.clonedeep';\n\n/**\n * Merge overrides with a baseStyle or other overrides\n *\n * paint and layout overrides do not fully overwrite paint and layout values in\n * the baseStyle, however, they add or replaces specific properties. In this\n * way, an overrides object can specify a single paint property to modify or add\n * without overwriting all of the paint properties of the baseStyle.\n *\n * @param {object} baseStyle\n * @param {object} overrides\n * @returns {object}\n */\nexport const mergeOverrides = (baseStyle, overrides) => {\n const extended = cloneDeep(baseStyle);\n\n Object.entries(overrides).forEach(([k, v]) => {\n if (k === 'layout' || k === 'paint') {\n extended[k] = { ...extended[k], ...v };\n } else {\n extended[k] = v;\n }\n });\n\n return extended;\n};\n","const isObject = v => typeof v === 'object' && !Array.isArray(v) && !!v;\n\n/**\n * Merge the current object of variables with an extender object. Variables\n * defined in extender will override variables defined in the current variables,\n * if there is overlap. Nested variables are taken into account.\n * @param {Object} current - the original variable object\n * @param {Object} extender - the extender variable object, containing overrides\n * @returns {Object} - the merged variables\n */\nconst merge = (current, extender) => {\n const merged = JSON.parse(JSON.stringify(current));\n\n Object.keys(extender).forEach(k => {\n // Handle nested variables\n if (isObject(current[k]) && isObject(extender[k])) {\n merged[k] = merge(current[k], extender[k]);\n }\n else {\n merged[k] = JSON.parse(JSON.stringify(extender[k]));\n }\n });\n\n return merged;\n};\n\n\n/**\n * Merge any number of variable objects\n * @param {...Object} variableGroups - one or many variable objects, each \n * passed as a separate parameter\n * @returns {Object} the merged variable object\n */\nexport const mergeVariables = (...variableGroups) => {\n return variableGroups.reduce((acc, cur) => merge(acc, cur), {});\n};\n","/**\n * Returns a new function that divides a number by the modifier passed here\n * @param {number} divisor - number to divide by in the output function\n * @returns {Function} - a function that multiplies a number by the modifier passed\n */\nconst getDivideFn = divisor => {\n return num => num / divisor;\n};\n/**\n * Returns a new function that subtracts from a number by the modifier passed here\n * @param {number} toSubtract - number to subtract in the output function\n * @returns {Function} - a function that multiplies a number by the modifier passed\n */\nconst getSubtractFn = toSubtract => {\n return num => num - toSubtract;\n};\n/**\n * Returns a new function that adds to a number by the modifier passed here\n * @param {number} toAdd - number to add in the output function\n * @returns {Function} - a function that multiplies a number by the modifier passed\n */\nconst getAddFn = toAdd => {\n return num => num + toAdd;\n};\n/**\n * Returns a new function that multiplies a number by the modifier passed here\n * @param {number} multiplier - number to multiply by in the output function\n * @returns {Function} - a function that multiplies a number by the modifier passed\n */\nconst getMultiplyFn = multiplier => {\n return num => num * multiplier;\n};\n\n/**\n * Modifies the property value after the transform function using options\n * @param {Array|number} value - property value of the variable\n * @param {Object} [options] - options object with keys: round?: boolean, floor?: boolean, ceil?: boolean, toFixed?: number\n * @returns {Array|number} - the modified property values from the options\n */\nconst handleOptions = (value, options) => {\n const { round, floor, ceil, toFixed } = options;\n if (round) return Math.round(value);\n if (floor) return Math.floor(value);\n if (ceil) return Math.ceil(value);\n if (toFixed !== undefined) return Number(value.toFixed(toFixed));\n return value;\n};\n\n/**\n * Modifies the property value of the variable with the transform function\n * @param {Array|number} propertyValue - property value of the variable\n * @param {Function} fn - function to run the value or expression output values through\n * @param {Object} [options] - options object with keys: round?: boolean, floor?: boolean, ceil?: boolean, toFixed?: number\n * @returns {Array|number} - the modified property values\n */\nconst modifyValue = (propertyValue, fn, options) => {\n if (typeof propertyValue === 'number') {\n return handleOptions(fn(propertyValue), options);\n }\n if (!Array.isArray(propertyValue)) return propertyValue;\n\n const expressionType = propertyValue[0];\n let sliceIndex;\n let outputCondition;\n let fallback;\n\n switch (expressionType) {\n case 'interpolate':\n case 'interpolate-hcl':\n case 'interpolate-lab': {\n sliceIndex = 3;\n outputCondition = i => i % 2 !== 0;\n break;\n }\n case 'step': {\n sliceIndex = 2;\n outputCondition = i => i % 2 === 0;\n break;\n }\n case 'case': {\n sliceIndex = 1;\n outputCondition = i => i % 2 !== 0;\n fallback = propertyValue.pop();\n break;\n }\n case 'match': {\n sliceIndex = 2;\n outputCondition = i => i % 2 !== 0;\n fallback = propertyValue.pop();\n break;\n }\n }\n\n // Rebuild modified expression\n const nextValue = propertyValue.slice(0, sliceIndex);\n const inputOutputs = propertyValue.slice(sliceIndex);\n inputOutputs.forEach((val, i) => {\n if (outputCondition(i)) {\n nextValue.push(modifyValue(val, fn, options));\n } else {\n nextValue.push(val);\n }\n });\n if (fallback !== undefined) {\n nextValue.push(modifyValue(fallback, fn, options));\n }\n\n return nextValue;\n};\n\n/**\n * Recurses the variables object to find the actual property values\n * @param {Object|Array|number} variables - the original variable object or variable\n * @param {Function} fn - function to run the value or expression output values through\n * @param {Object} [options] - options object with keys: round?: boolean, floor?: boolean, ceil?: boolean, toFixed?: number\n * @returns {Object} - the modified variables\n */\nconst replaceVariables = (variables, fn, options) => {\n if (typeof variables !== 'object' || Array.isArray(variables)) {\n return modifyValue(variables, fn, options);\n }\n return Object.keys(variables).reduce((acc, key) => {\n acc[key] = replaceVariables(variables[key], fn, options);\n return acc;\n }, {});\n};\n\n/**\n * Modify number values in variables using a math operation\n * @param {Object|Array|number} variables - the original variable object or variable\n * @param {string} operator - Math operation, one of - '*', '/', '+', '-'\n * @param {number} modifier - number argument to modify value by\n * @param {Object} [options] - options object with keys: round?: boolean, floor?: boolean, ceil?: boolean, toFixed?: number\n * @returns {Object} - the modified variables\n */\nconst modifyNumberVariables = (variables, operator, modifier, options = {}) => {\n let nextVariables = JSON.parse(JSON.stringify(variables));\n let mathFn = num => num;\n\n switch (operator) {\n case '*': {\n mathFn = getMultiplyFn(modifier);\n break;\n }\n case '/': {\n mathFn = getDivideFn(modifier);\n break;\n }\n case '+': {\n mathFn = getAddFn(modifier);\n break;\n }\n case '-': {\n mathFn = getSubtractFn(modifier);\n break;\n }\n default: {\n throw new Error(`${operator} is not a valid operator.`);\n }\n }\n\n nextVariables = replaceVariables(variables, mathFn, options);\n\n return nextVariables;\n};\n\nexport { modifyNumberVariables };\n","import stringifyPretty from 'json-stringify-pretty-compact';\nimport { latest } from '@mapbox/mapbox-gl-style-spec';\n\nexport const createLayerTemplate = (baseLayer, variants) => {\n let layer = baseLayer;\n if (!layer) layer = Object.values(variants)[0];\n\n let baseStyle = stringifyPretty(layer, { indent: 2 })\n .split('\\n')\n .join('\\n ');\n\n let allOverrides = '';\n\n // TODO currently making the primary differentiator style id until we sort differences\n for (const styleName in variants) {\n let overrides = {};\n\n if (layer && Object.keys(variants).length) {\n let variantLayer = variants[styleName];\n\n Object.entries(variantLayer).forEach(([k, v]) => {\n if (k === 'layout' || k === 'paint') return;\n if (JSON.stringify(v) === JSON.stringify(layer[k])) return;\n overrides[k] = v;\n });\n\n if (variantLayer.layout) {\n // If a property does not exist on a variant, override with the default\n const defaultLayout = Object.keys(layer.layout || {}).reduce(\n (acc, k) => {\n acc[k] = latest[`layout_${layer.type}`][k].default;\n return acc;\n },\n {}\n );\n\n const fullLayout = { ...defaultLayout, ...variantLayer.layout };\n\n Object.entries(fullLayout).forEach(([k, v]) => {\n if (JSON.stringify(v) === JSON.stringify(layer?.layout?.[k])) return;\n if (!overrides.layout) overrides.layout = {};\n overrides.layout[k] = v;\n });\n }\n\n if (variantLayer.paint) {\n // If a property does not exist on a variant, override with the default\n const defaultPaint = Object.keys(layer.paint || {}).reduce((acc, k) => {\n acc[k] = latest[`paint_${layer.type}`][k].default;\n return acc;\n }, {});\n\n const fullPaint = { ...defaultPaint, ...variantLayer.paint };\n\n Object.entries(fullPaint).forEach(([k, v]) => {\n if (JSON.stringify(v) === JSON.stringify(layer?.paint?.[k])) return;\n if (!overrides.paint) overrides.paint = {};\n overrides.paint[k] = v;\n });\n }\n }\n overrides = stringifyPretty(overrides, { indent: 2 })\n .split('\\n')\n .join('\\n ');\n\n allOverrides += `${\n !!allOverrides ? ' else if' : 'if'\n } (context.styleName === '${styleName}') {\n overrides = ${overrides};\n }`;\n }\n\n const fileContent = `module.exports.default = (context) => {\n const baseStyle = ${baseStyle};\n let overrides = {};\n ${allOverrides}\n return {\n baseStyle,\n overrides\n };\n};`;\n\n return fileContent;\n};\n\nexport const createVariantTemplate = style => {\n const templateStyle = {\n ...style,\n layers: style.layers.map(l => l.id)\n };\n\n const fileContent = `module.exports.context = {\n colors: {\n },\n styleName: '${style.name}'\n};\n\nmodule.exports.template = ${JSON.stringify(templateStyle, null, 2)};\n`;\n\n return fileContent;\n};\n"],"names":[],"version":3,"file":"module.js.map"} \ No newline at end of file diff --git a/examples/missing-variable-error/build/simple-style/style.json b/examples/missing-variable-error/build/simple-style/style.json new file mode 100644 index 0000000..7b13972 --- /dev/null +++ b/examples/missing-variable-error/build/simple-style/style.json @@ -0,0 +1,36 @@ +{ + "version": 8, + "name": "simple", + "sources": { + "Example": {"type": "vector", "url": "https://example.com/source.json"} + }, + "sprite": "https://example.com/sprites/sprite", + "glyphs": "https://example.com/{fontstack}/{range}.pbf", + "layers": [ + { + "id": "land", + "type": "background", + "paint": { + "background-color": [ + "interpolate", + ["linear"], + ["zoom"], + 8, + "red", + 16, + "blue" + ] + } + }, + { + "id": "road", + "type": "line", + "source": "Example", + "source-layer": "roads", + "minzoom": 16, + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": {"line-width": 5} + } + ], + "id": "example-simple" +} \ No newline at end of file diff --git a/examples/missing-variable-error/templates/layers/layer1.js b/examples/missing-variable-error/templates/layers/layer1.js new file mode 100644 index 0000000..60512f7 --- /dev/null +++ b/examples/missing-variable-error/templates/layers/layer1.js @@ -0,0 +1,24 @@ +module.exports.default = (context) => { + const baseStyle = { + "id": "land", + "type": "background", + "paint": { + "background-color": [ + "interpolate", + ["linear"], + ["zoom"], + 8, + context.colors.backgroundLow, + 16, + context.colors.backgroundHigh + ] + } + }; + + let overrides = {}; + + return { + baseStyle, + overrides + }; +}; diff --git a/examples/missing-variable-error/templates/layers/layer2.js b/examples/missing-variable-error/templates/layers/layer2.js new file mode 100644 index 0000000..1840c99 --- /dev/null +++ b/examples/missing-variable-error/templates/layers/layer2.js @@ -0,0 +1,24 @@ +module.exports.default = context => { + const baseStyle = { + id: 'road', + type: 'line', + source: context.sources.root, + 'source-layer': 'roads', + minzoom: 16, + layout: { + 'line-cap': 'round', + 'line-join': 'round' + }, + paint: { + 'line-width': 5, + 'line-color': context.colors.road + } + }; + + let overrides = {}; + + return { + baseStyle, + overrides + }; +}; diff --git a/examples/missing-variable-error/templates/styles/simple-style.js b/examples/missing-variable-error/templates/styles/simple-style.js new file mode 100644 index 0000000..5d4dd82 --- /dev/null +++ b/examples/missing-variable-error/templates/styles/simple-style.js @@ -0,0 +1,24 @@ +module.exports.context = { + sources: { + root: 'Example' + }, + colors: { + backgroundLow: 'red', + backgroundHigh: 'blue' + } +}; + +module.exports.template = { + version: 8, + name: 'simple', + sources: { + Example: { + type: 'vector', + url: 'https://example.com/source.json' + } + }, + sprite: 'https://example.com/sprites/sprite', + glyphs: 'https://example.com/{fontstack}/{range}.pbf', + layers: ['layer1', 'layer2'], + id: 'example-simple' +}; diff --git a/package.json b/package.json index 6b4c5d3..8740009 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "chalk": "4.1.2", "fast-glob": "^3.2.11", "json-stringify-pretty-compact": "^3.0.0", + "lodash.clonedeep": "^4.5.0", "mapbox-gl-style-format": "git+https://github.com/stamen/mapbox-gl-style-format#v0.1.1", "yargs": "^17.2.1" }, diff --git a/src/lib/__test__/merge-overrides.test.js b/src/lib/__test__/merge-overrides.test.js index 75789f3..5b54879 100644 --- a/src/lib/__test__/merge-overrides.test.js +++ b/src/lib/__test__/merge-overrides.test.js @@ -20,19 +20,19 @@ describe('mergeOverrides', () => { test('works with paint overrides', () => { const base = { paint: { - "fill-color": "red" + 'fill-color': 'red' } }; const overrides = { paint: { - "fill-opacity": 0.5 + 'fill-opacity': 0.5 } }; const expected = { paint: { - "fill-color": "red", - "fill-opacity": 0.5 + 'fill-color': 'red', + 'fill-opacity': 0.5 } }; @@ -43,19 +43,19 @@ describe('mergeOverrides', () => { test('works with layout overrides', () => { const base = { layout: { - "line-cap": "round" + 'line-cap': 'round' } }; const overrides = { layout: { - "line-join": "round" + 'line-join': 'round' } }; const expected = { layout: { - "line-cap": "round", - "line-join": "round" + 'line-cap': 'round', + 'line-join': 'round' } }; @@ -69,16 +69,16 @@ describe('mergeOverrides', () => { }; const overrides = { paint: { - "fill-color": "red", - "fill-opacity": 0.5 + 'fill-color': 'red', + 'fill-opacity': 0.5 } }; const expected = { id: 'base', paint: { - "fill-color": "red", - "fill-opacity": 0.5 + 'fill-color': 'red', + 'fill-opacity': 0.5 } }; @@ -89,21 +89,21 @@ describe('mergeOverrides', () => { test('works with paint overrides, same properties', () => { const base = { paint: { - "fill-color": "green", - "fill-opacity": 1 + 'fill-color': 'green', + 'fill-opacity': 1 } }; const overrides = { paint: { - "fill-color": "red", - "fill-opacity": 0.5 + 'fill-color': 'red', + 'fill-opacity': 0.5 } }; const expected = { paint: { - "fill-color": "red", - "fill-opacity": 0.5 + 'fill-color': 'red', + 'fill-opacity': 0.5 } }; @@ -114,24 +114,34 @@ describe('mergeOverrides', () => { test('works with paint overrides, partial properties', () => { const base = { paint: { - "fill-color": "green", - "fill-opacity": 1 + 'fill-color': 'green', + 'fill-opacity': 1 } }; const overrides = { paint: { - "fill-opacity": 0.5 + 'fill-opacity': 0.5 } }; const expected = { paint: { - "fill-color": "green", - "fill-opacity": 0.5 + 'fill-color': 'green', + 'fill-opacity': 0.5 } }; const actual = mergeOverrides(base, overrides); expect(actual).toEqual(expected); }); + + test('does not remove undefined properties', () => { + const base = { id: 'base', paint: { 'line-color': undefined } }; + const overrides = {}; + + const actual = mergeOverrides(base, overrides); + + // toStrictEqual doesn't ignore undefined values + expect(actual).toStrictEqual(base); + }); }); diff --git a/src/lib/merge-overrides.js b/src/lib/merge-overrides.js index b01f506..1c18bc0 100644 --- a/src/lib/merge-overrides.js +++ b/src/lib/merge-overrides.js @@ -1,3 +1,5 @@ +import cloneDeep from 'lodash.clonedeep'; + /** * Merge overrides with a baseStyle or other overrides * @@ -11,7 +13,7 @@ * @returns {object} */ export const mergeOverrides = (baseStyle, overrides) => { - const extended = JSON.parse(JSON.stringify(baseStyle)); + const extended = cloneDeep(baseStyle); Object.entries(overrides).forEach(([k, v]) => { if (k === 'layout' || k === 'paint') { @@ -23,4 +25,3 @@ export const mergeOverrides = (baseStyle, overrides) => { return extended; }; - diff --git a/yarn.lock b/yarn.lock index 2bd28d5..5f4d656 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3524,6 +3524,11 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"