@zwave-js/config 15.25.0 → 15.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/build/cjs/JsonTemplate.d.ts +21 -0
  2. package/build/cjs/JsonTemplate.js +50 -28
  3. package/build/cjs/JsonTemplate.js.map +2 -2
  4. package/build/cjs/Logic.js +1 -0
  5. package/build/cjs/Logic.js.map +2 -2
  6. package/build/cjs/_version.d.ts +1 -1
  7. package/build/cjs/_version.js +1 -1
  8. package/build/cjs/_version.js.map +1 -1
  9. package/build/cjs/index.d.ts +1 -0
  10. package/build/cjs/index.js +10 -1
  11. package/build/cjs/index.js.map +2 -2
  12. package/build/esm/JsonTemplate.d.ts +21 -0
  13. package/build/esm/JsonTemplate.d.ts.map +1 -1
  14. package/build/esm/JsonTemplate.js +78 -34
  15. package/build/esm/JsonTemplate.js.map +1 -1
  16. package/build/esm/Logic.d.ts.map +1 -1
  17. package/build/esm/Logic.js +1 -0
  18. package/build/esm/Logic.js.map +1 -1
  19. package/build/esm/_version.d.ts +1 -1
  20. package/build/esm/_version.js +1 -1
  21. package/build/esm/index.d.ts +1 -0
  22. package/build/esm/index.d.ts.map +1 -1
  23. package/build/esm/index.js +1 -0
  24. package/build/esm/index.js.map +1 -1
  25. package/config/devices/0x015f/mh-5900.json +1044 -2
  26. package/config/devices/0x015f/templates/mcohome_template.json +21 -0
  27. package/config/devices/0x0267/10002020-13x.json +4 -0
  28. package/config/devices/0x0267/10002080-13x.json +16 -0
  29. package/config/devices/0x027a/templates/zooz_template.json +14 -0
  30. package/config/devices/0x027a/zac36.json +127 -0
  31. package/config/devices/0x027a/zen04.json +4 -3
  32. package/config/devices/0x027a/zen05.json +132 -0
  33. package/config/devices/0x027a/zen06.json +57 -1
  34. package/config/devices/0x027a/zen14.json +2 -1
  35. package/config/devices/0x027a/zen15.json +20 -1
  36. package/config/devices/0x027a/zen21.json +44 -24
  37. package/config/devices/0x027a/zen22.json +34 -11
  38. package/config/devices/0x027a/zen23.json +39 -10
  39. package/config/devices/0x027a/zen24.json +20 -0
  40. package/config/devices/0x027a/zen26.json +11 -0
  41. package/config/devices/0x027a/zen27.json +15 -4
  42. package/config/devices/0x027a/zen30.json +83 -5
  43. package/config/devices/0x027a/zen31.json +116 -8
  44. package/config/devices/0x027a/zen35.json +6 -10
  45. package/config/devices/0x027a/zen37.json +25 -0
  46. package/config/devices/0x027a/zen51.json +7 -1
  47. package/config/devices/0x027a/zen52.json +36 -1
  48. package/config/devices/0x027a/zen53.json +43 -0
  49. package/config/devices/0x027a/zen54.json +9 -0
  50. package/config/devices/0x027a/zen55.json +34 -22
  51. package/config/devices/0x027a/zen72.json +4 -3
  52. package/config/devices/0x027a/zen73.json +32 -3
  53. package/config/devices/0x027a/zen74.json +61 -5
  54. package/config/devices/0x027a/zen75.json +13 -0
  55. package/config/devices/0x027a/zen76.json +25 -3
  56. package/config/devices/0x027a/zen77.json +5 -4
  57. package/config/devices/0x027a/zse09.json +4 -3
  58. package/config/devices/0x027a/zse11.json +1 -0
  59. package/config/devices/0x027a/zse18.json +37 -4
  60. package/config/devices/0x027a/zse33.json +1 -2
  61. package/config/devices/0x027a/zse40.json +5 -6
  62. package/config/devices/0x027a/zse43.json +2 -1
  63. package/config/devices/0x027a/zse50.json +1 -1
  64. package/config/devices/0x0464/lamp-zw2.json +232 -0
  65. package/package.json +1 -1
@@ -2,4 +2,25 @@ import type { ReadFile, ReadFileSystemInfo } from "@zwave-js/shared/bindings";
2
2
  export declare function clearTemplateCache(): void;
3
3
  /** Parses a JSON file with $import keys and replaces them with the selected objects */
4
4
  export declare function readJsonWithTemplate(fs: ReadFileSystemInfo & ReadFile, filename: string, rootDirs?: string | string[]): Promise<Record<string, unknown>>;
5
+ /**
6
+ * Resolves a single `$import` specifier (as used in device config files) to the
7
+ * JSON it pulls in, with the imported file's own `$import`s resolved recursively.
8
+ *
9
+ * @param fs The filesystem used to read config and template files
10
+ * @param contextFilename The file the specifier appears in, used to resolve relative paths and same-file (`#selector`) imports
11
+ * @param specifier The `$import` specifier to resolve, e.g. `~/templates/master_template.json#base_enable_disable`
12
+ * @param rootDirs The root directories that `~/`-prefixed specifiers are resolved against
13
+ */
14
+ export declare function resolveTemplateImport(fs: ReadFileSystemInfo & ReadFile, contextFilename: string, specifier: string, rootDirs?: string | string[]): Promise<Record<string, unknown>>;
15
+ /**
16
+ * Resolves the target file of an `$import` specifier to an absolute path,
17
+ * without reading or resolving the file's contents. Returns `undefined` if the
18
+ * specifier is invalid or the referenced file cannot be located.
19
+ *
20
+ * @param fs The filesystem used to locate `~/`-prefixed files
21
+ * @param contextFilename The file the specifier appears in, used to resolve relative and same-file imports
22
+ * @param specifier The `$import` specifier
23
+ * @param rootDirs The root directories that `~/`-prefixed specifiers are resolved against
24
+ */
25
+ export declare function resolveImportPath(fs: ReadFileSystemInfo & ReadFile, contextFilename: string, specifier: string, rootDirs?: string | string[]): Promise<string | undefined>;
5
26
  //# sourceMappingURL=JsonTemplate.d.ts.map
@@ -30,7 +30,9 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  var JsonTemplate_exports = {};
31
31
  __export(JsonTemplate_exports, {
32
32
  clearTemplateCache: () => clearTemplateCache,
33
- readJsonWithTemplate: () => readJsonWithTemplate
33
+ readJsonWithTemplate: () => readJsonWithTemplate,
34
+ resolveImportPath: () => resolveImportPath,
35
+ resolveTemplateImport: () => resolveTemplateImport
34
36
  });
35
37
  module.exports = __toCommonJS(JsonTemplate_exports);
36
38
  var import_core = require("@zwave-js/core");
@@ -107,6 +109,49 @@ Import stack: ${source.map((s) => `
107
109
  return "";
108
110
  }
109
111
  __name(getImportStack, "getImportStack");
112
+ async function resolveImportFilename(fs, importFilename, contextFilename, rootDirs, visited, selector) {
113
+ if (importFilename.startsWith("~/")) {
114
+ if (!rootDirs) {
115
+ throw new import_core.ZWaveError(`An $import specifier cannot start with ~/ when no root directory is defined!${getImportStack(visited, selector)}`, import_core.ZWaveErrorCodes.Config_Invalid);
116
+ }
117
+ for (const rootDir of rootDirs) {
118
+ const candidate = import_pathe.default.join(rootDir, importFilename.slice(2));
119
+ if (await (0, import_shared.pathExists)(fs, candidate))
120
+ return candidate;
121
+ }
122
+ throw new import_core.ZWaveError(`Could not find the referenced file ${importFilename.slice(2)} in any of the root directories: ${rootDirs.map((d) => `
123
+ \xB7 ${d}`).join("")}
124
+ ${getImportStack(visited, selector)}`, import_core.ZWaveErrorCodes.Config_Invalid);
125
+ } else {
126
+ return import_pathe.default.join(import_pathe.default.dirname(contextFilename), importFilename);
127
+ }
128
+ }
129
+ __name(resolveImportFilename, "resolveImportFilename");
130
+ async function resolveTemplateImport(fs, contextFilename, specifier, rootDirs) {
131
+ assertImportSpecifier(specifier);
132
+ if (typeof rootDirs === "string")
133
+ rootDirs = [rootDirs];
134
+ const { filename: importFilename, selector } = importSpecifierRegex.exec(specifier).groups;
135
+ const newFilename = importFilename ? await resolveImportFilename(fs, importFilename, contextFilename, rootDirs, [], selector) : import_pathe.default.normalize(contextFilename);
136
+ const fileCache = new Map(templateCache);
137
+ return readJsonWithTemplateInternal(fs, newFilename, selector, [], fileCache, rootDirs);
138
+ }
139
+ __name(resolveTemplateImport, "resolveTemplateImport");
140
+ async function resolveImportPath(fs, contextFilename, specifier, rootDirs) {
141
+ if (!importSpecifierRegex.test(specifier))
142
+ return void 0;
143
+ if (typeof rootDirs === "string")
144
+ rootDirs = [rootDirs];
145
+ const { filename: importFilename } = importSpecifierRegex.exec(specifier).groups;
146
+ if (!importFilename)
147
+ return import_pathe.default.normalize(contextFilename);
148
+ try {
149
+ return await resolveImportFilename(fs, importFilename, contextFilename, rootDirs, [], void 0);
150
+ } catch {
151
+ return void 0;
152
+ }
153
+ }
154
+ __name(resolveImportPath, "resolveImportPath");
110
155
  async function readJsonWithTemplateInternal(fs, filename, selector, visited, fileCache, rootDirs) {
111
156
  filename = import_pathe.default.normalize(filename);
112
157
  if (rootDirs) {
@@ -150,32 +195,7 @@ async function resolveJsonImports(fs, json, filename, visited, fileCache, rootDi
150
195
  if (prop === IMPORT_KEY) {
151
196
  assertImportSpecifier(val, visited.join(" -> "));
152
197
  const { filename: importFilename, selector } = importSpecifierRegex.exec(val).groups;
153
- let newFilename;
154
- if (importFilename) {
155
- if (importFilename.startsWith("~/")) {
156
- if (rootDirs) {
157
- for (const rootDir of rootDirs) {
158
- newFilename = import_pathe.default.join(rootDir, importFilename.slice(2));
159
- if (await (0, import_shared.pathExists)(fs, newFilename)) {
160
- break;
161
- } else {
162
- newFilename = void 0;
163
- }
164
- }
165
- if (!newFilename) {
166
- throw new import_core.ZWaveError(`Could not find the referenced file ${importFilename.slice(2)} in any of the root directories: ${rootDirs.map((d) => `
167
- \xB7 ${d}`).join("")}
168
- ${getImportStack(visited, selector)}`, import_core.ZWaveErrorCodes.Config_Invalid);
169
- }
170
- } else {
171
- throw new import_core.ZWaveError(`An $import specifier cannot start with ~/ when no root directory is defined!${getImportStack(visited, selector)}`, import_core.ZWaveErrorCodes.Config_Invalid);
172
- }
173
- } else {
174
- newFilename = import_pathe.default.join(import_pathe.default.dirname(filename), importFilename);
175
- }
176
- } else {
177
- newFilename = filename;
178
- }
198
+ const newFilename = importFilename ? await resolveImportFilename(fs, importFilename, filename, rootDirs, visited, selector) : filename;
179
199
  const imported = await readJsonWithTemplateInternal(fs, newFilename, selector, visited, fileCache, rootDirs);
180
200
  Object.assign(ret, imported);
181
201
  } else if ((0, import_typeguards.isObject)(val)) {
@@ -200,6 +220,8 @@ __name(resolveJsonImports, "resolveJsonImports");
200
220
  // Annotate the CommonJS export names for ESM import in node:
201
221
  0 && (module.exports = {
202
222
  clearTemplateCache,
203
- readJsonWithTemplate
223
+ readJsonWithTemplate,
224
+ resolveImportPath,
225
+ resolveTemplateImport
204
226
  });
205
227
  //# sourceMappingURL=JsonTemplate.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/JsonTemplate.ts"],
4
- "sourcesContent": ["import { ZWaveError, ZWaveErrorCodes } from \"@zwave-js/core\";\nimport { getErrorMessage, pathExists, readTextFile } from \"@zwave-js/shared\";\nimport type { ReadFile, ReadFileSystemInfo } from \"@zwave-js/shared/bindings\";\nimport { isArray, isObject } from \"alcalzone-shared/typeguards\";\nimport JSON5 from \"json5\";\nimport path from \"pathe\";\n\nconst IMPORT_KEY = \"$import\";\nconst importSpecifierRegex =\n\t/^(?<filename>(?:~\\/)?[\\w\\d/\\\\._-]+\\.json)?(?:#(?<selector>[\\w\\d/._-]+(?:\\[0x[0-9a-fA-F]+\\])?))?$/i;\n\ntype FileCache = Map<string, Record<string, unknown>>;\n\n// The template cache is used to speed up cases where the same files get parsed multiple times,\n// e.g. during config file linting. It should be cleared whenever the files need to be loaded fresh\n// from disk, like when creating an index\nconst templateCache: FileCache = new Map();\nexport function clearTemplateCache(): void {\n\ttemplateCache.clear();\n}\n\n/** Parses a JSON file with $import keys and replaces them with the selected objects */\nexport async function readJsonWithTemplate(\n\tfs: ReadFileSystemInfo & ReadFile,\n\tfilename: string,\n\trootDirs?: string | string[],\n): Promise<Record<string, unknown>> {\n\tif (!(await pathExists(fs, filename))) {\n\t\tthrow new ZWaveError(\n\t\t\t`Could not open config file ${filename}: not found!`,\n\t\t\tZWaveErrorCodes.Config_NotFound,\n\t\t);\n\t}\n\n\tif (typeof rootDirs === \"string\") rootDirs = [rootDirs];\n\n\t// Try to use the cached versions of the template files to speed up the loading\n\tconst fileCache = new Map(templateCache);\n\tconst ret = await readJsonWithTemplateInternal(\n\t\tfs,\n\t\tfilename,\n\t\tundefined,\n\t\t[],\n\t\tfileCache,\n\t\trootDirs,\n\t);\n\n\t// Only remember the cached templates, not the individual files to save RAM\n\tfor (const [filename, cached] of fileCache) {\n\t\tif (/[\\\\/]templates[\\\\/]/.test(filename)) {\n\t\t\ttemplateCache.set(filename, cached);\n\t\t}\n\t}\n\n\treturn ret;\n}\n\nfunction assertImportSpecifier(\n\tval: unknown,\n\tsource?: string,\n): asserts val is string {\n\tif (typeof val !== \"string\") {\n\t\tthrow new ZWaveError(\n\t\t\t`Invalid import specifier ${String(val)}!${\n\t\t\t\tsource != undefined ? ` Source: ${source}` : \"\"\n\t\t\t}`,\n\t\t\tZWaveErrorCodes.Config_Invalid,\n\t\t);\n\t}\n\tif (!importSpecifierRegex.test(val)) {\n\t\tthrow new ZWaveError(\n\t\t\t`Import specifier \"${val}\" is invalid!${\n\t\t\t\tsource != undefined ? ` Source: ${source}` : \"\"\n\t\t\t}`,\n\t\t\tZWaveErrorCodes.Config_Invalid,\n\t\t);\n\t}\n}\n\nfunction getImportSpecifier(filename: string, selector?: string): string {\n\tlet ret = filename;\n\tif (selector) ret += `#${selector}`;\n\treturn ret;\n}\n\nfunction select(\n\tobj: Record<string, unknown>,\n\tselector: string,\n): Record<string, unknown> {\n\tlet ret: Record<string, unknown> = obj;\n\tconst selectorParts = selector.split(\"/\").filter((s) => !!s);\n\tfor (const part of selectorParts) {\n\t\t// Special case for paramInformation selectors to select params by #\n\t\tif (isArray(ret)) {\n\t\t\tconst item = (ret as any).find(\n\t\t\t\t(r: any) => isObject(r) && \"#\" in r && r[\"#\"] === part,\n\t\t\t);\n\t\t\tif (item != undefined) {\n\t\t\t\t// Don't copy the param number\n\t\t\t\tconst { [\"#\"]: _, ...rest } = item;\n\t\t\t\tret = rest;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\t// By default select the object property\n\t\tret = (ret as any)[part];\n\t}\n\tif (!isObject(ret)) {\n\t\tthrow new ZWaveError(\n\t\t\t`The import target \"${selector}\" is not an object!`,\n\t\t\tZWaveErrorCodes.Config_Invalid,\n\t\t);\n\t}\n\treturn ret;\n}\n\nfunction getImportStack(\n\tvisited: string[],\n\tselector: string | undefined,\n): string {\n\tconst source = [...visited, selector ? `#${selector}` : undefined]\n\t\t.toReversed()\n\t\t.filter((s) => !!s) as string[];\n\tif (source.length > 0) {\n\t\treturn `\\nImport stack: ${source.map((s) => `\\n in ${s}`).join(\"\")}`;\n\t}\n\treturn \"\";\n}\n\nasync function readJsonWithTemplateInternal(\n\tfs: ReadFileSystemInfo & ReadFile,\n\tfilename: string,\n\tselector: string | undefined,\n\tvisited: string[],\n\tfileCache: FileCache,\n\trootDirs?: string[],\n): Promise<Record<string, unknown>> {\n\tfilename = path.normalize(filename);\n\n\t// If we're limited by one or more root directories, make sure the file is inside one of those\n\tif (rootDirs) {\n\t\tconst outsideAllRootDirs = rootDirs.every((rootDir) => {\n\t\t\tconst relativeToRoot = path.relative(rootDir, filename);\n\t\t\treturn relativeToRoot.startsWith(\"..\");\n\t\t});\n\n\t\tif (outsideAllRootDirs) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Tried to import config file \"${filename}\" from outside all root directories: ${\n\t\t\t\t\trootDirs\n\t\t\t\t\t\t.map((d) => `\\n\u00B7 ${d}`)\n\t\t\t\t\t\t.join(\"\")\n\t\t\t\t}\n${getImportStack(visited, selector)}`,\n\t\t\t\tZWaveErrorCodes.Config_Invalid,\n\t\t\t);\n\t\t}\n\t}\n\n\tconst specifier = getImportSpecifier(filename, selector);\n\tif (visited.includes(specifier)) {\n\t\tconst msg = `Circular $import in config files: ${\n\t\t\t[\n\t\t\t\t...visited,\n\t\t\t\tspecifier,\n\t\t\t].join(\" -> \")\n\t\t}\\n`;\n\t\t// process.stderr.write(msg + \"\\n\");\n\t\tthrow new ZWaveError(msg, ZWaveErrorCodes.Config_CircularImport);\n\t}\n\n\tlet json: Record<string, unknown>;\n\tif (fileCache.has(filename)) {\n\t\tjson = fileCache.get(filename)!;\n\t} else {\n\t\ttry {\n\t\t\tconst fileContent = await readTextFile(fs, filename, \"utf8\");\n\t\t\tjson = JSON5.parse(fileContent);\n\t\t\tfileCache.set(filename, json);\n\t\t} catch (e) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Could not parse config file ${filename}: ${\n\t\t\t\t\tgetErrorMessage(\n\t\t\t\t\t\te,\n\t\t\t\t\t)\n\t\t\t\t}${getImportStack(visited, selector)}`,\n\t\t\t\tZWaveErrorCodes.Config_Invalid,\n\t\t\t);\n\t\t}\n\t}\n\t// Resolve the JSON imports for (a subset) of the file and return the compound file\n\treturn resolveJsonImports(\n\t\tfs,\n\t\tselector ? select(json, selector) : json,\n\t\tfilename,\n\t\t[...visited, specifier],\n\t\tfileCache,\n\t\trootDirs,\n\t);\n}\n\n/** Replaces all `$import` properties in a JSON object with object spreads of the referenced file/property */\nasync function resolveJsonImports(\n\tfs: ReadFileSystemInfo & ReadFile,\n\tjson: Record<string, unknown>,\n\tfilename: string,\n\tvisited: string[],\n\tfileCache: FileCache,\n\trootDirs?: string[],\n): Promise<Record<string, unknown>> {\n\tconst ret: Record<string, unknown> = {};\n\t// Loop through all properties and copy them to the resulting object\n\tfor (const [prop, val] of Object.entries(json)) {\n\t\tif (prop === IMPORT_KEY) {\n\t\t\t// This is an import statement. Make sure we're working with a string\n\t\t\tassertImportSpecifier(val, visited.join(\" -> \"));\n\t\t\tconst { filename: importFilename, selector } = importSpecifierRegex\n\t\t\t\t.exec(val)!.groups!;\n\n\t\t\t// Resolve the correct import path\n\t\t\tlet newFilename: string | undefined;\n\t\t\tif (importFilename) {\n\t\t\t\tif (importFilename.startsWith(\"~/\")) {\n\t\t\t\t\t// This is a special import specifier that is relative to the root directory\n\t\t\t\t\t// Try to find at least one root directory that contains the referenced file\n\t\t\t\t\tif (rootDirs) {\n\t\t\t\t\t\tfor (const rootDir of rootDirs) {\n\t\t\t\t\t\t\tnewFilename = path.join(\n\t\t\t\t\t\t\t\trootDir,\n\t\t\t\t\t\t\t\timportFilename.slice(2),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (await pathExists(fs, newFilename)) {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Try the next\n\t\t\t\t\t\t\t\tnewFilename = undefined!;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!newFilename) {\n\t\t\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t\t\t`Could not find the referenced file ${\n\t\t\t\t\t\t\t\t\timportFilename.slice(\n\t\t\t\t\t\t\t\t\t\t2,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t} in any of the root directories: ${\n\t\t\t\t\t\t\t\t\trootDirs\n\t\t\t\t\t\t\t\t\t\t.map((d) => `\\n\u00B7 ${d}`)\n\t\t\t\t\t\t\t\t\t\t.join(\"\")\n\t\t\t\t\t\t\t\t}\\n${\n\t\t\t\t\t\t\t\t\tgetImportStack(\n\t\t\t\t\t\t\t\t\t\tvisited,\n\t\t\t\t\t\t\t\t\t\tselector,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t\t\tZWaveErrorCodes.Config_Invalid,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t\t`An $import specifier cannot start with ~/ when no root directory is defined!${\n\t\t\t\t\t\t\t\tgetImportStack(\n\t\t\t\t\t\t\t\t\tvisited,\n\t\t\t\t\t\t\t\t\tselector,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t\tZWaveErrorCodes.Config_Invalid,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tnewFilename = path.join(\n\t\t\t\t\t\tpath.dirname(filename),\n\t\t\t\t\t\timportFilename,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnewFilename = filename;\n\t\t\t}\n\n\t\t\t// const importFilename = path.join(path.dirname(filename), val);\n\t\t\tconst imported = await readJsonWithTemplateInternal(\n\t\t\t\tfs,\n\t\t\t\tnewFilename,\n\t\t\t\tselector,\n\t\t\t\tvisited,\n\t\t\t\tfileCache,\n\t\t\t\trootDirs,\n\t\t\t);\n\t\t\tObject.assign(ret, imported);\n\t\t} else if (isObject(val)) {\n\t\t\t// We're looking at an object, recurse into it\n\t\t\tret[prop] = await resolveJsonImports(\n\t\t\t\tfs,\n\t\t\t\tval,\n\t\t\t\tfilename,\n\t\t\t\tvisited,\n\t\t\t\tfileCache,\n\t\t\t\trootDirs,\n\t\t\t);\n\t\t} else if (isArray(val)) {\n\t\t\t// We're looking at an array, check if there are objects we need to recurse into\n\t\t\tconst vals: unknown[] = [];\n\t\t\tfor (const v of val) {\n\t\t\t\tif (isObject(v)) {\n\t\t\t\t\tvals.push(\n\t\t\t\t\t\tawait resolveJsonImports(\n\t\t\t\t\t\t\tfs,\n\t\t\t\t\t\t\tv,\n\t\t\t\t\t\t\tfilename,\n\t\t\t\t\t\t\tvisited,\n\t\t\t\t\t\t\tfileCache,\n\t\t\t\t\t\t\trootDirs,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tvals.push(v);\n\t\t\t\t}\n\t\t\t}\n\t\t\tret[prop] = vals;\n\t\t} else {\n\t\t\tret[prop] = val;\n\t\t}\n\t}\n\treturn ret;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { ZWaveError, ZWaveErrorCodes } from \"@zwave-js/core\";\nimport { getErrorMessage, pathExists, readTextFile } from \"@zwave-js/shared\";\nimport type { ReadFile, ReadFileSystemInfo } from \"@zwave-js/shared/bindings\";\nimport { isArray, isObject } from \"alcalzone-shared/typeguards\";\nimport JSON5 from \"json5\";\nimport path from \"pathe\";\n\nconst IMPORT_KEY = \"$import\";\nconst importSpecifierRegex =\n\t/^(?<filename>(?:~\\/)?[\\w\\d/\\\\._-]+\\.json)?(?:#(?<selector>[\\w\\d/._-]+(?:\\[0x[0-9a-fA-F]+\\])?))?$/i;\n\ntype FileCache = Map<string, Record<string, unknown>>;\n\n// The template cache is used to speed up cases where the same files get parsed multiple times,\n// e.g. during config file linting. It should be cleared whenever the files need to be loaded fresh\n// from disk, like when creating an index\nconst templateCache: FileCache = new Map();\nexport function clearTemplateCache(): void {\n\ttemplateCache.clear();\n}\n\n/** Parses a JSON file with $import keys and replaces them with the selected objects */\nexport async function readJsonWithTemplate(\n\tfs: ReadFileSystemInfo & ReadFile,\n\tfilename: string,\n\trootDirs?: string | string[],\n): Promise<Record<string, unknown>> {\n\tif (!(await pathExists(fs, filename))) {\n\t\tthrow new ZWaveError(\n\t\t\t`Could not open config file ${filename}: not found!`,\n\t\t\tZWaveErrorCodes.Config_NotFound,\n\t\t);\n\t}\n\n\tif (typeof rootDirs === \"string\") rootDirs = [rootDirs];\n\n\t// Try to use the cached versions of the template files to speed up the loading\n\tconst fileCache = new Map(templateCache);\n\tconst ret = await readJsonWithTemplateInternal(\n\t\tfs,\n\t\tfilename,\n\t\tundefined,\n\t\t[],\n\t\tfileCache,\n\t\trootDirs,\n\t);\n\n\t// Only remember the cached templates, not the individual files to save RAM\n\tfor (const [filename, cached] of fileCache) {\n\t\tif (/[\\\\/]templates[\\\\/]/.test(filename)) {\n\t\t\ttemplateCache.set(filename, cached);\n\t\t}\n\t}\n\n\treturn ret;\n}\n\nfunction assertImportSpecifier(\n\tval: unknown,\n\tsource?: string,\n): asserts val is string {\n\tif (typeof val !== \"string\") {\n\t\tthrow new ZWaveError(\n\t\t\t`Invalid import specifier ${String(val)}!${\n\t\t\t\tsource != undefined ? ` Source: ${source}` : \"\"\n\t\t\t}`,\n\t\t\tZWaveErrorCodes.Config_Invalid,\n\t\t);\n\t}\n\tif (!importSpecifierRegex.test(val)) {\n\t\tthrow new ZWaveError(\n\t\t\t`Import specifier \"${val}\" is invalid!${\n\t\t\t\tsource != undefined ? ` Source: ${source}` : \"\"\n\t\t\t}`,\n\t\t\tZWaveErrorCodes.Config_Invalid,\n\t\t);\n\t}\n}\n\nfunction getImportSpecifier(filename: string, selector?: string): string {\n\tlet ret = filename;\n\tif (selector) ret += `#${selector}`;\n\treturn ret;\n}\n\nfunction select(\n\tobj: Record<string, unknown>,\n\tselector: string,\n): Record<string, unknown> {\n\tlet ret: Record<string, unknown> = obj;\n\tconst selectorParts = selector.split(\"/\").filter((s) => !!s);\n\tfor (const part of selectorParts) {\n\t\t// Special case for paramInformation selectors to select params by #\n\t\tif (isArray(ret)) {\n\t\t\tconst item = (ret as any).find(\n\t\t\t\t(r: any) => isObject(r) && \"#\" in r && r[\"#\"] === part,\n\t\t\t);\n\t\t\tif (item != undefined) {\n\t\t\t\t// Don't copy the param number\n\t\t\t\tconst { [\"#\"]: _, ...rest } = item;\n\t\t\t\tret = rest;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\t// By default select the object property\n\t\tret = (ret as any)[part];\n\t}\n\tif (!isObject(ret)) {\n\t\tthrow new ZWaveError(\n\t\t\t`The import target \"${selector}\" is not an object!`,\n\t\t\tZWaveErrorCodes.Config_Invalid,\n\t\t);\n\t}\n\treturn ret;\n}\n\nfunction getImportStack(\n\tvisited: string[],\n\tselector: string | undefined,\n): string {\n\tconst source = [...visited, selector ? `#${selector}` : undefined]\n\t\t.toReversed()\n\t\t.filter((s) => !!s) as string[];\n\tif (source.length > 0) {\n\t\treturn `\\nImport stack: ${source.map((s) => `\\n in ${s}`).join(\"\")}`;\n\t}\n\treturn \"\";\n}\n\n/**\n * Resolves the filename portion of an `$import` specifier to an absolute path.\n *\n * @param fs The filesystem used to check whether candidate files exist\n * @param importFilename The filename portion of the specifier, e.g. `~/templates/foo.json` or `templates/foo.json`\n * @param contextFilename The file the specifier appears in, used to resolve relative paths\n * @param rootDirs The root directories that `~/`-prefixed specifiers are resolved against\n * @param visited The import stack so far, included in error messages\n * @param selector The selector portion of the specifier, included in error messages\n */\nasync function resolveImportFilename(\n\tfs: ReadFileSystemInfo & ReadFile,\n\timportFilename: string,\n\tcontextFilename: string,\n\trootDirs: string[] | undefined,\n\tvisited: string[],\n\tselector: string | undefined,\n): Promise<string> {\n\tif (importFilename.startsWith(\"~/\")) {\n\t\t// This is a special import specifier that is relative to the root directory\n\t\t// Try to find at least one root directory that contains the referenced file\n\t\tif (!rootDirs) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`An $import specifier cannot start with ~/ when no root directory is defined!${\n\t\t\t\t\tgetImportStack(visited, selector)\n\t\t\t\t}`,\n\t\t\t\tZWaveErrorCodes.Config_Invalid,\n\t\t\t);\n\t\t}\n\t\tfor (const rootDir of rootDirs) {\n\t\t\tconst candidate = path.join(rootDir, importFilename.slice(2));\n\t\t\tif (await pathExists(fs, candidate)) return candidate;\n\t\t}\n\t\tthrow new ZWaveError(\n\t\t\t`Could not find the referenced file ${\n\t\t\t\timportFilename.slice(2)\n\t\t\t} in any of the root directories: ${\n\t\t\t\trootDirs.map((d) => `\\n\u00B7 ${d}`).join(\"\")\n\t\t\t}\\n${getImportStack(visited, selector)}`,\n\t\t\tZWaveErrorCodes.Config_Invalid,\n\t\t);\n\t} else {\n\t\treturn path.join(path.dirname(contextFilename), importFilename);\n\t}\n}\n\n/**\n * Resolves a single `$import` specifier (as used in device config files) to the\n * JSON it pulls in, with the imported file's own `$import`s resolved recursively.\n *\n * @param fs The filesystem used to read config and template files\n * @param contextFilename The file the specifier appears in, used to resolve relative paths and same-file (`#selector`) imports\n * @param specifier The `$import` specifier to resolve, e.g. `~/templates/master_template.json#base_enable_disable`\n * @param rootDirs The root directories that `~/`-prefixed specifiers are resolved against\n */\nexport async function resolveTemplateImport(\n\tfs: ReadFileSystemInfo & ReadFile,\n\tcontextFilename: string,\n\tspecifier: string,\n\trootDirs?: string | string[],\n): Promise<Record<string, unknown>> {\n\tassertImportSpecifier(specifier);\n\tif (typeof rootDirs === \"string\") rootDirs = [rootDirs];\n\n\tconst { filename: importFilename, selector } = importSpecifierRegex\n\t\t.exec(specifier)!.groups!;\n\n\tconst newFilename = importFilename\n\t\t? await resolveImportFilename(\n\t\t\tfs,\n\t\t\timportFilename,\n\t\t\tcontextFilename,\n\t\t\trootDirs,\n\t\t\t[],\n\t\t\tselector,\n\t\t)\n\t\t: path.normalize(contextFilename);\n\n\tconst fileCache = new Map(templateCache);\n\treturn readJsonWithTemplateInternal(\n\t\tfs,\n\t\tnewFilename,\n\t\tselector,\n\t\t[],\n\t\tfileCache,\n\t\trootDirs,\n\t);\n}\n\n/**\n * Resolves the target file of an `$import` specifier to an absolute path,\n * without reading or resolving the file's contents. Returns `undefined` if the\n * specifier is invalid or the referenced file cannot be located.\n *\n * @param fs The filesystem used to locate `~/`-prefixed files\n * @param contextFilename The file the specifier appears in, used to resolve relative and same-file imports\n * @param specifier The `$import` specifier\n * @param rootDirs The root directories that `~/`-prefixed specifiers are resolved against\n */\nexport async function resolveImportPath(\n\tfs: ReadFileSystemInfo & ReadFile,\n\tcontextFilename: string,\n\tspecifier: string,\n\trootDirs?: string | string[],\n): Promise<string | undefined> {\n\tif (!importSpecifierRegex.test(specifier)) return undefined;\n\tif (typeof rootDirs === \"string\") rootDirs = [rootDirs];\n\n\tconst { filename: importFilename } = importSpecifierRegex\n\t\t.exec(specifier)!.groups!;\n\tif (!importFilename) return path.normalize(contextFilename);\n\n\ttry {\n\t\treturn await resolveImportFilename(\n\t\t\tfs,\n\t\t\timportFilename,\n\t\t\tcontextFilename,\n\t\t\trootDirs,\n\t\t\t[],\n\t\t\tundefined,\n\t\t);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nasync function readJsonWithTemplateInternal(\n\tfs: ReadFileSystemInfo & ReadFile,\n\tfilename: string,\n\tselector: string | undefined,\n\tvisited: string[],\n\tfileCache: FileCache,\n\trootDirs?: string[],\n): Promise<Record<string, unknown>> {\n\tfilename = path.normalize(filename);\n\n\t// If we're limited by one or more root directories, make sure the file is inside one of those\n\tif (rootDirs) {\n\t\tconst outsideAllRootDirs = rootDirs.every((rootDir) => {\n\t\t\tconst relativeToRoot = path.relative(rootDir, filename);\n\t\t\treturn relativeToRoot.startsWith(\"..\");\n\t\t});\n\n\t\tif (outsideAllRootDirs) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Tried to import config file \"${filename}\" from outside all root directories: ${\n\t\t\t\t\trootDirs\n\t\t\t\t\t\t.map((d) => `\\n\u00B7 ${d}`)\n\t\t\t\t\t\t.join(\"\")\n\t\t\t\t}\n${getImportStack(visited, selector)}`,\n\t\t\t\tZWaveErrorCodes.Config_Invalid,\n\t\t\t);\n\t\t}\n\t}\n\n\tconst specifier = getImportSpecifier(filename, selector);\n\tif (visited.includes(specifier)) {\n\t\tconst msg = `Circular $import in config files: ${\n\t\t\t[\n\t\t\t\t...visited,\n\t\t\t\tspecifier,\n\t\t\t].join(\" -> \")\n\t\t}\\n`;\n\t\t// process.stderr.write(msg + \"\\n\");\n\t\tthrow new ZWaveError(msg, ZWaveErrorCodes.Config_CircularImport);\n\t}\n\n\tlet json: Record<string, unknown>;\n\tif (fileCache.has(filename)) {\n\t\tjson = fileCache.get(filename)!;\n\t} else {\n\t\ttry {\n\t\t\tconst fileContent = await readTextFile(fs, filename, \"utf8\");\n\t\t\tjson = JSON5.parse(fileContent);\n\t\t\tfileCache.set(filename, json);\n\t\t} catch (e) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Could not parse config file ${filename}: ${\n\t\t\t\t\tgetErrorMessage(\n\t\t\t\t\t\te,\n\t\t\t\t\t)\n\t\t\t\t}${getImportStack(visited, selector)}`,\n\t\t\t\tZWaveErrorCodes.Config_Invalid,\n\t\t\t);\n\t\t}\n\t}\n\t// Resolve the JSON imports for (a subset) of the file and return the compound file\n\treturn resolveJsonImports(\n\t\tfs,\n\t\tselector ? select(json, selector) : json,\n\t\tfilename,\n\t\t[...visited, specifier],\n\t\tfileCache,\n\t\trootDirs,\n\t);\n}\n\n/** Replaces all `$import` properties in a JSON object with object spreads of the referenced file/property */\nasync function resolveJsonImports(\n\tfs: ReadFileSystemInfo & ReadFile,\n\tjson: Record<string, unknown>,\n\tfilename: string,\n\tvisited: string[],\n\tfileCache: FileCache,\n\trootDirs?: string[],\n): Promise<Record<string, unknown>> {\n\tconst ret: Record<string, unknown> = {};\n\t// Loop through all properties and copy them to the resulting object\n\tfor (const [prop, val] of Object.entries(json)) {\n\t\tif (prop === IMPORT_KEY) {\n\t\t\t// This is an import statement. Make sure we're working with a string\n\t\t\tassertImportSpecifier(val, visited.join(\" -> \"));\n\t\t\tconst { filename: importFilename, selector } = importSpecifierRegex\n\t\t\t\t.exec(val)!.groups!;\n\n\t\t\t// Resolve the correct import path\n\t\t\tconst newFilename = importFilename\n\t\t\t\t? await resolveImportFilename(\n\t\t\t\t\tfs,\n\t\t\t\t\timportFilename,\n\t\t\t\t\tfilename,\n\t\t\t\t\trootDirs,\n\t\t\t\t\tvisited,\n\t\t\t\t\tselector,\n\t\t\t\t)\n\t\t\t\t: filename;\n\n\t\t\tconst imported = await readJsonWithTemplateInternal(\n\t\t\t\tfs,\n\t\t\t\tnewFilename,\n\t\t\t\tselector,\n\t\t\t\tvisited,\n\t\t\t\tfileCache,\n\t\t\t\trootDirs,\n\t\t\t);\n\t\t\tObject.assign(ret, imported);\n\t\t} else if (isObject(val)) {\n\t\t\t// We're looking at an object, recurse into it\n\t\t\tret[prop] = await resolveJsonImports(\n\t\t\t\tfs,\n\t\t\t\tval,\n\t\t\t\tfilename,\n\t\t\t\tvisited,\n\t\t\t\tfileCache,\n\t\t\t\trootDirs,\n\t\t\t);\n\t\t} else if (isArray(val)) {\n\t\t\t// We're looking at an array, check if there are objects we need to recurse into\n\t\t\tconst vals: unknown[] = [];\n\t\t\tfor (const v of val) {\n\t\t\t\tif (isObject(v)) {\n\t\t\t\t\tvals.push(\n\t\t\t\t\t\tawait resolveJsonImports(\n\t\t\t\t\t\t\tfs,\n\t\t\t\t\t\t\tv,\n\t\t\t\t\t\t\tfilename,\n\t\t\t\t\t\t\tvisited,\n\t\t\t\t\t\t\tfileCache,\n\t\t\t\t\t\t\trootDirs,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tvals.push(v);\n\t\t\t\t}\n\t\t\t}\n\t\t\tret[prop] = vals;\n\t\t} else {\n\t\t\tret[prop] = val;\n\t\t}\n\t}\n\treturn ret;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["filename", "path", "JSON5"]
7
7
  }
@@ -57,6 +57,7 @@ add_operation("ver >", tryOr((a, b) => (0, import_gt.default)((0, import_shared.
57
57
  add_operation("ver <=", tryOr((a, b) => (0, import_lte.default)((0, import_shared.padVersion)(a), (0, import_shared.padVersion)(b)), false));
58
58
  add_operation("ver <", tryOr((a, b) => (0, import_lt.default)((0, import_shared.padVersion)(a), (0, import_shared.padVersion)(b)), false));
59
59
  add_operation("ver ===", tryOr((a, b) => (0, import_eq.default)((0, import_shared.padVersion)(a), (0, import_shared.padVersion)(b)), false));
60
+ add_operation("ver !==", tryOr((a, b) => !(0, import_eq.default)((0, import_shared.padVersion)(a), (0, import_shared.padVersion)(b)), false));
60
61
  function parseLogic(input) {
61
62
  const expr = (0, import_LogicParser.parse)(input);
62
63
  if (!expr) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/Logic.ts"],
4
- "sourcesContent": ["import { padVersion } from \"@zwave-js/shared\";\nimport semverEq from \"semver/functions/eq.js\";\nimport semverGt from \"semver/functions/gt.js\";\nimport semverGte from \"semver/functions/gte.js\";\nimport semverLt from \"semver/functions/lt.js\";\nimport semverLte from \"semver/functions/lte.js\";\n\n// The types are not correct:\nimport { type RulesLogic, default as JsonLogic } from \"json-logic-js\";\nimport { parse, toRulesLogic } from \"./LogicParser.js\";\nconst { add_operation, apply } = JsonLogic;\n\nfunction tryOr<T extends (...args: any[]) => any>(\n\toperation: T,\n\tonError: ReturnType<T>,\n): T {\n\treturn ((...args: any[]) => {\n\t\ttry {\n\t\t\treturn operation(...args);\n\t\t} catch {\n\t\t\treturn onError;\n\t\t}\n\t}) as any as T;\n}\n\nadd_operation(\n\t\"ver >=\",\n\ttryOr((a, b) => semverGte(padVersion(a), padVersion(b)), false),\n);\nadd_operation(\n\t\"ver >\",\n\ttryOr((a, b) => semverGt(padVersion(a), padVersion(b)), false),\n);\nadd_operation(\n\t\"ver <=\",\n\ttryOr((a, b) => semverLte(padVersion(a), padVersion(b)), false),\n);\nadd_operation(\n\t\"ver <\",\n\ttryOr((a, b) => semverLt(padVersion(a), padVersion(b)), false),\n);\nadd_operation(\n\t\"ver ===\",\n\ttryOr((a, b) => semverEq(padVersion(a), padVersion(b)), false),\n);\n\nexport function parseLogic(input: string): RulesLogic {\n\tconst expr = parse(input);\n\tif (!expr) {\n\t\tthrow new Error(`Failed to parse expression: ${input}`);\n\t}\n\treturn toRulesLogic(expr);\n}\n\nexport function evaluate(\n\tlogic: string,\n\tcontext: unknown,\n): string | number | boolean {\n\tconst rules = parseLogic(logic);\n\treturn apply(rules, context);\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;AAAA,oBAA2B;AAC3B,gBAAqB;AACrB,gBAAqB;AACrB,iBAAsB;AACtB,gBAAqB;AACrB,iBAAsB;AAGtB,2BAAsD;AACtD,yBAAoC;AACpC,MAAM,EAAE,eAAe,MAAK,IAAK,qBAAAA;AAEjC,SAAS,MACR,WACA,SAAsB;AAEtB,UAAQ,IAAI,SAAe;AAC1B,QAAI;AACH,aAAO,UAAU,GAAG,IAAI;IACzB,QAAQ;AACP,aAAO;IACR;EACD;AACD;AAXS;AAaT,cACC,UACA,MAAM,CAAC,GAAG,UAAM,WAAAC,aAAU,0BAAW,CAAC,OAAG,0BAAW,CAAC,CAAC,GAAG,KAAK,CAAC;AAEhE,cACC,SACA,MAAM,CAAC,GAAG,UAAM,UAAAC,aAAS,0BAAW,CAAC,OAAG,0BAAW,CAAC,CAAC,GAAG,KAAK,CAAC;AAE/D,cACC,UACA,MAAM,CAAC,GAAG,UAAM,WAAAC,aAAU,0BAAW,CAAC,OAAG,0BAAW,CAAC,CAAC,GAAG,KAAK,CAAC;AAEhE,cACC,SACA,MAAM,CAAC,GAAG,UAAM,UAAAC,aAAS,0BAAW,CAAC,OAAG,0BAAW,CAAC,CAAC,GAAG,KAAK,CAAC;AAE/D,cACC,WACA,MAAM,CAAC,GAAG,UAAM,UAAAC,aAAS,0BAAW,CAAC,OAAG,0BAAW,CAAC,CAAC,GAAG,KAAK,CAAC;AAGzD,SAAU,WAAW,OAAa;AACvC,QAAM,WAAO,0BAAM,KAAK;AACxB,MAAI,CAAC,MAAM;AACV,UAAM,IAAI,MAAM,+BAA+B,KAAK,EAAE;EACvD;AACA,aAAO,iCAAa,IAAI;AACzB;AANgB;AAQV,SAAU,SACf,OACA,SAAgB;AAEhB,QAAM,QAAQ,WAAW,KAAK;AAC9B,SAAO,MAAM,OAAO,OAAO;AAC5B;AANgB;",
4
+ "sourcesContent": ["import { padVersion } from \"@zwave-js/shared\";\nimport semverEq from \"semver/functions/eq.js\";\nimport semverGt from \"semver/functions/gt.js\";\nimport semverGte from \"semver/functions/gte.js\";\nimport semverLt from \"semver/functions/lt.js\";\nimport semverLte from \"semver/functions/lte.js\";\n\n// The types are not correct:\nimport { type RulesLogic, default as JsonLogic } from \"json-logic-js\";\nimport { parse, toRulesLogic } from \"./LogicParser.js\";\nconst { add_operation, apply } = JsonLogic;\n\nfunction tryOr<T extends (...args: any[]) => any>(\n\toperation: T,\n\tonError: ReturnType<T>,\n): T {\n\treturn ((...args: any[]) => {\n\t\ttry {\n\t\t\treturn operation(...args);\n\t\t} catch {\n\t\t\treturn onError;\n\t\t}\n\t}) as any as T;\n}\n\nadd_operation(\n\t\"ver >=\",\n\ttryOr((a, b) => semverGte(padVersion(a), padVersion(b)), false),\n);\nadd_operation(\n\t\"ver >\",\n\ttryOr((a, b) => semverGt(padVersion(a), padVersion(b)), false),\n);\nadd_operation(\n\t\"ver <=\",\n\ttryOr((a, b) => semverLte(padVersion(a), padVersion(b)), false),\n);\nadd_operation(\n\t\"ver <\",\n\ttryOr((a, b) => semverLt(padVersion(a), padVersion(b)), false),\n);\nadd_operation(\n\t\"ver ===\",\n\ttryOr((a, b) => semverEq(padVersion(a), padVersion(b)), false),\n);\nadd_operation(\n\t\"ver !==\",\n\ttryOr((a, b) => !semverEq(padVersion(a), padVersion(b)), false),\n);\n\nexport function parseLogic(input: string): RulesLogic {\n\tconst expr = parse(input);\n\tif (!expr) {\n\t\tthrow new Error(`Failed to parse expression: ${input}`);\n\t}\n\treturn toRulesLogic(expr);\n}\n\nexport function evaluate(\n\tlogic: string,\n\tcontext: unknown,\n): string | number | boolean {\n\tconst rules = parseLogic(logic);\n\treturn apply(rules, context);\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;AAAA,oBAA2B;AAC3B,gBAAqB;AACrB,gBAAqB;AACrB,iBAAsB;AACtB,gBAAqB;AACrB,iBAAsB;AAGtB,2BAAsD;AACtD,yBAAoC;AACpC,MAAM,EAAE,eAAe,MAAK,IAAK,qBAAAA;AAEjC,SAAS,MACR,WACA,SAAsB;AAEtB,UAAQ,IAAI,SAAe;AAC1B,QAAI;AACH,aAAO,UAAU,GAAG,IAAI;IACzB,QAAQ;AACP,aAAO;IACR;EACD;AACD;AAXS;AAaT,cACC,UACA,MAAM,CAAC,GAAG,UAAM,WAAAC,aAAU,0BAAW,CAAC,OAAG,0BAAW,CAAC,CAAC,GAAG,KAAK,CAAC;AAEhE,cACC,SACA,MAAM,CAAC,GAAG,UAAM,UAAAC,aAAS,0BAAW,CAAC,OAAG,0BAAW,CAAC,CAAC,GAAG,KAAK,CAAC;AAE/D,cACC,UACA,MAAM,CAAC,GAAG,UAAM,WAAAC,aAAU,0BAAW,CAAC,OAAG,0BAAW,CAAC,CAAC,GAAG,KAAK,CAAC;AAEhE,cACC,SACA,MAAM,CAAC,GAAG,UAAM,UAAAC,aAAS,0BAAW,CAAC,OAAG,0BAAW,CAAC,CAAC,GAAG,KAAK,CAAC;AAE/D,cACC,WACA,MAAM,CAAC,GAAG,UAAM,UAAAC,aAAS,0BAAW,CAAC,OAAG,0BAAW,CAAC,CAAC,GAAG,KAAK,CAAC;AAE/D,cACC,WACA,MAAM,CAAC,GAAG,MAAM,KAAC,UAAAA,aAAS,0BAAW,CAAC,OAAG,0BAAW,CAAC,CAAC,GAAG,KAAK,CAAC;AAG1D,SAAU,WAAW,OAAa;AACvC,QAAM,WAAO,0BAAM,KAAK;AACxB,MAAI,CAAC,MAAM;AACV,UAAM,IAAI,MAAM,+BAA+B,KAAK,EAAE;EACvD;AACA,aAAO,iCAAa,IAAI;AACzB;AANgB;AAQV,SAAU,SACf,OACA,SAAgB;AAEhB,QAAM,QAAQ,WAAW,KAAK;AAC9B,SAAO,MAAM,OAAO,OAAO;AAC5B;AANgB;",
6
6
  "names": ["JsonLogic", "semverGte", "semverGt", "semverLte", "semverLt", "semverEq"]
7
7
  }
@@ -1,2 +1,2 @@
1
- export declare const PACKAGE_VERSION = "15.25.0";
1
+ export declare const PACKAGE_VERSION = "15.25.1";
2
2
  //# sourceMappingURL=_version.d.ts.map
@@ -21,7 +21,7 @@ __export(version_exports, {
21
21
  PACKAGE_VERSION: () => PACKAGE_VERSION
22
22
  });
23
23
  module.exports = __toCommonJS(version_exports);
24
- const PACKAGE_VERSION = "15.25.0";
24
+ const PACKAGE_VERSION = "15.25.1";
25
25
  // Annotate the CommonJS export names for ESM import in node:
26
26
  0 && (module.exports = {
27
27
  PACKAGE_VERSION
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/_version.ts"],
4
- "sourcesContent": ["// This file is auto-generated by the codegen maintenance script\nexport const PACKAGE_VERSION = \"15.25.0\";\n"],
4
+ "sourcesContent": ["// This file is auto-generated by the codegen maintenance script\nexport const PACKAGE_VERSION = \"15.25.1\";\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;AAAA;;;;;AACO,MAAM,kBAAkB;",
6
6
  "names": []
7
7
  }
@@ -1,4 +1,5 @@
1
1
  export * from "./ConfigManager.js";
2
+ export { clearTemplateCache, readJsonWithTemplate, resolveImportPath, resolveTemplateImport, } from "./JsonTemplate.js";
2
3
  export * from "./Logger_safe.js";
3
4
  export * from "./Manufacturers.js";
4
5
  export { PACKAGE_VERSION } from "./_version.js";
@@ -19,10 +19,15 @@ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "defau
19
19
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
20
  var index_exports = {};
21
21
  __export(index_exports, {
22
- PACKAGE_VERSION: () => import_version.PACKAGE_VERSION
22
+ PACKAGE_VERSION: () => import_version.PACKAGE_VERSION,
23
+ clearTemplateCache: () => import_JsonTemplate.clearTemplateCache,
24
+ readJsonWithTemplate: () => import_JsonTemplate.readJsonWithTemplate,
25
+ resolveImportPath: () => import_JsonTemplate.resolveImportPath,
26
+ resolveTemplateImport: () => import_JsonTemplate.resolveTemplateImport
23
27
  });
24
28
  module.exports = __toCommonJS(index_exports);
25
29
  __reExport(index_exports, require("./ConfigManager.js"), module.exports);
30
+ var import_JsonTemplate = require("./JsonTemplate.js");
26
31
  __reExport(index_exports, require("./Logger_safe.js"), module.exports);
27
32
  __reExport(index_exports, require("./Manufacturers.js"), module.exports);
28
33
  var import_version = require("./_version.js");
@@ -36,6 +41,10 @@ __reExport(index_exports, require("./devices/SceneConfig.js"), module.exports);
36
41
  // Annotate the CommonJS export names for ESM import in node:
37
42
  0 && (module.exports = {
38
43
  PACKAGE_VERSION,
44
+ clearTemplateCache,
45
+ readJsonWithTemplate,
46
+ resolveImportPath,
47
+ resolveTemplateImport,
39
48
  ...require("./ConfigManager.js"),
40
49
  ...require("./Logger_safe.js"),
41
50
  ...require("./Manufacturers.js"),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.ts"],
4
- "sourcesContent": ["export * from \"./ConfigManager.js\";\nexport * from \"./Logger_safe.js\";\nexport * from \"./Manufacturers.js\";\nexport { PACKAGE_VERSION } from \"./_version.js\";\nexport * from \"./devices/AssociationConfig.js\";\nexport * from \"./devices/CompatConfig.js\";\nexport * from \"./devices/DeviceConfig.js\";\nexport * from \"./devices/DeviceMetadata.js\";\nexport * from \"./devices/EndpointConfig.js\";\nexport * from \"./devices/ParamInformation.js\";\nexport * from \"./devices/SceneConfig.js\";\nexport type * from \"./devices/shared.js\";\nexport type * from \"./traits.js\";\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;;;;;AAAA,0BAAc,+BAAd;AACA,0BAAc,6BADd;AAEA,0BAAc,+BAFd;AAGA,qBAAgC;AAChC,0BAAc,2CAJd;AAKA,0BAAc,sCALd;AAMA,0BAAc,sCANd;AAOA,0BAAc,wCAPd;AAQA,0BAAc,wCARd;AASA,0BAAc,0CATd;AAUA,0BAAc,qCAVd;",
4
+ "sourcesContent": ["export * from \"./ConfigManager.js\";\nexport {\n\tclearTemplateCache,\n\treadJsonWithTemplate,\n\tresolveImportPath,\n\tresolveTemplateImport,\n} from \"./JsonTemplate.js\";\nexport * from \"./Logger_safe.js\";\nexport * from \"./Manufacturers.js\";\nexport { PACKAGE_VERSION } from \"./_version.js\";\nexport * from \"./devices/AssociationConfig.js\";\nexport * from \"./devices/CompatConfig.js\";\nexport * from \"./devices/DeviceConfig.js\";\nexport * from \"./devices/DeviceMetadata.js\";\nexport * from \"./devices/EndpointConfig.js\";\nexport * from \"./devices/ParamInformation.js\";\nexport * from \"./devices/SceneConfig.js\";\nexport type * from \"./devices/shared.js\";\nexport type * from \"./traits.js\";\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;AAAA,0BAAc,+BAAd;AACA,0BAKO;AACP,0BAAc,6BAPd;AAQA,0BAAc,+BARd;AASA,qBAAgC;AAChC,0BAAc,2CAVd;AAWA,0BAAc,sCAXd;AAYA,0BAAc,sCAZd;AAaA,0BAAc,wCAbd;AAcA,0BAAc,wCAdd;AAeA,0BAAc,0CAfd;AAgBA,0BAAc,qCAhBd;",
6
6
  "names": []
7
7
  }
@@ -2,4 +2,25 @@ import type { ReadFile, ReadFileSystemInfo } from "@zwave-js/shared/bindings";
2
2
  export declare function clearTemplateCache(): void;
3
3
  /** Parses a JSON file with $import keys and replaces them with the selected objects */
4
4
  export declare function readJsonWithTemplate(fs: ReadFileSystemInfo & ReadFile, filename: string, rootDirs?: string | string[]): Promise<Record<string, unknown>>;
5
+ /**
6
+ * Resolves a single `$import` specifier (as used in device config files) to the
7
+ * JSON it pulls in, with the imported file's own `$import`s resolved recursively.
8
+ *
9
+ * @param fs The filesystem used to read config and template files
10
+ * @param contextFilename The file the specifier appears in, used to resolve relative paths and same-file (`#selector`) imports
11
+ * @param specifier The `$import` specifier to resolve, e.g. `~/templates/master_template.json#base_enable_disable`
12
+ * @param rootDirs The root directories that `~/`-prefixed specifiers are resolved against
13
+ */
14
+ export declare function resolveTemplateImport(fs: ReadFileSystemInfo & ReadFile, contextFilename: string, specifier: string, rootDirs?: string | string[]): Promise<Record<string, unknown>>;
15
+ /**
16
+ * Resolves the target file of an `$import` specifier to an absolute path,
17
+ * without reading or resolving the file's contents. Returns `undefined` if the
18
+ * specifier is invalid or the referenced file cannot be located.
19
+ *
20
+ * @param fs The filesystem used to locate `~/`-prefixed files
21
+ * @param contextFilename The file the specifier appears in, used to resolve relative and same-file imports
22
+ * @param specifier The `$import` specifier
23
+ * @param rootDirs The root directories that `~/`-prefixed specifiers are resolved against
24
+ */
25
+ export declare function resolveImportPath(fs: ReadFileSystemInfo & ReadFile, contextFilename: string, specifier: string, rootDirs?: string | string[]): Promise<string | undefined>;
5
26
  //# sourceMappingURL=JsonTemplate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"JsonTemplate.d.ts","sourceRoot":"","sources":["../../src/JsonTemplate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAe9E,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED,uFAAuF;AACvF,wBAAsB,oBAAoB,CACzC,EAAE,EAAE,kBAAkB,GAAG,QAAQ,EACjC,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAC1B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA6BlC"}
1
+ {"version":3,"file":"JsonTemplate.d.ts","sourceRoot":"","sources":["../../src/JsonTemplate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAe9E,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED,uFAAuF;AACvF,wBAAsB,oBAAoB,CACzC,EAAE,EAAE,kBAAkB,GAAG,QAAQ,EACjC,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAC1B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA6BlC;AAwHD;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CAC1C,EAAE,EAAE,kBAAkB,GAAG,QAAQ,EACjC,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAC1B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA2BlC;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CACtC,EAAE,EAAE,kBAAkB,GAAG,QAAQ,EACjC,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAC1B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAoB7B"}
@@ -75,6 +75,81 @@ function getImportStack(visited, selector) {
75
75
  }
76
76
  return "";
77
77
  }
78
+ /**
79
+ * Resolves the filename portion of an `$import` specifier to an absolute path.
80
+ *
81
+ * @param fs The filesystem used to check whether candidate files exist
82
+ * @param importFilename The filename portion of the specifier, e.g. `~/templates/foo.json` or `templates/foo.json`
83
+ * @param contextFilename The file the specifier appears in, used to resolve relative paths
84
+ * @param rootDirs The root directories that `~/`-prefixed specifiers are resolved against
85
+ * @param visited The import stack so far, included in error messages
86
+ * @param selector The selector portion of the specifier, included in error messages
87
+ */
88
+ async function resolveImportFilename(fs, importFilename, contextFilename, rootDirs, visited, selector) {
89
+ if (importFilename.startsWith("~/")) {
90
+ // This is a special import specifier that is relative to the root directory
91
+ // Try to find at least one root directory that contains the referenced file
92
+ if (!rootDirs) {
93
+ throw new ZWaveError(`An $import specifier cannot start with ~/ when no root directory is defined!${getImportStack(visited, selector)}`, ZWaveErrorCodes.Config_Invalid);
94
+ }
95
+ for (const rootDir of rootDirs) {
96
+ const candidate = path.join(rootDir, importFilename.slice(2));
97
+ if (await pathExists(fs, candidate))
98
+ return candidate;
99
+ }
100
+ throw new ZWaveError(`Could not find the referenced file ${importFilename.slice(2)} in any of the root directories: ${rootDirs.map((d) => `\n· ${d}`).join("")}\n${getImportStack(visited, selector)}`, ZWaveErrorCodes.Config_Invalid);
101
+ }
102
+ else {
103
+ return path.join(path.dirname(contextFilename), importFilename);
104
+ }
105
+ }
106
+ /**
107
+ * Resolves a single `$import` specifier (as used in device config files) to the
108
+ * JSON it pulls in, with the imported file's own `$import`s resolved recursively.
109
+ *
110
+ * @param fs The filesystem used to read config and template files
111
+ * @param contextFilename The file the specifier appears in, used to resolve relative paths and same-file (`#selector`) imports
112
+ * @param specifier The `$import` specifier to resolve, e.g. `~/templates/master_template.json#base_enable_disable`
113
+ * @param rootDirs The root directories that `~/`-prefixed specifiers are resolved against
114
+ */
115
+ export async function resolveTemplateImport(fs, contextFilename, specifier, rootDirs) {
116
+ assertImportSpecifier(specifier);
117
+ if (typeof rootDirs === "string")
118
+ rootDirs = [rootDirs];
119
+ const { filename: importFilename, selector } = importSpecifierRegex
120
+ .exec(specifier).groups;
121
+ const newFilename = importFilename
122
+ ? await resolveImportFilename(fs, importFilename, contextFilename, rootDirs, [], selector)
123
+ : path.normalize(contextFilename);
124
+ const fileCache = new Map(templateCache);
125
+ return readJsonWithTemplateInternal(fs, newFilename, selector, [], fileCache, rootDirs);
126
+ }
127
+ /**
128
+ * Resolves the target file of an `$import` specifier to an absolute path,
129
+ * without reading or resolving the file's contents. Returns `undefined` if the
130
+ * specifier is invalid or the referenced file cannot be located.
131
+ *
132
+ * @param fs The filesystem used to locate `~/`-prefixed files
133
+ * @param contextFilename The file the specifier appears in, used to resolve relative and same-file imports
134
+ * @param specifier The `$import` specifier
135
+ * @param rootDirs The root directories that `~/`-prefixed specifiers are resolved against
136
+ */
137
+ export async function resolveImportPath(fs, contextFilename, specifier, rootDirs) {
138
+ if (!importSpecifierRegex.test(specifier))
139
+ return undefined;
140
+ if (typeof rootDirs === "string")
141
+ rootDirs = [rootDirs];
142
+ const { filename: importFilename } = importSpecifierRegex
143
+ .exec(specifier).groups;
144
+ if (!importFilename)
145
+ return path.normalize(contextFilename);
146
+ try {
147
+ return await resolveImportFilename(fs, importFilename, contextFilename, rootDirs, [], undefined);
148
+ }
149
+ catch {
150
+ return undefined;
151
+ }
152
+ }
78
153
  async function readJsonWithTemplateInternal(fs, filename, selector, visited, fileCache, rootDirs) {
79
154
  filename = path.normalize(filename);
80
155
  // If we're limited by one or more root directories, make sure the file is inside one of those
@@ -127,40 +202,9 @@ async function resolveJsonImports(fs, json, filename, visited, fileCache, rootDi
127
202
  const { filename: importFilename, selector } = importSpecifierRegex
128
203
  .exec(val).groups;
129
204
  // Resolve the correct import path
130
- let newFilename;
131
- if (importFilename) {
132
- if (importFilename.startsWith("~/")) {
133
- // This is a special import specifier that is relative to the root directory
134
- // Try to find at least one root directory that contains the referenced file
135
- if (rootDirs) {
136
- for (const rootDir of rootDirs) {
137
- newFilename = path.join(rootDir, importFilename.slice(2));
138
- if (await pathExists(fs, newFilename)) {
139
- break;
140
- }
141
- else {
142
- // Try the next
143
- newFilename = undefined;
144
- }
145
- }
146
- if (!newFilename) {
147
- throw new ZWaveError(`Could not find the referenced file ${importFilename.slice(2)} in any of the root directories: ${rootDirs
148
- .map((d) => `\n· ${d}`)
149
- .join("")}\n${getImportStack(visited, selector)}`, ZWaveErrorCodes.Config_Invalid);
150
- }
151
- }
152
- else {
153
- throw new ZWaveError(`An $import specifier cannot start with ~/ when no root directory is defined!${getImportStack(visited, selector)}`, ZWaveErrorCodes.Config_Invalid);
154
- }
155
- }
156
- else {
157
- newFilename = path.join(path.dirname(filename), importFilename);
158
- }
159
- }
160
- else {
161
- newFilename = filename;
162
- }
163
- // const importFilename = path.join(path.dirname(filename), val);
205
+ const newFilename = importFilename
206
+ ? await resolveImportFilename(fs, importFilename, filename, rootDirs, visited, selector)
207
+ : filename;
164
208
  const imported = await readJsonWithTemplateInternal(fs, newFilename, selector, visited, fileCache, rootDirs);
165
209
  Object.assign(ret, imported);
166
210
  }
@@ -1 +1 @@
1
- {"version":3,"file":"JsonTemplate.js","sourceRoot":"","sources":["../../src/JsonTemplate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"JsonTemplate.js","sourceRoot":"","sources":["../../src/JsonTemplate.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Logic.d.ts","sourceRoot":"","sources":["../../src/Logic.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,UAAU,EAAwB,MAAM,eAAe,CAAC;AAsCtE,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAMpD;AAED,wBAAgB,QAAQ,CACvB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,GACd,MAAM,GAAG,MAAM,GAAG,OAAO,CAG3B"}
1
+ {"version":3,"file":"Logic.d.ts","sourceRoot":"","sources":["../../src/Logic.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,UAAU,EAAwB,MAAM,eAAe,CAAC;AA0CtE,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAMpD;AAED,wBAAgB,QAAQ,CACvB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,GACd,MAAM,GAAG,MAAM,GAAG,OAAO,CAG3B"}
@@ -23,6 +23,7 @@ add_operation("ver >", tryOr((a, b) => semverGt(padVersion(a), padVersion(b)), f
23
23
  add_operation("ver <=", tryOr((a, b) => semverLte(padVersion(a), padVersion(b)), false));
24
24
  add_operation("ver <", tryOr((a, b) => semverLt(padVersion(a), padVersion(b)), false));
25
25
  add_operation("ver ===", tryOr((a, b) => semverEq(padVersion(a), padVersion(b)), false));
26
+ add_operation("ver !==", tryOr((a, b) => !semverEq(padVersion(a), padVersion(b)), false));
26
27
  export function parseLogic(input) {
27
28
  const expr = parse(input);
28
29
  if (!expr) {
@@ -1 +1 @@
1
- {"version":3,"file":"Logic.js","sourceRoot":"","sources":["../../src/Logic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,SAAS,MAAM,yBAAyB,CAAC;AAChD,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,SAAS,MAAM,yBAAyB,CAAC;AAEhD,6BAA6B;AAC7B,OAAO,EAAmB,OAAO,IAAI,SAAS,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACvD,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC;AAE3C,SAAS,KAAK,CACb,SAAY,EACZ,OAAsB;IAEtB,OAAO,CAAC,CAAC,GAAG,IAAW,EAAE,EAAE;QAC1B,IAAI,CAAC;YACJ,OAAO,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,OAAO,CAAC;QAChB,CAAC;IACF,CAAC,CAAa,CAAC;AAChB,CAAC;AAED,aAAa,CACZ,QAAQ,EACR,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAC/D,CAAC;AACF,aAAa,CACZ,OAAO,EACP,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAC9D,CAAC;AACF,aAAa,CACZ,QAAQ,EACR,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAC/D,CAAC;AACF,aAAa,CACZ,OAAO,EACP,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAC9D,CAAC;AACF,aAAa,CACZ,SAAS,EACT,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAC9D,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,KAAa;IACvC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,QAAQ,CACvB,KAAa,EACb,OAAgB;IAEhB,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAChC,OAAO,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"Logic.js","sourceRoot":"","sources":["../../src/Logic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,SAAS,MAAM,yBAAyB,CAAC;AAChD,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,SAAS,MAAM,yBAAyB,CAAC;AAEhD,6BAA6B;AAC7B,OAAO,EAAmB,OAAO,IAAI,SAAS,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACvD,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC;AAE3C,SAAS,KAAK,CACb,SAAY,EACZ,OAAsB;IAEtB,OAAO,CAAC,CAAC,GAAG,IAAW,EAAE,EAAE;QAC1B,IAAI,CAAC;YACJ,OAAO,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,OAAO,CAAC;QAChB,CAAC;IACF,CAAC,CAAa,CAAC;AAChB,CAAC;AAED,aAAa,CACZ,QAAQ,EACR,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAC/D,CAAC;AACF,aAAa,CACZ,OAAO,EACP,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAC9D,CAAC;AACF,aAAa,CACZ,QAAQ,EACR,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAC/D,CAAC;AACF,aAAa,CACZ,OAAO,EACP,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAC9D,CAAC;AACF,aAAa,CACZ,SAAS,EACT,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAC9D,CAAC;AACF,aAAa,CACZ,SAAS,EACT,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAC/D,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,KAAa;IACvC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,QAAQ,CACvB,KAAa,EACb,OAAgB;IAEhB,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAChC,OAAO,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC9B,CAAC"}
@@ -1,2 +1,2 @@
1
- export declare const PACKAGE_VERSION = "15.25.0";
1
+ export declare const PACKAGE_VERSION = "15.25.1";
2
2
  //# sourceMappingURL=_version.d.ts.map
@@ -1,3 +1,3 @@
1
1
  // This file is auto-generated by the codegen maintenance script
2
- export const PACKAGE_VERSION = "15.25.0";
2
+ export const PACKAGE_VERSION = "15.25.1";
3
3
  //# sourceMappingURL=_version.js.map
@@ -1,4 +1,5 @@
1
1
  export * from "./ConfigManager.js";
2
+ export { clearTemplateCache, readJsonWithTemplate, resolveImportPath, resolveTemplateImport, } from "./JsonTemplate.js";
2
3
  export * from "./Logger_safe.js";
3
4
  export * from "./Manufacturers.js";
4
5
  export { PACKAGE_VERSION } from "./_version.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,mBAAmB,qBAAqB,CAAC;AACzC,mBAAmB,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,OAAO,EACN,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,mBAAmB,qBAAqB,CAAC;AACzC,mBAAmB,aAAa,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export * from "./ConfigManager.js";
2
+ export { clearTemplateCache, readJsonWithTemplate, resolveImportPath, resolveTemplateImport, } from "./JsonTemplate.js";
2
3
  export * from "./Logger_safe.js";
3
4
  export * from "./Manufacturers.js";
4
5
  export { PACKAGE_VERSION } from "./_version.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,OAAO,EACN,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC"}