{"id":20256,"library":"pack-config-diff","title":"pack-config-diff","description":"Semantic configuration differ and dumper for webpack and rspack projects. Version 0.1.0 (initial public release) supports comparing two configuration objects with semantic explanations, exporting live configs to YAML/JSON/inspect, and generating reports in summary, markdown, or JSON formats. Extracted from Shakapacker and battle-tested in production. Key differentiators: plugin-aware comparison, rule-matching by test pattern, ignore-paths filtering, and support for JS/TS/JSON/YAML config files. Requires Node >=16 and ts-node >=10 as peer dependency. Ships TypeScript types.","status":"active","version":"0.1.0","language":"javascript","source_language":"en","source_url":"https://github.com/shakacode/pack-config-diff","tags":["javascript","webpack","rspack","config","diff","compare","configuration","typescript"],"install":[{"cmd":"npm install pack-config-diff","lang":"bash","label":"npm"},{"cmd":"yarn add pack-config-diff","lang":"bash","label":"yarn"},{"cmd":"pnpm add pack-config-diff","lang":"bash","label":"pnpm"}],"dependencies":[{"reason":"Required to evaluate TypeScript configuration files","package":"ts-node","optional":false}],"imports":[{"note":"Package is ESM-only by default; CommonJS require() will fail in Node >=16 unless using --experimental-modules or dynamic import.","wrong":"const packConfigDiff = require('pack-config-diff')","symbol":"default","correct":"import packConfigDiff from 'pack-config-diff'"},{"note":"Named export 'diff' is available from the main entry. Do not use subpath imports; they are not guaranteed stable.","wrong":"const diff = require('pack-config-diff/diff')","symbol":"diff","correct":"import { diff } from 'pack-config-diff'"},{"note":"Both 'diff' and 'dump' are named exports. The package also exports a default object with these methods, but named imports are preferred for tree-shaking.","wrong":"const { dump } = require('pack-config-diff').default","symbol":"dump","correct":"import { dump } from 'pack-config-diff'"},{"note":"Type imports should use the 'type' keyword for transpile-only usage. ConfigDiffOptions is a TypeScript type, not a runtime value.","wrong":"import { ConfigDiffOptions } from 'pack-config-diff'","symbol":"type ConfigDiffOptions","correct":"import type { ConfigDiffOptions } from 'pack-config-diff'"}],"quickstart":{"code":"#!/usr/bin/env node\nimport { execSync } from 'child_process';\n\n// Compare two config files using the CLI\nconst result = execSync(\n  `npx pack-config-diff --left=webpack.dev.js --right=webpack.prod.js --format=json`,\n  { encoding: 'utf-8' }\n);\nconsole.log(JSON.parse(result));\n\n// Or programmatically\nimport { diff } from 'pack-config-diff';\nimport webpack from 'webpack';\n\nconst devConfig = webpack({ mode: 'development' });\nconst prodConfig = webpack({ mode: 'production' });\n\nconst report = diff(devConfig, prodConfig, {\n  format: 'markdown',\n  pluginAware: true,\n});\nconsole.log(report);\n","lang":"typescript","description":"CLI command compare two webpack/rspack config files in JSON format, and programmatic API to diff configuration objects with markdown output."},"warnings":[{"fix":"Always use --clean flag when sharing dump snapshots. For internal trusted automation, add --no-warn-sensitive to suppress the warning.","message":"Dump output may include sensitive values (e.g., API keys, secrets) unless --clean is used.","severity":"gotcha","affected_versions":">=0.1.0"},{"fix":"Use --plugin-aware only when comparing configs with identical plugin instances and deterministic plugin constructors. For most cases, omit this flag or compare using --ignore-paths='plugins'.","message":"Plugin-aware comparison (--plugin-aware) may produce inaccurate diffs if plugins use non-deterministic serialization or depend on environment variables.","severity":"gotcha","affected_versions":">=0.1.0"},{"fix":"Convert your code to ES modules (use import) or use dynamic import: const packConfigDiff = await import('pack-config-diff'). Use Node >=16.","message":"Breaking change in v0.1.0: Package is ESM-only. CommonJS require() will throw a MODULE_NOT_FOUND error if used without dynamic import or --experimental-modules.","severity":"breaking","affected_versions":">=0.1.0"},{"fix":"Always specify --mode explicitly when calling diff or dump to ensure consistent comparison conditions.","message":"The --mode argument defaults to 'production' if not provided. Using --mode=development or --mode=none is recommended during debugging to avoid unnecessary optimizations masking diff differences.","severity":"deprecated","affected_versions":">=0.1.0"}],"env_vars":null,"last_verified":"2026-04-25T00:00:00.000Z","next_check":"2026-07-24T00:00:00.000Z","problems":[{"fix":"Use import statement or dynamic import: import packConfigDiff from 'pack-config-diff' or const packConfigDiff = await import('pack-config-diff')","cause":"Using CommonJS require() for an ESM-only package.","error":"Error: Cannot find module 'pack-config-diff'"},{"fix":"Use named import: import { diff } from 'pack-config-diff'","cause":"Using default import destructuring incorrectly; diff is not a property of the default export, it's a named export.","error":"TypeError: (0 , pack_config_diff.diff) is not a function"},{"fix":"Use --format=text for a human-readable summary, or --format=json / --format=markdown for structured output.","cause":"The format option must be one of: 'text' (default), 'json', 'markdown'. 'summary' is not supported.","error":"Error: Unknown argument: --format=summary"},{"fix":"Install ts-node as a devDependency: npm install -D ts-node@10","cause":"ts-node >=10 is required to load TypeScript config files, but it is not installed.","error":"Error: Config file not found: webpack.config.ts (ts-node peer dependency missing)"}],"ecosystem":"npm","meta_description":null,"install_score":null,"install_tag":null,"quickstart_score":null,"quickstart_tag":null}