{"version":3,"sources":["../src/environment.ts"],"sourcesContent":["type AnyEnvironmentFunction = (...args: never[]) => unknown;\n\nexport type FarmEnvironment = \"server\" | \"client\";\n\nexport interface FarmIsomorphicFnOptions<TArgs extends unknown[], TServerResult, TClientResult> {\n  server: (...args: TArgs) => TServerResult;\n  client: (...args: TArgs) => TClientResult;\n}\n\nexport class FarmEnvironmentError extends Error {\n  readonly code = \"FARM_ENVIRONMENT_MISMATCH\";\n\n  constructor(\n    readonly api: \"createServerOnlyFn\" | \"createClientOnlyFn\",\n    readonly expected: FarmEnvironment,\n    readonly actual: FarmEnvironment,\n  ) {\n    super(`${api}() can only be called on the ${expected}. It was called on the ${actual}.`);\n    this.name = \"FarmEnvironmentError\";\n  }\n}\n\nexport function createServerOnlyFn<TFunction extends AnyEnvironmentFunction>(\n  implementation: TFunction,\n): TFunction;\nexport function createServerOnlyFn(\n  implementation: AnyEnvironmentFunction | undefined,\n  compiledActualEnvironment?: FarmEnvironment,\n): AnyEnvironmentFunction {\n  if (compiledActualEnvironment) {\n    return createMismatchFunction(\"createServerOnlyFn\", \"server\", compiledActualEnvironment);\n  }\n  if (getRuntimeEnvironment() !== \"server\") {\n    return createMismatchFunction(\"createServerOnlyFn\", \"server\");\n  }\n\n  assertFunction(implementation, \"createServerOnlyFn\");\n  return implementation;\n}\n\nexport function createClientOnlyFn<TFunction extends AnyEnvironmentFunction>(\n  implementation: TFunction,\n): TFunction;\nexport function createClientOnlyFn(\n  implementation: AnyEnvironmentFunction | undefined,\n  compiledActualEnvironment?: FarmEnvironment,\n): AnyEnvironmentFunction {\n  if (compiledActualEnvironment) {\n    return createMismatchFunction(\"createClientOnlyFn\", \"client\", compiledActualEnvironment);\n  }\n  if (getRuntimeEnvironment() !== \"client\") {\n    return createMismatchFunction(\"createClientOnlyFn\", \"client\");\n  }\n\n  assertFunction(implementation, \"createClientOnlyFn\");\n  return implementation;\n}\n\nexport function createIsomorphicFn<TArgs extends unknown[], TServerResult, TClientResult>(\n  options: FarmIsomorphicFnOptions<TArgs, TServerResult, TClientResult>,\n): (...args: TArgs) => TServerResult | TClientResult {\n  if (!options || typeof options !== \"object\") {\n    throw new TypeError(\"createIsomorphicFn requires server and client functions\");\n  }\n\n  assertFunction(options.server, \"createIsomorphicFn server\");\n  assertFunction(options.client, \"createIsomorphicFn client\");\n\n  return getRuntimeEnvironment() === \"server\" ? options.server : options.client;\n}\n\nfunction getRuntimeEnvironment(): FarmEnvironment {\n  return typeof window === \"undefined\" ? \"server\" : \"client\";\n}\n\nfunction createMismatchFunction(\n  api: \"createServerOnlyFn\" | \"createClientOnlyFn\",\n  expected: FarmEnvironment,\n  actual: FarmEnvironment = expected === \"server\" ? \"client\" : \"server\",\n) {\n  return function farmEnvironmentBoundary(): never {\n    throw new FarmEnvironmentError(api, expected, actual);\n  };\n}\n\nfunction assertFunction(value: unknown, label: string): asserts value is AnyEnvironmentFunction {\n  if (typeof value !== \"function\") {\n    throw new TypeError(`${label} must be a function`);\n  }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASO,IAAM,wBAAN,MAAM,8BAA6B,MAAM;AAAA,EAG9C,YACW,KACA,UACA,QACT;AACA,UAAM,GAAG,GAAG,gCAAgC,QAAQ,0BAA0B,MAAM,GAAG;AAJ9E;AACA;AACA;AALX,SAAS,OAAO;AAQd,SAAK,OAAO;AAAA,EACd;AACF;AAXgD;AAAzC,IAAM,uBAAN;AAgBA,SAAS,mBACd,gBACA,2BACwB;AACxB,MAAI,2BAA2B;AAC7B,WAAO,uBAAuB,sBAAsB,UAAU,yBAAyB;AAAA,EACzF;AACA,MAAI,sBAAsB,MAAM,UAAU;AACxC,WAAO,uBAAuB,sBAAsB,QAAQ;AAAA,EAC9D;AAEA,iBAAe,gBAAgB,oBAAoB;AACnD,SAAO;AACT;AAbgB;AAkBT,SAAS,mBACd,gBACA,2BACwB;AACxB,MAAI,2BAA2B;AAC7B,WAAO,uBAAuB,sBAAsB,UAAU,yBAAyB;AAAA,EACzF;AACA,MAAI,sBAAsB,MAAM,UAAU;AACxC,WAAO,uBAAuB,sBAAsB,QAAQ;AAAA,EAC9D;AAEA,iBAAe,gBAAgB,oBAAoB;AACnD,SAAO;AACT;AAbgB;AAeT,SAAS,mBACd,SACmD;AACnD,MAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,UAAM,IAAI,UAAU,yDAAyD;AAAA,EAC/E;AAEA,iBAAe,QAAQ,QAAQ,2BAA2B;AAC1D,iBAAe,QAAQ,QAAQ,2BAA2B;AAE1D,SAAO,sBAAsB,MAAM,WAAW,QAAQ,SAAS,QAAQ;AACzE;AAXgB;AAahB,SAAS,wBAAyC;AAChD,SAAO,OAAO,WAAW,cAAc,WAAW;AACpD;AAFS;AAIT,SAAS,uBACP,KACA,UACA,SAA0B,aAAa,WAAW,WAAW,UAC7D;AACA,SAAO,gCAAS,0BAAiC;AAC/C,UAAM,IAAI,qBAAqB,KAAK,UAAU,MAAM;AAAA,EACtD,GAFO;AAGT;AARS;AAUT,SAAS,eAAe,OAAgB,OAAwD;AAC9F,MAAI,OAAO,UAAU,YAAY;AAC/B,UAAM,IAAI,UAAU,GAAG,KAAK,qBAAqB;AAAA,EACnD;AACF;AAJS;","names":[]}