/** Merge types of two objects. */
export type Spread<TTarget, TSource> = TTarget extends void ? TSource
  : TSource extends void ? TTarget
  // Properties in L that don't exist in R.
  :
    & Omit<TTarget, keyof TSource>
    // Properties in R that don't exist in L.
    & Omit<TSource, keyof TTarget>
    // Required properties in R that exist in L.
    & SpreadRequiredProperties<
      TTarget,
      TSource,
      RequiredKeys<TSource> & keyof TTarget
    >
    // Required properties in L that exist in R.
    & SpreadRequiredProperties<
      TTarget,
      TSource,
      RequiredKeys<TTarget> & keyof TSource
    >
    // Optional properties in L and R.
    & SpreadOptionalProperties<
      TTarget,
      TSource,
      OptionalKeys<TTarget> & OptionalKeys<TSource>
    >;

type RequiredKeys<TRecord> = {
  // deno-lint-ignore ban-types
  [Key in keyof TRecord]-?: {} extends Pick<TRecord, Key> ? never : Key;
}[keyof TRecord];

type OptionalKeys<TRecord> = {
  // deno-lint-ignore ban-types
  [Key in keyof TRecord]-?: {} extends Pick<TRecord, Key> ? Key : never;
}[keyof TRecord];

type SpreadRequiredProperties<
  TTarget,
  TSource,
  TKeys extends keyof TTarget & keyof TSource,
> = {
  [Key in TKeys]:
    | Exclude<TTarget[Key], undefined>
    | Exclude<TSource[Key], undefined>;
};

type SpreadOptionalProperties<
  TTarget,
  TSource,
  TKeys extends keyof TTarget & keyof TSource,
> = {
  [Key in TKeys]?: TTarget[Key] | TSource[Key];
};

// denoCacheMetadata={"headers":{"last-modified":"Sun, 30 Jul 2023 10:00:25 GMT","x-frame-options":"DENY","date":"Thu, 31 Jul 2025 23:17:59 GMT","etag":"\"2fb2e962967354b471aa1de6d739c36f\"","x-amz-cf-pop":"LAX53-P1","x-amz-version-id":"OLA7FWPZYtqM7QF2IZOYMmrPHrf0UNbX","accept-ranges":"bytes","server-timing":"fetchSource;dur=6","vary":"Accept-Encoding, Origin","content-security-policy":"default-src 'none'; style-src 'unsafe-inline'; sandbox","x-amz-cf-id":"FKUT_JZRVyNeAECU829S5S0f4pktEVurHrr_ZnUW3O4Xa4iYaLkavQ==","content-type":"application/typescript; charset=utf-8","content-length":"1461","cross-origin-embedder-policy":"same-origin","access-control-allow-origin":"*","age":"5243346","referrer-policy":"strict-origin-when-cross-origin","cross-origin-resource-policy":"same-origin","server":"deno/gcp-us-west2","strict-transport-security":"max-age=63072000; includeSubDomains; preload","cross-origin-opener-policy":"same-origin","cache-control":"public, max-age=31536000, immutable","x-amz-replication-status":"COMPLETED","x-amz-server-side-encryption":"AES256","x-cache":"Hit from cloudfront","x-content-type-options":"nosniff","via":"http/2 edgeproxy-h"},"url":"https://deno.land/x/cliffy@v1.0.0-rc.3/command/_spread.ts","time":1759247224}