{"version":3,"file":"status.cjs","names":["fetchJsonOrNull","readInstalledFrameworkVersion","existsSync","join","fetchBosConfigFromFastKv","readAuthoredConfigInput","MISSING_CONFIG_MESSAGE","resolveFrameworkPackage","readSnapshot"],"sources":["../../src/services/status.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { MISSING_CONFIG_MESSAGE, readAuthoredConfigInput } from \"../config\";\nimport type { StatusResult } from \"../contract\";\nimport { fetchJsonOrNull } from \"../utils/http-client\";\nimport { readInstalledFrameworkVersion, resolveFrameworkPackage } from \"./framework-version\";\nimport { fetchBosConfigFromFastKv } from \"./registry/fastkv\";\nimport { readSnapshot } from \"./scaffold/snapshot\";\n\nconst FRAMEWORK_PACKAGES = [\"everything-dev\", \"every-plugin\"];\n\nconst CATALOG_TOOL_PACKAGES = [\n  \"@rspack/core\",\n  \"@rspack/cli\",\n  \"@rsbuild/core\",\n  \"@rsbuild/plugin-react\",\n  \"@module-federation/enhanced\",\n  \"@module-federation/node\",\n  \"@module-federation/rsbuild-plugin\",\n  \"@module-federation/runtime-core\",\n  \"@module-federation/sdk\",\n  \"@module-federation/dts-plugin\",\n] as const;\n\nconst PRERELEASE_PATTERN = /-[0-9A-Za-z.-]+$/;\n\n/**\n * The dist-tag to compare an installed version against: prerelease installs\n * track the `rc` dist-tag (the changesets pre-mode train), stable installs\n * track `latest`. Falls back to `latest` when no `rc` tag is published.\n */\nexport function resolveUpdateDistTag(installed: string | undefined): \"rc\" | \"latest\" {\n  return installed && PRERELEASE_PATTERN.test(installed) ? \"rc\" : \"latest\";\n}\n\n/** The version a given dist-tag currently points at, or null when absent. */\nexport function pickDistTagVersion(\n  distTags: Record<string, string> | undefined,\n  tag: \"rc\" | \"latest\",\n): string | null {\n  return distTags?.[tag] ?? null;\n}\n\n/**\n * Semver-ordered comparison of two version strings: -1 when `a` is older than\n * `b`, 1 when newer, 0 when equal. Unparseable versions compare as equal —\n * the update check must never fire on versions it cannot order (that is how\n * an install ahead of npm got flagged \"outdated\" with a downgrade arrow).\n */\nexport { compareSemver } from \"../utils/semver\";\n\nasync function fetchLatestNpmVersion(\n  packageName: string,\n  tag: \"rc\" | \"latest\",\n): Promise<string | null> {\n  if (tag === \"latest\") {\n    return fetchJsonOrNull<{ version: string }>(\n      `https://registry.npmjs.org/${packageName}/latest`,\n      {\n        headers: { Accept: \"application/json\" },\n        retries: 0,\n      },\n    ).then((data) => data?.version ?? null);\n  }\n  const packument = await fetchJsonOrNull<{ \"dist-tags\"?: Record<string, string> }>(\n    `https://registry.npmjs.org/${packageName}`,\n    {\n      headers: { Accept: \"application/vnd.npm.install-v1+json\" },\n      retries: 0,\n    },\n  );\n  return pickDistTagVersion(packument?.[\"dist-tags\"], tag);\n}\n\nfunction readInstalledVersion(projectDir: string, packageName: string): string | undefined {\n  return readInstalledFrameworkVersion(projectDir, packageName);\n}\n\nfunction checkEnvFile(projectDir: string): \"found\" | \"missing\" | \"example-only\" {\n  if (existsSync(join(projectDir, \".env\"))) return \"found\";\n  if (existsSync(join(projectDir, \".env.example\"))) return \"example-only\";\n  return \"missing\";\n}\n\nasync function checkParentReachable(extendsRef: string | undefined): Promise<boolean | undefined> {\n  if (!extendsRef?.startsWith(\"bos://\")) return undefined;\n  try {\n    const config = await fetchBosConfigFromFastKv(extendsRef);\n    return config !== null;\n  } catch {\n    return false;\n  }\n}\n\nexport async function getStatus(projectDir: string): Promise<StatusResult> {\n  const authored = await readAuthoredConfigInput(projectDir);\n  if (!authored) {\n    return {\n      status: \"error\",\n      error: `${MISSING_CONFIG_MESSAGE} in current directory`,\n      packages: [],\n      envFile: \"missing\",\n    };\n  }\n\n  const config = authored as Record<string, unknown>;\n\n  const packageNames = [...FRAMEWORK_PACKAGES];\n  for (const name of CATALOG_TOOL_PACKAGES) {\n    if (readInstalledVersion(projectDir, name)) {\n      packageNames.push(name);\n    }\n  }\n\n  const packages = await Promise.all(\n    packageNames.map(async (name) => {\n      const resolved = resolveFrameworkPackage(projectDir, name);\n      const tag = FRAMEWORK_PACKAGES.includes(name)\n        ? resolveUpdateDistTag(resolved.installedVersion)\n        : \"latest\";\n      const latest = await fetchLatestNpmVersion(name, tag);\n      return {\n        name,\n        installed: resolved.installedVersion,\n        latest: latest ?? undefined,\n        isLinked: resolved.isLinked,\n        specifier: resolved.specifier,\n      };\n    }),\n  );\n\n  const snapshot = await readSnapshot(projectDir);\n\n  const extendsRef = config.extends as string | undefined;\n  const parentReachable = await checkParentReachable(extendsRef);\n\n  return {\n    status: \"ok\",\n    extends: extendsRef,\n    account: config.account as string | undefined,\n    domain: config.domain as string | undefined,\n    packages,\n    lastSync: snapshot?.timestamp,\n    envFile: checkEnvFile(projectDir),\n    parentReachable,\n  };\n}\n"],"mappings":";;;;;;;;;;AASA,MAAM,qBAAqB,CAAC,kBAAkB,cAAc;AAE5D,MAAM,wBAAwB;CAC5B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,qBAAqB;;;;;;AAO3B,SAAgB,qBAAqB,WAAgD;CACnF,OAAO,aAAa,mBAAmB,KAAK,SAAS,IAAI,OAAO;AAClE;;AAGA,SAAgB,mBACd,UACA,KACe;CACf,OAAO,WAAW,QAAQ;AAC5B;AAUA,eAAe,sBACb,aACA,KACwB;CACxB,IAAI,QAAQ,UACV,OAAOA,oCACL,8BAA8B,YAAY,UAC1C;EACE,SAAS,EAAE,QAAQ,mBAAmB;EACtC,SAAS;CACX,CACF,CAAC,CAAC,MAAM,SAAS,MAAM,WAAW,IAAI;CASxC,OAAO,oBAAmB,MAPFA,oCACtB,8BAA8B,eAC9B;EACE,SAAS,EAAE,QAAQ,sCAAsC;EACzD,SAAS;CACX,CACF,EACmC,GAAG,cAAc,GAAG;AACzD;AAEA,SAAS,qBAAqB,YAAoB,aAAyC;CACzF,OAAOC,wDAA8B,YAAY,WAAW;AAC9D;AAEA,SAAS,aAAa,YAA0D;CAC9E,QAAIC,wBAAWC,gBAAK,YAAY,MAAM,CAAC,GAAG,OAAO;CACjD,QAAID,wBAAWC,gBAAK,YAAY,cAAc,CAAC,GAAG,OAAO;CACzD,OAAO;AACT;AAEA,eAAe,qBAAqB,YAA8D;CAChG,IAAI,CAAC,YAAY,WAAW,QAAQ,GAAG,OAAO;CAC9C,IAAI;EAEF,OAAO,MADcC,0DAAyB,UAAU,MACtC;CACpB,QAAQ;EACN,OAAO;CACT;AACF;AAEA,eAAsB,UAAU,YAA2C;CACzE,MAAM,WAAW,MAAMC,qCAAwB,UAAU;CACzD,IAAI,CAAC,UACH,OAAO;EACL,QAAQ;EACR,OAAO,GAAGC,oCAAuB;EACjC,UAAU,CAAC;EACX,SAAS;CACX;CAGF,MAAM,SAAS;CAEf,MAAM,eAAe,CAAC,GAAG,kBAAkB;CAC3C,KAAK,MAAM,QAAQ,uBACjB,IAAI,qBAAqB,YAAY,IAAI,GACvC,aAAa,KAAK,IAAI;CAI1B,MAAM,WAAW,MAAM,QAAQ,IAC7B,aAAa,IAAI,OAAO,SAAS;EAC/B,MAAM,WAAWC,kDAAwB,YAAY,IAAI;EAIzD,MAAM,SAAS,MAAM,sBAAsB,MAH/B,mBAAmB,SAAS,IAAI,IACxC,qBAAqB,SAAS,gBAAgB,IAC9C,QACgD;EACpD,OAAO;GACL;GACA,WAAW,SAAS;GACpB,QAAQ,UAAU;GAClB,UAAU,SAAS;GACnB,WAAW,SAAS;EACtB;CACF,CAAC,CACH;CAEA,MAAM,WAAW,MAAMC,8BAAa,UAAU;CAE9C,MAAM,aAAa,OAAO;CAC1B,MAAM,kBAAkB,MAAM,qBAAqB,UAAU;CAE7D,OAAO;EACL,QAAQ;EACR,SAAS;EACT,SAAS,OAAO;EAChB,QAAQ,OAAO;EACf;EACA,UAAU,UAAU;EACpB,SAAS,aAAa,UAAU;EAChC;CACF;AACF"}