@webpieces/rules-config 0.2.125 → 0.2.126

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webpieces/rules-config",
3
- "version": "0.2.125",
3
+ "version": "0.2.126",
4
4
  "description": "Shared webpieces.config.json loader. Single source of truth for validation rule configuration consumed by @webpieces/ai-hook-rules, @webpieces/code-rules, and @webpieces/nx-webpieces-rules.",
5
5
  "type": "commonjs",
6
6
  "main": "./src/index.js",
@@ -1,9 +1,7 @@
1
1
  import { ResolvedConfig } from './types';
2
2
  export declare const CONFIG_FILENAME = "webpieces.config.json";
3
3
  /**
4
- * Walk up from `startDir` looking for webpieces.config.json. Falls back to
5
- * the legacy webpieces.ai-hooks.json (with a one-time warning) so old
6
- * setups keep working during migration.
4
+ * Walk up from `startDir` looking for webpieces.config.json.
7
5
  */
8
6
  export declare function findConfigFile(startDir: string): string | null;
9
7
  export declare function loadConfig(cwd: string): ResolvedConfig;
@@ -9,11 +9,8 @@ const path = tslib_1.__importStar(require("path"));
9
9
  const default_rules_1 = require("./default-rules");
10
10
  const types_1 = require("./types");
11
11
  exports.CONFIG_FILENAME = 'webpieces.config.json';
12
- const LEGACY_AI_HOOKS_FILENAME = 'webpieces.ai-hooks.json';
13
12
  /**
14
- * Walk up from `startDir` looking for webpieces.config.json. Falls back to
15
- * the legacy webpieces.ai-hooks.json (with a one-time warning) so old
16
- * setups keep working during migration.
13
+ * Walk up from `startDir` looking for webpieces.config.json.
17
14
  */
18
15
  function findConfigFile(startDir) {
19
16
  let dir = startDir;
@@ -21,25 +18,12 @@ function findConfigFile(startDir) {
21
18
  const primary = path.join(dir, exports.CONFIG_FILENAME);
22
19
  if (fs.existsSync(primary))
23
20
  return primary;
24
- const legacy = path.join(dir, LEGACY_AI_HOOKS_FILENAME);
25
- if (fs.existsSync(legacy)) {
26
- warnLegacyOnce(legacy);
27
- return legacy;
28
- }
29
21
  const parent = path.dirname(dir);
30
22
  if (parent === dir)
31
23
  return null;
32
24
  dir = parent;
33
25
  }
34
26
  }
35
- let legacyWarned = false;
36
- function warnLegacyOnce(legacyPath) {
37
- if (legacyWarned)
38
- return;
39
- legacyWarned = true;
40
- process.stderr.write(`[webpieces/config] Using legacy ${LEGACY_AI_HOOKS_FILENAME} at ${legacyPath}. ` +
41
- `Rename to ${exports.CONFIG_FILENAME} to silence this warning.\n`);
42
- }
43
27
  // webpieces-disable no-any-unknown -- merging opaque option bags from config JSON
44
28
  function mergeRule(
45
29
  // webpieces-disable no-any-unknown -- opaque option bag
@@ -1 +1 @@
1
- {"version":3,"file":"load-config.js","sourceRoot":"","sources":["../../../../../packages/tooling/rules-config/src/load-config.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\n\nimport { defaultRules } from './default-rules';\nimport { ResolvedConfig, ResolvedRuleConfig, RuleOptions } from './types';\n\nexport const CONFIG_FILENAME = 'webpieces.config.json';\nconst LEGACY_AI_HOOKS_FILENAME = 'webpieces.ai-hooks.json';\n\n// webpieces-disable no-any-unknown -- consumer JSON config has opaque rule option values\ninterface RawConfigFile {\n extends?: string;\n rules?: Record<string, Record<string, unknown>>;\n rulesDir?: string[];\n}\n\n/**\n * Walk up from `startDir` looking for webpieces.config.json. Falls back to\n * the legacy webpieces.ai-hooks.json (with a one-time warning) so old\n * setups keep working during migration.\n */\nexport function findConfigFile(startDir: string): string | null {\n let dir = startDir;\n while (true) {\n const primary = path.join(dir, CONFIG_FILENAME);\n if (fs.existsSync(primary)) return primary;\n const legacy = path.join(dir, LEGACY_AI_HOOKS_FILENAME);\n if (fs.existsSync(legacy)) {\n warnLegacyOnce(legacy);\n return legacy;\n }\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nlet legacyWarned = false;\nfunction warnLegacyOnce(legacyPath: string): void {\n if (legacyWarned) return;\n legacyWarned = true;\n process.stderr.write(\n `[webpieces/config] Using legacy ${LEGACY_AI_HOOKS_FILENAME} at ${legacyPath}. ` +\n `Rename to ${CONFIG_FILENAME} to silence this warning.\\n`,\n );\n}\n\n// webpieces-disable no-any-unknown -- merging opaque option bags from config JSON\nfunction mergeRule(\n // webpieces-disable no-any-unknown -- opaque option bag\n baseRule: Record<string, unknown> | undefined,\n // webpieces-disable no-any-unknown -- opaque option bag\n overrideRule: Record<string, unknown> | undefined,\n): ResolvedRuleConfig {\n if (!baseRule && !overrideRule) return new ResolvedRuleConfig(false, {});\n if (!baseRule) return new ResolvedRuleConfig(enabledOf(overrideRule!), overrideRule as RuleOptions);\n if (!overrideRule) return new ResolvedRuleConfig(enabledOf(baseRule), baseRule as RuleOptions);\n\n // webpieces-disable no-any-unknown -- building merged option bag\n const merged: Record<string, unknown> = {};\n for (const key of Object.keys(baseRule)) merged[key] = baseRule[key];\n for (const key of Object.keys(overrideRule)) merged[key] = overrideRule[key];\n return new ResolvedRuleConfig(enabledOf(merged), merged as RuleOptions);\n}\n\n// webpieces-disable no-any-unknown -- opaque option bag\nfunction enabledOf(bag: Record<string, unknown>): boolean {\n return bag['enabled'] !== false;\n}\n\nfunction readRawConfig(configPath: string): RawConfigFile | null {\n // eslint-disable-next-line @webpieces/no-unmanaged-exceptions\n try {\n const raw = fs.readFileSync(configPath, 'utf8');\n return JSON.parse(raw) as RawConfigFile;\n // webpieces-disable catch-error-pattern -- malformed config fails open so missing config doesn't break validators\n } catch (err: unknown) {\n //const error = toError(err);\n void err;\n return null;\n }\n}\n\nexport function loadConfig(cwd: string): ResolvedConfig {\n const configPath = findConfigFile(cwd);\n\n if (!configPath) {\n return new ResolvedConfig(new Map(), [], null);\n }\n\n const consumerConfig = readRawConfig(configPath);\n if (!consumerConfig) {\n return new ResolvedConfig(new Map(), [], configPath);\n }\n\n const overrideRules = consumerConfig.rules || {};\n const mergedRules = new Map<string, ResolvedRuleConfig>();\n\n const allRuleNames = new Set([\n ...Object.keys(defaultRules),\n ...Object.keys(overrideRules),\n ]);\n for (const name of allRuleNames) {\n mergedRules.set(name, mergeRule(defaultRules[name], overrideRules[name]));\n }\n\n const rulesDir = consumerConfig.rulesDir ?? [];\n\n return new ResolvedConfig(mergedRules, rulesDir, configPath);\n}\n"]}
1
+ {"version":3,"file":"load-config.js","sourceRoot":"","sources":["../../../../../packages/tooling/rules-config/src/load-config.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\n\nimport { defaultRules } from './default-rules';\nimport { ResolvedConfig, ResolvedRuleConfig, RuleOptions } from './types';\n\nexport const CONFIG_FILENAME = 'webpieces.config.json';\n\n// webpieces-disable no-any-unknown -- consumer JSON config has opaque rule option values\ninterface RawConfigFile {\n extends?: string;\n rules?: Record<string, Record<string, unknown>>;\n rulesDir?: string[];\n}\n\n/**\n * Walk up from `startDir` looking for webpieces.config.json.\n */\nexport function findConfigFile(startDir: string): string | null {\n let dir = startDir;\n while (true) {\n const primary = path.join(dir, CONFIG_FILENAME);\n if (fs.existsSync(primary)) return primary;\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\n// webpieces-disable no-any-unknown -- merging opaque option bags from config JSON\nfunction mergeRule(\n // webpieces-disable no-any-unknown -- opaque option bag\n baseRule: Record<string, unknown> | undefined,\n // webpieces-disable no-any-unknown -- opaque option bag\n overrideRule: Record<string, unknown> | undefined,\n): ResolvedRuleConfig {\n if (!baseRule && !overrideRule) return new ResolvedRuleConfig(false, {});\n if (!baseRule) return new ResolvedRuleConfig(enabledOf(overrideRule!), overrideRule as RuleOptions);\n if (!overrideRule) return new ResolvedRuleConfig(enabledOf(baseRule), baseRule as RuleOptions);\n\n // webpieces-disable no-any-unknown -- building merged option bag\n const merged: Record<string, unknown> = {};\n for (const key of Object.keys(baseRule)) merged[key] = baseRule[key];\n for (const key of Object.keys(overrideRule)) merged[key] = overrideRule[key];\n return new ResolvedRuleConfig(enabledOf(merged), merged as RuleOptions);\n}\n\n// webpieces-disable no-any-unknown -- opaque option bag\nfunction enabledOf(bag: Record<string, unknown>): boolean {\n return bag['enabled'] !== false;\n}\n\nfunction readRawConfig(configPath: string): RawConfigFile | null {\n // eslint-disable-next-line @webpieces/no-unmanaged-exceptions\n try {\n const raw = fs.readFileSync(configPath, 'utf8');\n return JSON.parse(raw) as RawConfigFile;\n // webpieces-disable catch-error-pattern -- malformed config fails open so missing config doesn't break validators\n } catch (err: unknown) {\n //const error = toError(err);\n void err;\n return null;\n }\n}\n\nexport function loadConfig(cwd: string): ResolvedConfig {\n const configPath = findConfigFile(cwd);\n\n if (!configPath) {\n return new ResolvedConfig(new Map(), [], null);\n }\n\n const consumerConfig = readRawConfig(configPath);\n if (!consumerConfig) {\n return new ResolvedConfig(new Map(), [], configPath);\n }\n\n const overrideRules = consumerConfig.rules || {};\n const mergedRules = new Map<string, ResolvedRuleConfig>();\n\n const allRuleNames = new Set([\n ...Object.keys(defaultRules),\n ...Object.keys(overrideRules),\n ]);\n for (const name of allRuleNames) {\n mergedRules.set(name, mergeRule(defaultRules[name], overrideRules[name]));\n }\n\n const rulesDir = consumerConfig.rulesDir ?? [];\n\n return new ResolvedConfig(mergedRules, rulesDir, configPath);\n}\n"]}