@layerfig/config
Version:
Layer and runtime-validate type-safe configs for JavaScript apps.
1 lines • 3.04 kB
Source Map (JSON)
{"version":3,"file":"utils-q9FK7xDA.cjs","names":["target: T","filePath: string"],"sources":["../src/utils/merge.ts","../src/utils/read-if-exist.ts"],"sourcesContent":["import { isPlainObject } from \"./is-plain-object\";\n\ntype MergeResult<T extends Record<string, unknown>[]> = T extends [\n\tinfer First,\n\t...infer Rest,\n]\n\t? First extends Record<string, unknown>\n\t\t? Rest extends Record<string, unknown>[]\n\t\t\t? First & MergeResult<Rest>\n\t\t\t: First\n\t\t: Record<string, unknown>\n\t: Record<string, unknown>;\n\n/**\n * Deep merge objects (lodash merge replacement)\n * More flexible version that accepts any objects\n */\nexport function merge<\n\tT extends Record<string, unknown>,\n\tU extends Record<string, unknown>[],\n>(target: T, ...sources: U): T & MergeResult<U>;\nexport function merge<T extends Record<string, unknown>>(\n\ttarget: T,\n\t...sources: Record<string, unknown>[]\n): T & Record<string, unknown> {\n\tif (!sources.length) return target;\n\tconst source = sources.shift();\n\n\tif (!source) return merge(target, ...sources);\n\n\tif (isPlainObject(target) && isPlainObject(source)) {\n\t\tfor (const key in source) {\n\t\t\tconst sourceValue = source[key];\n\t\t\tconst targetValue = target[key];\n\n\t\t\tif (isPlainObject(sourceValue)) {\n\t\t\t\tif (!targetValue || !isPlainObject(targetValue)) {\n\t\t\t\t\t(target as Record<string, unknown>)[key] = {};\n\t\t\t\t}\n\t\t\t\tmerge(target[key] as Record<string, unknown>, sourceValue);\n\t\t\t} else {\n\t\t\t\t(target as Record<string, unknown>)[key] = sourceValue;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn merge(target, ...sources) as T & Record<string, unknown>;\n}\n","import fs from \"node:fs\";\nimport { z } from \"zod\";\n\nimport type { Result } from \"../types\";\n\nexport function readIfExist(filePath: string): Result<string, string> {\n\tif (fs.existsSync(filePath)) {\n\t\tconst fileContent = fs.readFileSync(filePath, \"utf8\");\n\n\t\tconst fileContentResult = z.string().safeParse(fileContent);\n\n\t\tif (fileContentResult.success) {\n\t\t\treturn {\n\t\t\t\tok: true,\n\t\t\t\tdata: fileContentResult.data,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tok: false,\n\t\t\terror: \"File content is not a string.\",\n\t\t};\n\t}\n\n\treturn {\n\t\tok: false,\n\t\terror: `File \"${filePath}\" does not exist`,\n\t};\n}\n"],"mappings":";;;;;AAqBA,SAAgB,MACfA,QACA,GAAG,SAC2B;AAC9B,MAAK,QAAQ,OAAQ,QAAO;CAC5B,MAAM,SAAS,QAAQ,OAAO;AAE9B,MAAK,OAAQ,QAAO,MAAM,QAAQ,GAAG,QAAQ;AAE7C,KAAI,0BAAc,OAAO,IAAI,0BAAc,OAAO,CACjD,MAAK,MAAM,OAAO,QAAQ;EACzB,MAAM,cAAc,OAAO;EAC3B,MAAM,cAAc,OAAO;AAE3B,MAAI,0BAAc,YAAY,EAAE;AAC/B,QAAK,gBAAgB,0BAAc,YAAY,CAC9C,CAAC,OAAmC,OAAO,CAAE;AAE9C,SAAM,OAAO,MAAiC,YAAY;EAC1D,MACA,CAAC,OAAmC,OAAO;CAE5C;AAGF,QAAO,MAAM,QAAQ,GAAG,QAAQ;AAChC;;;;AC1CD,SAAgB,YAAYC,UAA0C;AACrE,KAAI,gBAAG,WAAW,SAAS,EAAE;EAC5B,MAAM,cAAc,gBAAG,aAAa,UAAU,OAAO;EAErD,MAAM,oBAAoB,MAAE,QAAQ,CAAC,UAAU,YAAY;AAE3D,MAAI,kBAAkB,QACrB,QAAO;GACN,IAAI;GACJ,MAAM,kBAAkB;EACxB;AAGF,SAAO;GACN,IAAI;GACJ,OAAO;EACP;CACD;AAED,QAAO;EACN,IAAI;EACJ,QAAQ,QAAQ,SAAS;CACzB;AACD"}