JamieMason/syncpack

View on GitHub
src/get-package-json-files/get-patterns/index.ts

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
import { Effect, Option as O, pipe } from 'effect';
import { isArrayOfStrings } from 'tightrope/guard/is-array-of-strings.js';
import { getSource } from '../../config/get-source.js';
import { DEFAULT_CONFIG } from '../../constants.js';
import type { Ctx } from '../../get-context/index.js';
import type { Io } from '../../io/index.js';
import { getLernaPatterns } from './get-lerna-patterns.js';
import { getPnpmPatterns } from './get-pnpm-patterns.js';
import { getYarnPatterns } from './get-yarn-patterns.js';

/**
 * Find every glob pattern which should be used to find package.json files for
 * this monorepo.
 */
export function getPatterns(io: Io, config: Ctx['config']): Effect.Effect<string[]> {
  return pipe(
    getCliPatterns(),
    Effect.flatMap((opt) => (O.isSome(opt) ? Effect.succeed(opt) : getWorkspacePatterns())),
    Effect.map(O.map(limitToPackageJson)),
    Effect.map(O.getOrElse(() => [...DEFAULT_CONFIG.source])),
  );

  function getCliPatterns(): Effect.Effect<O.Option<string[]>> {
    return pipe(O.some(getSource(config)), O.filter(isArrayOfStrings), Effect.succeed);
  }

  function getWorkspacePatterns(): Effect.Effect<O.Option<string[]>> {
    return pipe(
      getYarnPatterns(io),
      Effect.flatMap((opt) => (O.isSome(opt) ? Effect.succeed(opt) : getPnpmPatterns(io))),
      Effect.flatMap((opt) => (O.isSome(opt) ? Effect.succeed(opt) : getLernaPatterns(io))),
      Effect.map(O.map((patterns) => ['package.json', ...patterns])),
    );
  }

  function limitToPackageJson(patterns: string[]): string[] {
    return patterns.map((pattern) =>
      pattern.includes('package.json') ? pattern : `${pattern}/package.json`,
    );
  }
}