Ctrl K
ComunidadGuías…

eslint.boundaries.mjs

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
/**
 * Workspace dependency matrix (spec §4; design decision 2):
 *
 *   shared        → (no workspace package)
 *   data-plane    → shared
 *   control-plane → shared + data-plane
 *   frontend      → shared
 *
 * Enforced for every import style — package name (`@polyrouter/x`), path alias,
 * and relative path — so the data-plane extraction (spec §3.3) stays lift-and-shift.
 * Consumed by eslint.config.mjs and unit-tested in packages/shared/test/boundaries.test.ts.
 */

const FORBIDDEN = {
  shared: ['control-plane', 'data-plane', 'frontend'],
  'data-plane': ['control-plane', 'frontend'],
  'control-plane': ['frontend'],
  frontend: ['control-plane', 'data-plane'],
};

const ALLOWED_DESC = {
  shared: 'no workspace package',
  'data-plane': 'only @polyrouter/shared',
  'control-plane': 'only @polyrouter/shared and @polyrouter/data-plane',
  frontend: 'only @polyrouter/shared',
};

function forbiddenPatterns(packageNames) {
  return packageNames.flatMap((name) => [
    `@polyrouter/${name}`,
    `@polyrouter/${name}/**`,
    `**/packages/${name}/**`,
    `**/${name}/src/**`,
    `**/${name}/dist/**`,
  ]);
}

/** Extra per-package restrictions beyond the package matrix. The shared
 * `./server` entrypoint (schema, tenancy, encryption — node-only) is
 * forbidden to the frontend in EVERY import form: package subpath, deep
 * source path, relative path, and built output. */
const EXTRA_RESTRICTIONS = {
  frontend: [
    {
      group: [
        '@polyrouter/shared/server',
        '@polyrouter/shared/server/**',
        '**/shared/src/server/**',
        '**/shared/dist/server*',
      ],
      message:
        'frontend must not import server-only shared code (@polyrouter/shared/server) in any form.',
    },
  ],
};

export function boundaryRulesFor(packageKey) {
  return {
    'no-restricted-imports': [
      'error',
      {
        patterns: [
          {
            group: forbiddenPatterns(FORBIDDEN[packageKey]),
            message: `Workspace dependency matrix: ${packageKey} may import ${ALLOWED_DESC[packageKey]}.`,
          },
          ...(EXTRA_RESTRICTIONS[packageKey] ?? []),
        ],
      },
    ],
  };
}

export const boundaryConfigs = Object.keys(FORBIDDEN).map((packageKey) => ({
  name: `boundaries/${packageKey}`,
  files: [`packages/${packageKey}/**/*.{ts,tsx,mts,cts,js,mjs,cjs}`],
  rules: boundaryRulesFor(packageKey),
}));

export default boundaryConfigs;