{"version":3,"file":"index.cjs","sources":["../src/lib/get-replaced-value.js","../src/lib/is-env-func.js","../src/lib/import-from.js","../src/index.js"],"sourcesContent":["import valuesParser from 'postcss-value-parser';\nimport isEnvFunc from './is-env-func';\n\n/**\n * @param {string} originalValue\n * @param variables\n * @returns {string} returns a value replaced with environment variables\n */\nexport default (originalValue, variables) => {\n\t// get the ast of the original value\n\tconst ast = valuesParser(originalValue);\n\n\tast.walk(node => {\n\t\tif (isEnvFunc(node)) {\n\t\t\tconst [valueNode] = node.nodes;\n\n\t\t\tif (valueNode.type === 'word' && typeof variables[valueNode.value] !== 'undefined') {\n\t\t\t\tnode.nodes = [];\n\t\t\t\tnode.type = 'word';\n\t\t\t\tnode.value = variables[valueNode.value];\n\t\t\t}\n\t\t}\n\t});\n\n\t// return the stringified ast\n\treturn ast.toString();\n};\n","// returns whether a node is a css env() function\nexport default (node) => node && node.type === 'function' && node.value === 'env';\n","import fs from 'fs';\nimport path from 'path';\n\n/**\n * Import Custom Properties from Object\n * @param {{environmentVariables: Record<string, string>, 'environment-variables': Record<string, string>}} object\n * @returns {Object}\n */\nfunction importEnvironmentVariablesFromObject(object) {\n\treturn Object.assign(\n\t\t{},\n\t\tObject(object).environmentVariables || Object(object)['environment-variables'],\n\t);\n}\n\n/**\n * Import Custom Properties from JSON file\n * @param {string} from\n * @returns {Promise<Record<string, import('postcss-values-parser').Root>>}\n */\nasync function importEnvironmentVariablesFromJSONFile(from) {\n\tconst object = await readJSON(path.resolve(from));\n\n\treturn importEnvironmentVariablesFromObject(object);\n}\n\n/**\n * Import Custom Properties from JS file\n * @param {string} from\n * @returns {Promise<Record<string, import('postcss-values-parser').Root>>}\n */\nasync function importEnvironmentVariablesFromJSFile(from) {\n\tconst object = await import(path.resolve(from));\n\n\treturn importEnvironmentVariablesFromObject(object);\n}\n\n/**\n * Import Custom Properties from Sources\n * @param {(string|Function|Promise|{type:string,environmentVariables: Record<string, string>, 'environment-variables': Record<string, string>})[]} sources\n * @returns {Promise<Record<string, import('postcss-values-parser').Root>>}\n */\nexport default function importEnvironmentVariablesFromSources(sources) {\n\treturn sources.map(source => {\n\t\tif (source instanceof Promise) {\n\t\t\treturn source;\n\t\t} else if (source instanceof Function) {\n\t\t\treturn source();\n\t\t}\n\n\t\t// read the source as an object\n\t\tconst opts = source === Object(source) ? source : { from: String(source) };\n\n\t\t// skip objects with Custom Properties\n\t\tif (opts.environmentVariables || opts['environment-variables']) {\n\t\t\treturn opts;\n\t\t}\n\n\t\t// source pathname\n\t\tconst from = String(opts.from || '');\n\n\t\t// type of file being read from\n\t\tconst type = (opts.type || path.extname(from).slice(1)).toLowerCase();\n\n\t\treturn { type, from };\n\t}).reduce(async (environmentVariables, source) => {\n\t\tconst { type, from } = await source;\n\n\t\tif (type === 'js' || type === 'cjs') {\n\t\t\treturn Object.assign(environmentVariables, await importEnvironmentVariablesFromJSFile(from));\n\t\t}\n\n\t\tif (type === 'json') {\n\t\t\treturn Object.assign(environmentVariables, await importEnvironmentVariablesFromJSONFile(from));\n\t\t}\n\n\t\treturn Object.assign(environmentVariables, importEnvironmentVariablesFromObject(await source));\n\t}, {});\n}\n\n/* Helper utilities\n/* ========================================================================== */\n\n/**\n * @param {string} from\n * @returns {Promise<string>}\n */\nconst readFile = from => new Promise((resolve, reject) => {\n\tfs.readFile(from, 'utf8', (error, result) => {\n\t\tif (error) {\n\t\t\treject(error);\n\t\t} else {\n\t\t\tresolve(result);\n\t\t}\n\t});\n});\n\nconst readJSON = async from => JSON.parse(await readFile(from));\n","import getReplacedValue from './lib/get-replaced-value';\nimport importEnvironmentVariablesFromSources from './lib/import-from';\n\n/**\n * @param {{importFrom?: string[]}} opts\n * @returns {import('postcss').Plugin}\n */\nexport default function creator(opts) {\n\t// sources to import environment variables from\n\tconst importFrom = [].concat(Object(opts).importFrom || []);\n\n\t// promise any environment variables are imported\n\tconst environmentVariablesPromise = importEnvironmentVariablesFromSources(importFrom);\n\n\treturn {\n\t\tpostcssPlugin: 'postcss-env-fn',\n\t\tasync AtRule(atRule, { result }) {\n\t\t\tlet replacedValue;\n\n\t\t\ttry {\n\t\t\t\treplacedValue = getReplacedValue(atRule.params, await environmentVariablesPromise);\n\t\t\t} catch (error) {\n\t\t\t\tatRule.warn(\n\t\t\t\t\tresult,\n\t\t\t\t\t`Failed to parse params '${atRule.params}' as an environment value. Leaving the original value intact.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (typeof replacedValue === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (replacedValue !== atRule.params) {\n\t\t\t\tatRule.params = replacedValue;\n\t\t\t}\n\t\t},\n\t\tasync Declaration(decl, { result }) {\n\t\t\tlet replacedValue;\n\n\t\t\ttry {\n\t\t\t\treplacedValue = getReplacedValue(decl.value, await environmentVariablesPromise);\n\t\t\t} catch (error) {\n\t\t\t\tdecl.warn(\n\t\t\t\t\tresult,\n\t\t\t\t\t`Failed to parse value '${decl.value}' as an environment value. Leaving the original value intact.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (typeof replacedValue === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (replacedValue !== decl.value) {\n\t\t\t\tdecl.value = replacedValue;\n\t\t\t}\n\t\t},\n\t};\n}\n\ncreator.postcss = true;\n"],"names":["originalValue","variables","ast","valuesParser","walk","node","type","value","isEnvFunc","valueNode","nodes","toString","importEnvironmentVariablesFromObject","object","Object","assign","environmentVariables","importEnvironmentVariablesFromSources","sources","map","source","Promise","Function","opts","from","String","path","extname","slice","toLowerCase","reduce","async","resolve","importEnvironmentVariablesFromJSFile","readJSON","importEnvironmentVariablesFromJSONFile","JSON","parse","reject","fs","readFile","error","result","creator","environmentVariablesPromise","concat","importFrom","postcssPlugin","atRule","replacedValue","getReplacedValue","params","warn","decl","postcss"],"mappings":"wdAQgBA,EAAeC,WAExBC,EAAMC,UAAaH,UAEzBE,EAAIE,MAAKC,QCXMA,GAASA,GAAsB,aAAdA,EAAKC,MAAsC,QAAfD,EAAKE,MDY5DC,CAAUH,GAAO,OACbI,GAAaJ,EAAKK,MAEF,SAAnBD,EAAUH,WAAyD,IAA/BL,EAAUQ,EAAUF,SAC3DF,EAAKK,MAAQ,GACbL,EAAKC,KAAO,OACZD,EAAKE,MAAQN,EAAUQ,EAAUF,YAM7BL,EAAIS,YEjBZ,SAASC,EAAqCC,UACtCC,OAAOC,OACb,GACAD,OAAOD,GAAQG,sBAAwBF,OAAOD,GAAQ,0BA+BzC,SAASI,EAAsCC,UACtDA,EAAQC,KAAIC,OACdA,aAAkBC,eACdD,EACD,GAAIA,aAAkBE,gBACrBF,UAIFG,EAAOH,IAAWN,OAAOM,GAAUA,EAAS,CAAEI,KAAMC,OAAOL,OAG7DG,EAAKP,sBAAwBO,EAAK,gCAC9BA,QAIFC,EAAOC,OAAOF,EAAKC,MAAQ,UAK1B,CAAElB,MAFKiB,EAAKjB,MAAQoB,UAAKC,QAAQH,GAAMI,MAAM,IAAIC,cAEzCL,KAAAA,MACbM,QAAOC,MAAOf,EAAsBI,WAChCd,KAAEA,EAAFkB,KAAQA,SAAeJ,QAEhB,OAATd,GAA0B,QAATA,EACbQ,OAAOC,OAAOC,QAtCxBe,eAAoDP,GAC9B,aAEdZ,UAFqBc,UAAKM,QAAQR,gEAqCUS,CAAqCT,IAG1E,SAATlB,EACIQ,OAAOC,OAAOC,QArDxBe,eAAsDP,UAG9CZ,QAFcsB,EAASR,UAAKM,QAAQR,KAoDQW,CAAuCX,IAGlFV,OAAOC,OAAOC,EAAsBJ,QAA2CQ,MACpF,IAUJ,MAUMc,EAAWH,MAAAA,GAAcK,KAAKC,WAVnBb,CAAAA,GAAQ,IAAIH,SAAQ,CAACW,EAASM,KAC9CC,UAAGC,SAAShB,EAAM,QAAQ,CAACiB,EAAOC,KAC7BD,EACHH,EAAOG,GAEPT,EAAQU,SAKqCF,CAAShB,IC1F1C,SAASmB,EAAQpB,SAKzBqB,EAA8B3B,EAHjB,GAAG4B,OAAO/B,OAAOS,GAAMuB,YAAc,WAKjD,CACNC,cAAe,8BACFC,GAAQN,OAAEA,QAClBO,MAGHA,EAAgBC,EAAiBF,EAAOG,aAAcP,GACrD,MAAOH,GACRO,EAAOI,KACNV,EACC,2BAA0BM,EAAOG,4EAIP,IAAlBF,GAIPA,IAAkBD,EAAOG,SAC5BH,EAAOG,OAASF,sBAGAI,GAAMX,OAAEA,QACrBO,MAGHA,EAAgBC,EAAiBG,EAAK9C,YAAaqC,GAClD,MAAOH,GACRY,EAAKD,KACJV,EACC,0BAAyBW,EAAK9C,2EAIJ,IAAlB0C,GAIPA,IAAkBI,EAAK9C,QAC1B8C,EAAK9C,MAAQ0C,KAMjBN,EAAQW,SAAU"}