{"id":23789917,"url":"https://github.com/blackglory/extra-utils","last_synced_at":"2025-10-17T08:08:37.287Z","repository":{"id":44967832,"uuid":"286936682","full_name":"BlackGlory/extra-utils","owner":"BlackGlory","description":"🌳 Utilities for JavaScript and Typescript","archived":false,"fork":false,"pushed_at":"2024-12-07T04:19:21.000Z","size":1998,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-01T05:34:36.853Z","etag":null,"topics":["browser","esm","library","nodejs","npm-package","typescript"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/extra-utils","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/BlackGlory.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-08-12T06:36:46.000Z","updated_at":"2024-12-07T04:19:24.000Z","dependencies_parsed_at":"2024-08-10T17:40:57.522Z","dependency_job_id":"d4cf7668-3a41-400f-84d0-b1c2c44c1abb","html_url":"https://github.com/BlackGlory/extra-utils","commit_stats":{"total_commits":242,"total_committers":2,"mean_commits":121.0,"dds":0.02892561983471076,"last_synced_commit":"a38abbb1e961ee273caa3c6b9ae2dd28eb614d5b"},"previous_names":["blackglory/types"],"tags_count":99,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BlackGlory%2Fextra-utils","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BlackGlory%2Fextra-utils/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BlackGlory%2Fextra-utils/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BlackGlory%2Fextra-utils/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BlackGlory","download_url":"https://codeload.github.com/BlackGlory/extra-utils/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":232104503,"owners_count":18473169,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["browser","esm","library","nodejs","npm-package","typescript"],"created_at":"2025-01-01T17:17:41.562Z","updated_at":"2025-10-17T08:08:32.203Z","avatar_url":"https://github.com/BlackGlory.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# extra-utils\nUtilities for JavaScript and Typescript.\n\n## Install\n```sh\nnpm install --save extra-utils\n# or\nyarn add extra-utils\n```\n\n## API\n### ArrayLike\n```ts\nfunction first\u003cT\u003e(arr: NonEmptyArray\u003cT\u003e): T\nfunction first\u003cT\u003e(arr: ArrayLike\u003cT\u003e): T | undefined\n\nfunction last\u003cT\u003e(arr: NonEmptyArray\u003cT\u003e): T\nfunction last\u003cT\u003e(arr: ArrayLike\u003cT\u003e): T | undefined\n\nfunction ensureArray\u003cT\u003e(value: Arrayable\u003cT\u003e): T[]\n```\n\n### Array\n```ts\nfunction isArray\u003cT\u003e(val: unknown): val is Array\u003cT\u003e\nfunction isntArray\u003cT\u003e(val: T): val is Exclude\u003cT, Array\u003cunknown\u003e\u003e\n\nfunction isEmptyArray(val: readonly unknown[]): boolean\nfunction isntEmptyArray\u003cT\u003e(val: readonly T[]): val is NonEmptyArray\u003cT\u003e\n```\n\n### Boolean\n```ts\nfunction isBoolean(val: unknown): val is boolean\nfunction isntBoolean\u003cT\u003e(val: unknown): val is Exclude\u003cT, boolean\u003e\n\nfunction isFalsy(val: unknown): val is Falsy\nfunction isntFalsy\u003cT\u003e(val: T): val is Exclude\u003cT, Falsy\u003e\n```\n\n### JSON\n```ts\nfunction isJSONValue(val: unknown): val is JSONValue\nfunction isntJSONValue\u003cT\u003e(val: T): val is Exclude\u003cT, JSONValue\u003e\n\nfunction isJSONSerializable\u003cT extends\n| JSONValue\n| Record\u003cstring, JSONValue | JSONSerializable\u003cany\u003e\u003e\n| Array\u003cJSONValue | JSONSerializable\u003cany\u003e\u003e\n\u003e(val: unknown): val is JSONSerializable\u003cT\u003e\nfunction isntJSONSerializable\u003cT\u003e(val: T): val is Exclude\u003cT, JSONSerializable\u003cany\u003e\u003e\n```\n\n### Nullish\n```ts\nfunction isNullish(val: unknown): val is Nullish\nfunction isntNullish\u003cT\u003e(val: T): val is Exclude\u003cT, Nullish\u003e\n\nfunction isNull(val: unknown): val is null\nfunction isntNull\u003cT\u003e(val: T): val is Exclude\u003cT, null\u003e\n\nfunction isUndefined(val: unknown): val is undefined\nfunction isntUndefined\u003cT\u003e(val: T): val is Exclude\u003cT, undefined\u003e\n```\n\n### Number\n```ts\nfunction isNumber(val: unknown): val is number\nfunction isntNumber\u003cT\u003e(val: T): val is Exclude\u003cT, number\u003e\n\nfunction isFinite(val: number): boolean\nfunction isPositiveInfinity(val: number): boolean\nfunction isNegativeInfinity(val: number): boolean\n\nfunction isNaN(val: number): boolean\nfunction isntNaN(val: number): boolean\n\nfunction isBigInt(val: unknown): val is bigint\nfunction isntBigInt\u003cT\u003e(val: T): val is Exclude\u003cT, bigint\u003e\n\nfunction clamp(\n  val: number\n, [min, max]: readonly [min: number, max: number]\n): number\n\nfunction remap(\n  value: number\n, [oldMin, oldMax]: readonly [oldMin: number, oldMax: number]\n, [newMin, newMax]: readonly [newMin: number, newMax: number]\n): number\n\nfunction remapToItem\u003cT\u003e(\n  value: number\n, range: readonly [min: number, max: number]\n, items: NonEmptyArray\u003cT\u003e\n): T\n\ninterface IWeightedItem {\n  weight: number\n}\n\nfunction remapToWeightedItem\u003cT\u003e(\n  value: number\n, range: readonly [min: number, max: number]\n, items: NonEmptyArray\u003cT\u003e\n, weights: NonEmptyArray\u003cnumber\u003e\n): T\nfunction remapToWeightedItem\u003cT extends IWeightedItem\u003e(\n  value: number\n, range: readonly [min: number, max: number]\n, items: NonEmptyArray\u003cT\u003e\n): T\n\nfunction remapToIndex(\n  value: number\n, range: readonly [min: number, max: number]\n, items: NonEmptyArray\u003cunknown\u003e\n): number\n\nfunction remapToWeightedIndex(\n  value: number\n, range: [min: number, max: number]\n, weights: NonEmptyArray\u003cnumber\u003e\n): number\n\nfunction lerp(\n  alpha: number\n, [from, to]: readonly [from: number, to: number]\n): number\n\nfunction modf(value: number): [integralPart: number, fractionalPart: number]\n```\n\n### Object\n```ts\nfunction isObject(\n  val: unknown\n): val is object \u0026 Record\u003cstring | symbol | number, unknown\u003e\nfunction isntObject\u003cT\u003e(\n  val: T\n): val is Exclude\u003cT, object \u0026 Record\u003cstring | symbol | number, unknown\u003e\u003e\n\nfunction isPlainObject(\n  val: unknown\n): val is object \u0026 Record\u003cstring | symbol | number, unknown\u003e\nfunction isntPlainObject\u003cT\u003e(\n  val: T\n): val is Exclude\u003cT, object \u0026 Record\u003cstring | symbol | number, unknown\u003e\u003e\n\nfunction isEmptyObject(val: object): boolean\nfunction isntEmptyObject(val: object): boolean\n\nfunction isReferenceEqual(a: unknown, b: unknown): boolean\nfunction isShallowEqual(a: unknown, b: unknown): boolean\nfunction isDeepEqual(a: unknown, b: unknown): boolean\n\nfunction fromEntries\u003cKey extends number | string, Value\u003e(\n  entries: Iterable\u003c[Key, Value]\u003e\n): Record\u003cKey, Value\u003e\n```\n\n### String\n```ts\nfunction isString(val: unknown): val is string\nfunction isntString\u003cT\u003e(val: T): val is Exclude\u003cT, string\u003e\n\nfunction isChar(val: unknown): val is string\nfunction isntChar(val: unknown): boolean\n\nfunction isURLString(text: string): boolean\nfunction isntURLString(text: string): boolean\n\nfunction toString(val: unknown): string\n```\n\n#### removeExtraIndents\n```ts\nfunction removeExtraIndents(\n  text: string\n, options?: { ignoreBlankLines: boolean = false }\n): string\n```\n\nExample:\n```ts\nremoveExtraIndents(`\n  hello\n\n  world\n`, { ignoreBlankLines: true })\n//   '\\n'\n// + 'hello' + '\\n'\n// + '\\n'\n// + 'world' + '\\n'\n```\n\n#### removeBlankLines\n```ts\nfunction removeBlankLines(text: string): string\n```\n\nExample:\n```ts\nremoveBlankLines(\n  '\\n'\n+ 'hello' + '\\n'\n+ '\\n'\n+ 'world' + '\\n'\n+ '\\n'\n)\n//   'hello' + '\\n'\n// + 'world'\n```\n\n#### removeLeadingBlankLines\n```ts\nfunction removeLeadingBlankLines(\n  text: string\n, maxRemovals: number = Infinity\n): string\n```\n\nExample:\n```ts\nremoveLeadingBlankLines(\n  '  ' + '\\n'\n+ 'a' + '\\n'\n+ '  '\n)\n//   'a' + '\\n'\n// + '  '\n```\n\n#### removeTrailingBlankLines\n```ts\nfunction removeTrailingBlankLines(\n  text: string\n, maxRemovals: number = Infinity\n): string\n```\n\nExample:\n```ts\nremoveTrailingBlankLines(\n  '  ' + '\\n'\n+ 'a' + '\\n'\n+ '  '\n)\n//   '  ' + '\\n'\n// + 'a'\n```\n\n### Enum\n```ts\nfunction inEnum\u003cT extends Record\u003cstring, string | number\u003e\u003e(\n  val: unknown\n, _enum: T\n): val is T[keyof T]\nfunction notInEnum(\n  val: unknown\n, _enum: Record\u003cstring, string | number\u003e\n): boolean\n\nfunction enumKeys\u003cT extends Record\u003cstring, string | number\u003e\u003e(\n  _enum: T\n): Array\u003ckeyof T\u003e\nfunction enumValues\u003cT extends Record\u003cstring, string | number\u003e\u003e(\n  _enum: T\n): Array\u003cT[keyof T]\u003e\nfunction enumEntries\u003cT extends Record\u003cstring, string | number\u003e\u003e(\n  _enum: T\n): Array\u003c{ [Key in keyof T]: [Key, T[Key]] }[keyof T]\u003e\n\nfunction getEnumKey\u003cT extends Record\u003cstring, string | number\u003e\u003e(\n  _enum: T\n, enumValue: T[keyof T]\n): keyof T\n```\n\n### Date\n```ts\nfunction isDate(val: unknown): val is Date\nfunction isntDate\u003cT\u003e(val: T): val is Exclude\u003cT, Date\u003e\n```\n\n### Function\n```ts\nfunction isFunction\u003cT extends Function = (...args: any[]) =\u003e any\u003e(\n  val: unknown\n): val is T\nfunction isntFunction\u003cT\u003e(val: T): val is Exclude\u003cT, Function\u003e\n```\n\n### RegExp\n```ts\nfunction isRegExp(val: unknown): val is RegExp\nfunction isntRegExp\u003cT\u003e(val: T): val is Exclude\u003cT, RegExp\u003e\n```\n\n### Symbol\n```ts\nfunction isSymbol(val: unknown): val is symbol\nfunction isntSymbol\u003cT\u003e(val: T): val is Exclude\u003cT, symbol\u003e\n```\n\n### Functional programming\n#### not\n```ts\nfunction not\u003cArgs extends unknown[]\u003e(\n  predicate: (...args: Args) =\u003e boolean\n): (...args: Args) =\u003e boolean\n```\n\n#### pipe\n```ts\nfunction pipe\u003cA, B, C, D, E, F, G, H\u003e(\n  value: A\n, ...operators: [\n    (value: A) =\u003e B\n  , (value: B) =\u003e C\n  , (value: C) =\u003e D\n  , (value: D) =\u003e E\n  , (value: E) =\u003e F\n  , (value: F) =\u003e G\n  , (value: G) =\u003e H\n  ]\n): H\nfunction pipe\u003cA, B, C, D, E, F, G\u003e(\n  value: A\n, ...operators: [\n    (value: A) =\u003e B\n  , (value: B) =\u003e C\n  , (value: C) =\u003e D\n  , (value: D) =\u003e E\n  , (value: E) =\u003e F\n  , (value: F) =\u003e G\n  ]\n): G\nfunction pipe\u003cA, B, C, D, E, F\u003e(\n  value: A\n, ...operators: [\n    (value: A) =\u003e B\n  , (value: B) =\u003e C\n  , (value: C) =\u003e D\n  , (value: D) =\u003e E\n  , (value: E) =\u003e F\n  ]\n): F\nfunction pipe\u003cA, B, C, D, E\u003e(\n  value: A\n, ...operators: [\n    (value: A) =\u003e B\n  , (value: B) =\u003e C\n  , (value: C) =\u003e D\n  , (value: D) =\u003e E\n  ]\n): E\nfunction pipe\u003cA, B, C, D\u003e(\n  value: A\n, ...operators: [\n    (value: A) =\u003e B\n  , (value: B) =\u003e C\n  , (value: C) =\u003e D\n  ]\n): D\nfunction pipe\u003cA, B, C\u003e(\n  value: A\n, ...operators: [\n    (value: A) =\u003e B\n  , (value: B) =\u003e C\n  ]\n): C\nfunction pipe\u003cA, B\u003e(\n  value: A\n, ...operators: [\n    (value: A) =\u003e B\n  ]\n): B\nfunction pipe\u003cT, U\u003e(\n  value: T\n, ...operators: Array\u003c(value: any) =\u003e unknown\u003e\n): U\n```\n\n#### pipeAsync\n```ts\nfunction pipeAsync\u003cA, B, C, D, E, F, G, H\u003e(\n  value: Awaitable\u003cA\u003e\n, ...operators: [\n    (value: A) =\u003e Awaitable\u003cB\u003e\n  , (value: B) =\u003e Awaitable\u003cC\u003e\n  , (value: C) =\u003e Awaitable\u003cD\u003e\n  , (value: D) =\u003e Awaitable\u003cE\u003e\n  , (value: E) =\u003e Awaitable\u003cF\u003e\n  , (value: F) =\u003e Awaitable\u003cG\u003e\n  , (value: G) =\u003e Awaitable\u003cH\u003e\n  ]\n): Promise\u003cH\u003e\nfunction pipeAsync\u003cA, B, C, D, E, F, G\u003e(\n  value: Awaitable\u003cA\u003e\n, ...operators: [\n    (value: A) =\u003e Awaitable\u003cB\u003e\n  , (value: B) =\u003e Awaitable\u003cC\u003e\n  , (value: C) =\u003e Awaitable\u003cD\u003e\n  , (value: D) =\u003e Awaitable\u003cE\u003e\n  , (value: E) =\u003e Awaitable\u003cF\u003e\n  , (value: F) =\u003e Awaitable\u003cG\u003e\n  ]\n): Promise\u003cG\u003e\nfunction pipeAsync\u003cA, B, C, D, E, F\u003e(\n  value: Awaitable\u003cA\u003e\n, ...operators: [\n    (value: A) =\u003e Awaitable\u003cB\u003e\n  , (value: B) =\u003e Awaitable\u003cC\u003e\n  , (value: C) =\u003e Awaitable\u003cD\u003e\n  , (value: D) =\u003e Awaitable\u003cE\u003e\n  , (value: E) =\u003e Awaitable\u003cF\u003e\n  ]\n): Promise\u003cF\u003e\nfunction pipeAsync\u003cA, B, C, D, E\u003e(\n  value: Awaitable\u003cA\u003e\n, ...operators: [\n    (value: A) =\u003e Awaitable\u003cB\u003e\n  , (value: B) =\u003e Awaitable\u003cC\u003e\n  , (value: C) =\u003e Awaitable\u003cD\u003e\n  , (value: D) =\u003e Awaitable\u003cE\u003e\n  ]\n): Promise\u003cE\u003e\nfunction pipeAsync\u003cA, B, C, D\u003e(\n  value: Awaitable\u003cA\u003e\n, ...operators: [\n    (value: A) =\u003e Awaitable\u003cB\u003e\n  , (value: B) =\u003e Awaitable\u003cC\u003e\n  , (value: C) =\u003e Awaitable\u003cD\u003e\n  ]\n): Promise\u003cD\u003e\nfunction pipeAsync\u003cA, B, C\u003e(\n  value: Awaitable\u003cA\u003e\n, ...operators: [\n    (value: A) =\u003e Awaitable\u003cB\u003e\n  , (value: B) =\u003e Awaitable\u003cC\u003e\n  ]\n): Promise\u003cC\u003e\nfunction pipeAsync\u003cA, B\u003e(\n  value: Awaitable\u003cA\u003e\n, ...operators: [\n    (value: A) =\u003e Awaitable\u003cB\u003e\n  ]\n): Promise\u003cB\u003e\nfunction pipeAsync\u003cT, U\u003e(\n  value: Awaitable\u003cT\u003e\n, ...operators: Array\u003c(value: any) =\u003e Awaitable\u003cunknown\u003e\u003e\n): Promise\u003cU\u003e\n```\n\n#### Reducers\n```ts\nfunction max(result: number, current: number): number\nfunction min(result: number, current: number): number\nfunction sum(result: number, current: number): number\nfunction product(result: number, current: number): number\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblackglory%2Fextra-utils","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fblackglory%2Fextra-utils","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblackglory%2Fextra-utils/lists"}