// Copyright 2026 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check

const PROD_ONLY =
  process.argv.includes('--production') || process.argv.includes('--strict');

/** @type {import('knip').KnipConfig} */
const config = {
  tags: ['-@knipignore', ...(PROD_ONLY ? ['-@testexport'] : [])],
  treatConfigHintsAsErrors: true,
  ignoreExportsUsedInFile: PROD_ONLY
    ? true
    : {
        type: true,
        interface: true,
        enum: true,
        member: true,
      },
  exclude: ['types'],
  ignoreIssues: {
    'ts/axo/**/*.{ts,tsx}': ['namespaceMembers'],
  },
  workspaces: {
    '.': {
      entry: [
        // Main
        'app/config.main.ts!',
        // Preload
        'ts/windows/about/preload.preload.ts!',
        'ts/windows/calldiagnostic/preload.preload.ts!',
        'ts/windows/debuglog/preload.preload.ts!',
        'ts/windows/loading/preload.preload.ts!',
        'ts/windows/permissions/preload.preload.ts!',
        'ts/windows/screenShare/preload.preload.ts!',
        'ts/windows/sticker-creator/preload.preload.ts!',
        // DOM
        'ts/windows/about/app.dom.tsx!',
        'ts/windows/calldiagnostic/app.dom.tsx!',
        'ts/windows/debuglog/app.dom.tsx!',
        'ts/windows/loading/start.dom.ts!',
        'ts/windows/permissions/app.dom.tsx!',
        'ts/windows/screenShare/app.dom.tsx!',
        // Others
        'codemods/**/*.mjs',
        'scripts/**/*.mjs',
      ],
      project: [
        // Production
        'ts/**/*.{ts,tsx}!',
        '!ts/**/*.stories.{ts,tsx}!',
        '!ts/storybook/**/*.{ts,tsx}!',
        '!ts/test-electron/**/*.{ts,tsx}!',
        '!ts/test-helpers/**/*.{ts,tsx}!',
        '!ts/test-mock/**/*.{ts,tsx}!',
        '!ts/test-node/**/*.{ts,tsx}!',
        '!ts/util/lint/**/*.{ts,tsx}!',
        'app/**/*.{ts,tsx}!',

        // Development
        'ts/**/*.d.ts',
        'ts/util/lint/**/*.{ts,tsx}',
        'test/**/*.mjs',
        'scripts/**/*.mjs',
        'codemods/**/*.mjs',

        // exclude workspaces
        '!danger/**/*.mjs',
      ],
      ignoreDependencies: [
        'buffer', // same name as builtin
        'url', // same name as builtin
        'danger', // turn into real workspace
      ],
      ignoreFiles: [
        'ts/components/Profiler.dom.tsx',
        ...(PROD_ONLY ? ['ts/axo/**/*.dom.tsx'] : []),
      ],
      ignoreBinaries: PROD_ONLY ? ['electron'] : [],
      storybook: {
        entry: [
          '.storybook/main.ts',
          '.storybook/preview.tsx',
          '.storybook/test-runner.ts',
          'ts/**/*.stories.{ts,tsx}',
        ],
      },
      mocha: {
        entry: [
          '.mocharc.json',
          'ts/test-electron/**/*.{ts,tsx}',
          'ts/test-helpers/**/*.{ts,tsx}',
          'ts/test-mock/**/*.{ts,tsx}',
          'ts/test-node/**/*.{ts,tsx}',
        ],
      },
      oxlint: {
        entry: ['.oxlintrc.json', '.oxlint/plugins.mjs'],
        project: ['.oxlint/rules/**/*.mjs'],
      },
      danger: {
        entry: ['dangerfile.mjs'],
        project: ['danger/**/*.mjs'],
      },
    },
    danger: {
      project: ['danger-exports.mjs', 'rules/**/*.mjs'],
    },
    'packages/mute-state-change': {
      ignoreBinaries: ['xcrun'],
      ignoreDependencies: ['node-addon-api'],
    },
    'packages/windows-ucv': {
      ignoreDependencies: ['node-addon-api'],
    },
    'sticker-creator': {
      project: [
        'src/**/*.{ts,tsx}!',
        'src/util/protos.js!',
        '!src/**/*.test.{ts,tsx}!',
      ],
    },
  },
};

export default config;
