{
  "version": 3,
  "sources": ["../../../../src/packages/lockfile.verification/satisfiesPackageManifest.ts"],
  "sourcesContent": ["import type { ProjectSnapshot } from '../lockfile.types/index.ts';\nimport { DEPENDENCIES_FIELDS, type ProjectManifest } from '../types/index.ts';\nimport equals from 'ramda/src/equals';\nimport pickBy from 'ramda/src/pickBy';\nimport omit from 'ramda/src/omit';\n\nexport function satisfiesPackageManifest(\n  opts: {\n    autoInstallPeers?: boolean | undefined;\n    excludeLinksFromLockfile?: boolean | undefined;\n  },\n  importer: ProjectSnapshot | undefined,\n  pkg: ProjectManifest\n): { satisfies: boolean; detailedReason?: string | undefined } {\n  if (typeof importer === 'undefined') {\n    return { satisfies: false, detailedReason: 'no importer' };\n  }\n\n  let existingDeps: Record<string, string> = {\n    ...pkg.devDependencies,\n    ...pkg.dependencies,\n    ...pkg.optionalDependencies,\n  };\n\n  let newPkg = pkg;\n\n  if (opts.autoInstallPeers === true) {\n    newPkg = {\n      ...newPkg,\n      dependencies: {\n        ...(newPkg.peerDependencies &&\n          omit.default(Object.keys(existingDeps), newPkg.peerDependencies)),\n        ...newPkg.dependencies,\n      },\n    };\n\n    existingDeps = {\n      ...newPkg.peerDependencies,\n      ...existingDeps,\n    };\n  }\n\n  const pickNonLinkedDeps = pickBy.default((spec: string): boolean => {\n    return !spec.startsWith('link:');\n  });\n\n  let specs = importer.specifiers;\n\n  if (opts.excludeLinksFromLockfile === true) {\n    existingDeps = pickNonLinkedDeps(existingDeps);\n\n    specs = pickNonLinkedDeps(specs);\n  }\n\n  if (equals.default(existingDeps, specs) !== true) {\n    return {\n      satisfies: false,\n      detailedReason: `specifiers in the lockfile (${JSON.stringify(specs)}) don't match specs in package.json (${JSON.stringify(existingDeps)})`,\n    };\n  }\n\n  if (importer.publishDirectory !== newPkg.publishConfig?.directory) {\n    return {\n      satisfies: false,\n      detailedReason: `\"publishDirectory\" in the lockfile (${importer.publishDirectory ?? 'undefined'}) doesn't match \"publishConfig.directory\" in package.json (${newPkg.publishConfig?.directory ?? 'undefined'})`,\n    };\n  }\n\n  if (\n    equals.default(\n      newPkg.dependenciesMeta ?? {},\n      importer.dependenciesMeta ?? {}\n    ) !== true\n  ) {\n    return {\n      satisfies: false,\n      detailedReason: `importer dependencies meta (${JSON.stringify(importer.dependenciesMeta)}) doesn't match package manifest dependencies meta (${JSON.stringify(newPkg.dependenciesMeta)})`,\n    };\n  }\n\n  for (const depField of DEPENDENCIES_FIELDS) {\n    const importerDeps = importer[depField] ?? {};\n\n    let pkgDeps: Record<string, string> = newPkg[depField] ?? {};\n\n    if (opts.excludeLinksFromLockfile === true) {\n      pkgDeps = pickNonLinkedDeps(pkgDeps);\n    }\n\n    let pkgDepNames: string[];\n\n    switch (depField) {\n      case 'optionalDependencies': {\n        pkgDepNames = Object.keys(pkgDeps);\n\n        break;\n      }\n\n      case 'devDependencies': {\n        pkgDepNames = Object.keys(pkgDeps).filter(\n          (depName: string): boolean => {\n            return (\n              typeof newPkg.optionalDependencies?.[depName] === 'undefined' &&\n              typeof newPkg.dependencies?.[depName] === 'undefined'\n            );\n          }\n        );\n\n        break;\n      }\n\n      case 'dependencies': {\n        pkgDepNames = Object.keys(pkgDeps).filter((depName): boolean => {\n          return (\n            typeof newPkg.optionalDependencies?.[depName] === 'undefined' &&\n            typeof newPkg.dependencies?.[depName] === 'undefined'\n          );\n        });\n\n        break;\n      }\n\n      default: {\n        throw new Error(`Unknown dependency type \"${depField as string}\"`);\n      }\n    }\n\n    if (\n      pkgDepNames.length !== Object.keys(importerDeps).length &&\n      pkgDepNames.length !== countOfNonLinkedDeps(importerDeps)\n    ) {\n      return {\n        satisfies: false,\n        detailedReason: `\"${depField}\" in the lockfile (${JSON.stringify(importerDeps)}) doesn't match the same field in package.json (${JSON.stringify(pkgDeps)})`,\n      };\n    }\n\n    for (const depName of pkgDepNames) {\n      if (\n        typeof importerDeps[depName] === 'undefined' ||\n        importer.specifiers[depName] !== pkgDeps[depName]\n      ) {\n        return {\n          satisfies: false,\n          detailedReason: `importer ${depField}.${depName} specifier ${importer.specifiers[depName]} don't match package manifest specifier (${pkgDeps[depName]})`,\n        };\n      }\n    }\n  }\n\n  return { satisfies: true };\n}\n\nfunction countOfNonLinkedDeps(lockfileDeps: {\n  [depName: string]: string;\n}): number {\n  return Object.values(lockfileDeps).filter(\n    (ref) => !ref.includes('link:') && !ref.includes('file:')\n  ).length;\n}\n"],
  "mappings": "AACA,SAAS,2BAAiD;AAC1D,OAAO,YAAY;AACnB,OAAO,YAAY;AACnB,OAAO,UAAU;AAEV,SAAS,yBACd,MAIA,UACA,KAC6D;AAC7D,MAAI,OAAO,aAAa,aAAa;AACnC,WAAO,EAAE,WAAW,OAAO,gBAAgB,cAAc;AAAA,EAC3D;AAEA,MAAI,eAAuC;AAAA,IACzC,GAAG,IAAI;AAAA,IACP,GAAG,IAAI;AAAA,IACP,GAAG,IAAI;AAAA,EACT;AAEA,MAAI,SAAS;AAEb,MAAI,KAAK,qBAAqB,MAAM;AAClC,aAAS;AAAA,MACP,GAAG;AAAA,MACH,cAAc;AAAA,QACZ,GAAI,OAAO,oBACT,KAAK,QAAQ,OAAO,KAAK,YAAY,GAAG,OAAO,gBAAgB;AAAA,QACjE,GAAG,OAAO;AAAA,MACZ;AAAA,IACF;AAEA,mBAAe;AAAA,MACb,GAAG,OAAO;AAAA,MACV,GAAG;AAAA,IACL;AAAA,EACF;AAEA,QAAM,oBAAoB,OAAO,QAAQ,CAAC,SAA0B;AAClE,WAAO,CAAC,KAAK,WAAW,OAAO;AAAA,EACjC,CAAC;AAED,MAAI,QAAQ,SAAS;AAErB,MAAI,KAAK,6BAA6B,MAAM;AAC1C,mBAAe,kBAAkB,YAAY;AAE7C,YAAQ,kBAAkB,KAAK;AAAA,EACjC;AAEA,MAAI,OAAO,QAAQ,cAAc,KAAK,MAAM,MAAM;AAChD,WAAO;AAAA,MACL,WAAW;AAAA,MACX,gBAAgB,+BAA+B,KAAK,UAAU,KAAK,CAAC,wCAAwC,KAAK,UAAU,YAAY,CAAC;AAAA,IAC1I;AAAA,EACF;AAEA,MAAI,SAAS,qBAAqB,OAAO,eAAe,WAAW;AACjE,WAAO;AAAA,MACL,WAAW;AAAA,MACX,gBAAgB,uCAAuC,SAAS,oBAAoB,WAAW,8DAA8D,OAAO,eAAe,aAAa,WAAW;AAAA,IAC7M;AAAA,EACF;AAEA,MACE,OAAO;AAAA,IACL,OAAO,oBAAoB,CAAC;AAAA,IAC5B,SAAS,oBAAoB,CAAC;AAAA,EAChC,MAAM,MACN;AACA,WAAO;AAAA,MACL,WAAW;AAAA,MACX,gBAAgB,+BAA+B,KAAK,UAAU,SAAS,gBAAgB,CAAC,uDAAuD,KAAK,UAAU,OAAO,gBAAgB,CAAC;AAAA,IACxL;AAAA,EACF;AAEA,aAAW,YAAY,qBAAqB;AAC1C,UAAM,eAAe,SAAS,QAAQ,KAAK,CAAC;AAE5C,QAAI,UAAkC,OAAO,QAAQ,KAAK,CAAC;AAE3D,QAAI,KAAK,6BAA6B,MAAM;AAC1C,gBAAU,kBAAkB,OAAO;AAAA,IACrC;AAEA,QAAI;AAEJ,YAAQ,UAAU;AAAA,MAChB,KAAK,wBAAwB;AAC3B,sBAAc,OAAO,KAAK,OAAO;AAEjC;AAAA,MACF;AAAA,MAEA,KAAK,mBAAmB;AACtB,sBAAc,OAAO,KAAK,OAAO,EAAE;AAAA,UACjC,CAAC,YAA6B;AAC5B,mBACE,OAAO,OAAO,uBAAuB,OAAO,MAAM,eAClD,OAAO,OAAO,eAAe,OAAO,MAAM;AAAA,UAE9C;AAAA,QACF;AAEA;AAAA,MACF;AAAA,MAEA,KAAK,gBAAgB;AACnB,sBAAc,OAAO,KAAK,OAAO,EAAE,OAAO,CAAC,YAAqB;AAC9D,iBACE,OAAO,OAAO,uBAAuB,OAAO,MAAM,eAClD,OAAO,OAAO,eAAe,OAAO,MAAM;AAAA,QAE9C,CAAC;AAED;AAAA,MACF;AAAA,MAEA,SAAS;AACP,cAAM,IAAI,MAAM,4BAA4B,QAAkB,GAAG;AAAA,MACnE;AAAA,IACF;AAEA,QACE,YAAY,WAAW,OAAO,KAAK,YAAY,EAAE,UACjD,YAAY,WAAW,qBAAqB,YAAY,GACxD;AACA,aAAO;AAAA,QACL,WAAW;AAAA,QACX,gBAAgB,IAAI,QAAQ,sBAAsB,KAAK,UAAU,YAAY,CAAC,mDAAmD,KAAK,UAAU,OAAO,CAAC;AAAA,MAC1J;AAAA,IACF;AAEA,eAAW,WAAW,aAAa;AACjC,UACE,OAAO,aAAa,OAAO,MAAM,eACjC,SAAS,WAAW,OAAO,MAAM,QAAQ,OAAO,GAChD;AACA,eAAO;AAAA,UACL,WAAW;AAAA,UACX,gBAAgB,YAAY,QAAQ,IAAI,OAAO,cAAc,SAAS,WAAW,OAAO,CAAC,4CAA4C,QAAQ,OAAO,CAAC;AAAA,QACvJ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,WAAW,KAAK;AAC3B;AAEA,SAAS,qBAAqB,cAEnB;AACT,SAAO,OAAO,OAAO,YAAY,EAAE;AAAA,IACjC,CAAC,QAAQ,CAAC,IAAI,SAAS,OAAO,KAAK,CAAC,IAAI,SAAS,OAAO;AAAA,EAC1D,EAAE;AACJ;",
  "names": []
}
