export type TrimLeft<
  TValue extends string,
  TTrimValue extends string | undefined,
> = TValue extends `${TTrimValue}${infer TRest}` ? TRest
  : TValue;

export type TrimRight<TValue extends string, TTrimValue extends string> =
  TValue extends `${infer TRest}${TTrimValue}` ? TRest
    : TValue;

export type Lower<TValue extends string> = TValue extends Uppercase<TValue>
  ? Lowercase<TValue>
  : Uncapitalize<TValue>;

export type CamelCase<TValue extends string> = TValue extends
  `${infer TPart}_${infer TRest}`
  ? `${Lower<TPart>}${Capitalize<CamelCase<TRest>>}`
  : TValue extends `${infer TPart}-${infer TRest}`
    ? `${Lower<TPart>}${Capitalize<CamelCase<TRest>>}`
  : Lower<TValue>;

export type OneOf<TValue, TDefault> = TValue extends void ? TDefault : TValue;

// type Merge<L, R> = L extends void ? R
//   : R extends void ? L
//   : Omit<L, keyof R> & R;

export type Merge<TLeft, TRight> = TLeft extends void ? TRight
  : TRight extends void ? TLeft
  : TLeft & TRight;

export type MergeRecursive<TLeft, TRight> = TLeft extends void ? TRight
  : TRight extends void ? TLeft
  : TLeft & TRight;

export type ValueOf<TValue> = TValue extends Record<string, infer V>
  ? ValueOf<V>
  : TValue;

// denoCacheMetadata={"headers":{"x-amz-server-side-encryption":"AES256","content-type":"application/typescript; charset=utf-8","strict-transport-security":"max-age=63072000; includeSubDomains; preload","x-amz-version-id":"_3NjxreZuJyLqz3LSCBNsA3JNygOjSUa","server":"AmazonS3,deployd","x-amz-replication-status":"COMPLETED","accept-ranges":"bytes","cache-control":"public, max-age=31536000, immutable","cross-origin-embedder-policy":"same-origin","cache-status":"deno; hit","content-security-policy":"default-src 'none'; style-src 'unsafe-inline'; sandbox","referrer-policy":"strict-origin-when-cross-origin","x-content-type-options":"nosniff","content-length":"1216","server-timing":"fetchSource;dur=6","age":"958407","x-amz-cf-id":"YGu4CnHF5qYJcDL6GEZ9BSBGfroUObc0ISmJeg0mPsEMu3tVx2eBwQ==","x-deno-trace-id":"eb43db3d342bc18dd279f7c051a83b10","x-frame-options":"DENY","via":"1.1 720129ba4056e60029189758c6f0de0c.cloudfront.net (CloudFront),HTTP/2 ord.vultr.prod.deno-cluster.net","vary":"Accept-Encoding, Origin","last-modified":"Sun, 30 Jul 2023 10:00:25 GMT","alt-svc":"h3=\":443\"; ma=86400","x-amz-cf-pop":"ORD56-P16","x-cache":"Hit from cloudfront","access-control-allow-origin":"*","date":"Mon, 05 Jan 2026 19:36:21 GMT","cross-origin-opener-policy":"same-origin","etag":"\"aa7e119980b88ae3dfa72d6bb4f7772e\"","cross-origin-resource-policy":"same-origin"},"url":"https://deno.land/x/cliffy@v1.0.0-rc.3/command/_type_utils.ts","time":1768600187}