{
  "version": 3,
  "sources": ["../../../../src/packages/lockfile.detect-dep-types/index.ts"],
  "sourcesContent": ["import type {\n  LockfileObject,\n  PackageSnapshots,\n  ProjectSnapshot,\n  ResolvedDependencies,\n} from '../lockfile.types/index.ts';\nimport * as dp from '../dependency-path/index.ts';\nimport type { DepPath } from '../types/index.ts';\n\nexport enum DepType {\n  DevOnly = 0,\n  DevAndProd = 1,\n  ProdOnly = 2,\n}\n\nexport type DepTypes = Record<string, DepType>;\n\nexport function detectDepTypes(lockfile: LockfileObject): DepTypes {\n  const dev: DepTypes = {};\n\n  const devDepPaths = Object.values(lockfile.importers ?? {}).flatMap(\n    (deps: ProjectSnapshot): DepPath[] => {\n      return resolvedDepsToDepPaths(deps.devDependencies ?? {});\n    }\n  );\n\n  const optionalDepPaths = Object.values(lockfile.importers ?? {}).flatMap(\n    (deps: ProjectSnapshot): DepPath[] => {\n      return resolvedDepsToDepPaths(deps.optionalDependencies ?? {});\n    }\n  );\n\n  const prodDepPaths = Object.values(lockfile.importers ?? {}).flatMap(\n    (deps: ProjectSnapshot): DepPath[] => {\n      return resolvedDepsToDepPaths(deps.dependencies ?? {});\n    }\n  );\n\n  const ctx = {\n    packages: lockfile.packages ?? {},\n    walked: new Set<string>(),\n    notProdOnly: new Set<string>(),\n    dev,\n  };\n\n  detectDepTypesInSubGraph(ctx, devDepPaths, {\n    dev: true,\n  });\n\n  detectDepTypesInSubGraph(ctx, optionalDepPaths, {\n    dev: false,\n  });\n\n  detectDepTypesInSubGraph(ctx, prodDepPaths, {\n    dev: false,\n  });\n\n  return dev;\n}\n\nfunction detectDepTypesInSubGraph(\n  ctx: {\n    notProdOnly: Set<string>;\n    packages: PackageSnapshots;\n    walked: Set<string>;\n    dev: Record<string, DepType>;\n  },\n  depPaths: DepPath[],\n  opts: {\n    dev: boolean;\n  }\n): void {\n  for (const depPath of depPaths) {\n    const key = `${depPath}:${opts.dev.toString()}`;\n\n    if (ctx.walked.has(key)) {\n      continue;\n    }\n\n    ctx.walked.add(key);\n\n    if (!ctx.packages[depPath]) {\n      continue;\n    }\n\n    if (opts.dev) {\n      ctx.notProdOnly.add(depPath);\n\n      ctx.dev[depPath] = DepType.DevOnly;\n    } else if (ctx.dev[depPath] === DepType.DevOnly) {\n      // keeping if dev is explicitly false\n      ctx.dev[depPath] = DepType.DevAndProd;\n    } else if (\n      ctx.dev[depPath] === undefined &&\n      !ctx.notProdOnly.has(depPath)\n    ) {\n      ctx.dev[depPath] = DepType.ProdOnly;\n    }\n\n    const depLockfile = ctx.packages[depPath];\n\n    const newDependencies = resolvedDepsToDepPaths(\n      depLockfile.dependencies ?? {}\n    );\n\n    detectDepTypesInSubGraph(ctx, newDependencies, opts);\n\n    const newOptionalDependencies = resolvedDepsToDepPaths(\n      depLockfile.optionalDependencies ?? {}\n    );\n\n    detectDepTypesInSubGraph(ctx, newOptionalDependencies, { dev: opts.dev });\n  }\n}\n\nfunction resolvedDepsToDepPaths(deps: ResolvedDependencies): DepPath[] {\n  return Object.entries(deps)\n    .map(([alias, ref]: [string, string]): DepPath | null => {\n      return dp.refToRelative(ref, alias);\n    })\n    .filter((depPath: DepPath | null): depPath is DepPath => {\n      return depPath !== null;\n    });\n}\n"],
  "mappings": "AAMA,YAAY,QAAQ;AAGb,IAAK,UAAL,kBAAKA,aAAL;AACL,EAAAA,kBAAA,aAAU,KAAV;AACA,EAAAA,kBAAA,gBAAa,KAAb;AACA,EAAAA,kBAAA,cAAW,KAAX;AAHU,SAAAA;AAAA,GAAA;AAQL,SAAS,eAAe,UAAoC;AACjE,QAAM,MAAgB,CAAC;AAEvB,QAAM,cAAc,OAAO,OAAO,SAAS,aAAa,CAAC,CAAC,EAAE;AAAA,IAC1D,CAAC,SAAqC;AACpC,aAAO,uBAAuB,KAAK,mBAAmB,CAAC,CAAC;AAAA,IAC1D;AAAA,EACF;AAEA,QAAM,mBAAmB,OAAO,OAAO,SAAS,aAAa,CAAC,CAAC,EAAE;AAAA,IAC/D,CAAC,SAAqC;AACpC,aAAO,uBAAuB,KAAK,wBAAwB,CAAC,CAAC;AAAA,IAC/D;AAAA,EACF;AAEA,QAAM,eAAe,OAAO,OAAO,SAAS,aAAa,CAAC,CAAC,EAAE;AAAA,IAC3D,CAAC,SAAqC;AACpC,aAAO,uBAAuB,KAAK,gBAAgB,CAAC,CAAC;AAAA,IACvD;AAAA,EACF;AAEA,QAAM,MAAM;AAAA,IACV,UAAU,SAAS,YAAY,CAAC;AAAA,IAChC,QAAQ,oBAAI,IAAY;AAAA,IACxB,aAAa,oBAAI,IAAY;AAAA,IAC7B;AAAA,EACF;AAEA,2BAAyB,KAAK,aAAa;AAAA,IACzC,KAAK;AAAA,EACP,CAAC;AAED,2BAAyB,KAAK,kBAAkB;AAAA,IAC9C,KAAK;AAAA,EACP,CAAC;AAED,2BAAyB,KAAK,cAAc;AAAA,IAC1C,KAAK;AAAA,EACP,CAAC;AAED,SAAO;AACT;AAEA,SAAS,yBACP,KAMA,UACA,MAGM;AACN,aAAW,WAAW,UAAU;AAC9B,UAAM,MAAM,GAAG,OAAO,IAAI,KAAK,IAAI,SAAS,CAAC;AAE7C,QAAI,IAAI,OAAO,IAAI,GAAG,GAAG;AACvB;AAAA,IACF;AAEA,QAAI,OAAO,IAAI,GAAG;AAElB,QAAI,CAAC,IAAI,SAAS,OAAO,GAAG;AAC1B;AAAA,IACF;AAEA,QAAI,KAAK,KAAK;AACZ,UAAI,YAAY,IAAI,OAAO;AAE3B,UAAI,IAAI,OAAO,IAAI;AAAA,IACrB,WAAW,IAAI,IAAI,OAAO,MAAM,iBAAiB;AAE/C,UAAI,IAAI,OAAO,IAAI;AAAA,IACrB,WACE,IAAI,IAAI,OAAO,MAAM,UACrB,CAAC,IAAI,YAAY,IAAI,OAAO,GAC5B;AACA,UAAI,IAAI,OAAO,IAAI;AAAA,IACrB;AAEA,UAAM,cAAc,IAAI,SAAS,OAAO;AAExC,UAAM,kBAAkB;AAAA,MACtB,YAAY,gBAAgB,CAAC;AAAA,IAC/B;AAEA,6BAAyB,KAAK,iBAAiB,IAAI;AAEnD,UAAM,0BAA0B;AAAA,MAC9B,YAAY,wBAAwB,CAAC;AAAA,IACvC;AAEA,6BAAyB,KAAK,yBAAyB,EAAE,KAAK,KAAK,IAAI,CAAC;AAAA,EAC1E;AACF;AAEA,SAAS,uBAAuB,MAAuC;AACrE,SAAO,OAAO,QAAQ,IAAI,EACvB,IAAI,CAAC,CAAC,OAAO,GAAG,MAAwC;AACvD,WAAO,GAAG,cAAc,KAAK,KAAK;AAAA,EACpC,CAAC,EACA,OAAO,CAAC,YAAgD;AACvD,WAAO,YAAY;AAAA,EACrB,CAAC;AACL;",
  "names": ["DepType"]
}
