{
  "version": 3,
  "sources": ["../../../../src/packages/workspace.read-manifest/index.ts"],
  "sourcesContent": ["import util from 'node:util';\nimport { WORKSPACE_MANIFEST_FILENAME } from '../constants/index.ts';\nimport type { PnpmSettings } from '../types/index.ts';\nimport path from 'node:path';\nimport readYamlFile from 'read-yaml-file';\nimport {\n  assertValidWorkspaceManifestCatalog,\n  assertValidWorkspaceManifestCatalogs,\n  type WorkspaceCatalog,\n  type WorkspaceNamedCatalogs,\n} from './catalogs.ts';\nimport { InvalidWorkspaceManifestError } from './errors/InvalidWorkspaceManifestError.ts';\n\nexport interface WorkspaceManifest extends PnpmSettings {\n  packages: string[];\n\n  /**\n   * The default catalog. Package manifests may refer to dependencies in this\n   * definition through the `catalog:default` specifier or the `catalog:`\n   * shorthand.\n   */\n  catalog?: WorkspaceCatalog | undefined;\n\n  /**\n   * A dictionary of named catalogs. Package manifests may refer to dependencies\n   * in this definition through the `catalog:<name>` specifier.\n   */\n  catalogs?: WorkspaceNamedCatalogs | undefined;\n}\n\nexport async function readWorkspaceManifest(\n  dir: string\n): Promise<WorkspaceManifest | undefined> {\n  const manifest = await readManifestRaw(dir);\n  validateWorkspaceManifest(manifest);\n  return manifest;\n}\n\nasync function readManifestRaw(dir: string): Promise<unknown> {\n  try {\n    return await readYamlFile.default<WorkspaceManifest>(\n      path.join(dir, WORKSPACE_MANIFEST_FILENAME)\n    );\n  } catch (err: unknown) {\n    // File not exists is the same as empty file (undefined)\n    if (\n      util.types.isNativeError(err) &&\n      'code' in err &&\n      err.code === 'ENOENT'\n    ) {\n      return undefined;\n    }\n\n    // Any other error (missing perm, invalid yaml, etc.) fails the process\n    throw err;\n  }\n}\n\nfunction validateWorkspaceManifest(\n  manifest: unknown\n): asserts manifest is WorkspaceManifest | undefined {\n  if (typeof manifest === 'undefined' || manifest === null) {\n    // Empty or null manifest is ok\n    return;\n  }\n\n  if (typeof manifest !== 'object') {\n    throw new InvalidWorkspaceManifestError(\n      `Expected object but found - ${typeof manifest}`\n    );\n  }\n\n  if (Array.isArray(manifest)) {\n    throw new InvalidWorkspaceManifestError(\n      'Expected object but found - array'\n    );\n  }\n\n  if (Object.keys(manifest).length === 0) {\n    // manifest content `{}` is ok\n    return;\n  }\n\n  assertValidWorkspaceManifestPackages(manifest);\n  assertValidWorkspaceManifestCatalog(manifest);\n  assertValidWorkspaceManifestCatalogs(manifest);\n\n  checkWorkspaceManifestAssignability(manifest);\n}\n\nfunction assertValidWorkspaceManifestPackages(manifest: {\n  packages?: unknown | undefined;\n}): asserts manifest is { packages: string[] } {\n  if (!('packages' in manifest) || !Array.isArray(manifest.packages)) {\n    return;\n  }\n\n  if (!Array.isArray(manifest.packages)) {\n    throw new InvalidWorkspaceManifestError('packages field is not an array');\n  }\n\n  for (const pkg of manifest.packages) {\n    if (typeof pkg === 'undefined' || pkg === null) {\n      throw new InvalidWorkspaceManifestError('Missing or empty package');\n    }\n\n    const type = typeof pkg;\n    if (type !== 'string') {\n      throw new InvalidWorkspaceManifestError(`Invalid package type - ${type}`);\n    }\n  }\n}\n\n/**\n * Empty function to ensure TypeScript has narrowed the manifest object to\n * something assignable to the {@see WorkspaceManifest} interface. This helps\n * make sure the validation logic in this file is correct as it's refactored in\n * the future.\n */\nfunction checkWorkspaceManifestAssignability(\n  _manifest: WorkspaceManifest\n): void {}\n"],
  "mappings": "AAAA,OAAO,UAAU;AACjB,SAAS,mCAAmC;AAE5C,OAAO,UAAU;AACjB,OAAO,kBAAkB;AACzB;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AACP,SAAS,qCAAqC;AAmB9C,eAAsB,sBACpB,KACwC;AACxC,QAAM,WAAW,MAAM,gBAAgB,GAAG;AAC1C,4BAA0B,QAAQ;AAClC,SAAO;AACT;AAEA,eAAe,gBAAgB,KAA+B;AAC5D,MAAI;AACF,WAAO,MAAM,aAAa;AAAA,MACxB,KAAK,KAAK,KAAK,2BAA2B;AAAA,IAC5C;AAAA,EACF,SAAS,KAAc;AAErB,QACE,KAAK,MAAM,cAAc,GAAG,KAC5B,UAAU,OACV,IAAI,SAAS,UACb;AACA,aAAO;AAAA,IACT;AAGA,UAAM;AAAA,EACR;AACF;AAEA,SAAS,0BACP,UACmD;AACnD,MAAI,OAAO,aAAa,eAAe,aAAa,MAAM;AAExD;AAAA,EACF;AAEA,MAAI,OAAO,aAAa,UAAU;AAChC,UAAM,IAAI;AAAA,MACR,+BAA+B,OAAO,QAAQ;AAAA,IAChD;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,KAAK,QAAQ,EAAE,WAAW,GAAG;AAEtC;AAAA,EACF;AAEA,uCAAqC,QAAQ;AAC7C,sCAAoC,QAAQ;AAC5C,uCAAqC,QAAQ;AAE7C,sCAAoC,QAAQ;AAC9C;AAEA,SAAS,qCAAqC,UAEC;AAC7C,MAAI,EAAE,cAAc,aAAa,CAAC,MAAM,QAAQ,SAAS,QAAQ,GAAG;AAClE;AAAA,EACF;AAEA,MAAI,CAAC,MAAM,QAAQ,SAAS,QAAQ,GAAG;AACrC,UAAM,IAAI,8BAA8B,gCAAgC;AAAA,EAC1E;AAEA,aAAW,OAAO,SAAS,UAAU;AACnC,QAAI,OAAO,QAAQ,eAAe,QAAQ,MAAM;AAC9C,YAAM,IAAI,8BAA8B,0BAA0B;AAAA,IACpE;AAEA,UAAM,OAAO,OAAO;AACpB,QAAI,SAAS,UAAU;AACrB,YAAM,IAAI,8BAA8B,0BAA0B,IAAI,EAAE;AAAA,IAC1E;AAAA,EACF;AACF;AAQA,SAAS,oCACP,WACM;AAAC;",
  "names": []
}
