{"id":15357151,"url":"https://github.com/chocolateboy/get-wild","last_synced_at":"2025-07-25T03:14:15.857Z","repository":{"id":54212670,"uuid":"295824931","full_name":"chocolateboy/get-wild","owner":"chocolateboy","description":"Extract nested properties from an object with support for wildcards","archived":false,"fork":false,"pushed_at":"2023-04-23T10:43:37.000Z","size":382,"stargazers_count":7,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-16T17:30:17.259Z","etag":null,"topics":["dig","dot","dot-notation","dotted","dotty","extract","get","glob","globbing","json","lodash-get","microlibrary","path","pluck","selector","star","wildcard","wildcards","zero-dependency"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/chocolateboy.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","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-09-15T19:08:26.000Z","updated_at":"2024-01-11T13:06:02.000Z","dependencies_parsed_at":"2024-06-19T02:07:15.902Z","dependency_job_id":null,"html_url":"https://github.com/chocolateboy/get-wild","commit_stats":null,"previous_names":[],"tags_count":21,"template":false,"template_full_name":null,"purl":"pkg:github/chocolateboy/get-wild","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chocolateboy%2Fget-wild","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chocolateboy%2Fget-wild/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chocolateboy%2Fget-wild/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chocolateboy%2Fget-wild/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chocolateboy","download_url":"https://codeload.github.com/chocolateboy/get-wild/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chocolateboy%2Fget-wild/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265527756,"owners_count":23782488,"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":["dig","dot","dot-notation","dotted","dotty","extract","get","glob","globbing","json","lodash-get","microlibrary","path","pluck","selector","star","wildcard","wildcards","zero-dependency"],"created_at":"2024-10-01T12:33:34.001Z","updated_at":"2025-07-25T03:14:15.799Z","avatar_url":"https://github.com/chocolateboy.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# get-wild\n\n[![Build Status](https://github.com/chocolateboy/get-wild/workflows/test/badge.svg)](https://github.com/chocolateboy/get-wild/actions?query=workflow%3Atest)\n[![NPM Version](https://img.shields.io/npm/v/get-wild.svg)](https://www.npmjs.org/package/get-wild)\n\n\u003c!-- TOC --\u003e\n\n- [NAME](#name)\n- [FEATURES](#features)\n- [INSTALLATION](#installation)\n- [SYNOPSIS](#synopsis)\n  - [Negative array indices](#negative-array-indices)\n  - [Wildcards](#wildcards)\n- [DESCRIPTION](#description)\n  - [Why?](#why)\n  - [Why not?](#why-not)\n- [TYPES](#types)\n- [EXPORTS](#exports)\n  - [get-wild](#get-wild-default)\n    - [get](#get)\n    - [getter](#getter)\n    - [split](#split)\n  - [get-wild/fp](#get-wild-fp)\n    - [get](#get-fp)\n    - [getter](#getter-fp)\n- [OPTIONS](#options)\n  - [collect](#collect)\n  - [default](#default)\n  - [flatMap](#flatmap)\n  - [map](#map)\n  - [split](#options-parser)\n- [DEVELOPMENT](#development)\n- [COMPATIBILITY](#compatibility)\n- [SEE ALSO](#see-also)\n- [VERSION](#version)\n- [AUTHOR](#author)\n- [COPYRIGHT AND LICENSE](#copyright-and-license)\n\n\u003c!-- TOC END --\u003e\n\n# NAME\n\nget-wild - extract nested properties from an object with support for wildcards\n\n# FEATURES\n\n- configurable wildcard support, e.g. `\"foo.*.bar\"`\n- support for negative array indices, e.g. `\"foo[-1].bar\"`\n- pluggable path parser\n- no dependencies\n- \u0026lt; 800 B minified + gzipped\n- curried (data last) versions for functional programming\n- fully typed (TypeScript)\n- CDN builds (UMD) - [jsDelivr][], [unpkg][]\n\n# INSTALLATION\n\n```\n$ npm install get-wild\n```\n\n# SYNOPSIS\n\n```javascript\nimport { get } from 'get-wild'\n\nconst obj = { foo: { bar: { baz: 'quux' } } }\n\nget(obj, 'foo.bar.baz')               // \"quux\"\nget(obj, 'foo.fizz.buzz')             // undefined\nget(obj, 'foo.fizz.buzz', 42)         // 42\nget(obj, ['foo', 'bar', 'baz'])       // \"quux\"\nget(obj, ['foo', 'fizz', 'buzz'], 42) // 42\n```\n\n### Negative array indices\n\n```javascript\nconst array = [\n    [{ value: 1 }, { value: 2 }, { value: 3 }],\n    [{ value: 4 }, { value: 5 }, { value: 6 }],\n    [{ value: 7 }, { value: 8 }, { value: 9 }],\n]\n\nget(array, '[1][-2].value')   // 5\nget(array, [-1, -1, 'value']) // 9\n```\n\n### Wildcards\n\n```javascript\nconst data = {\n    users: {\n        'abc123': {\n            name: 'John Doe',\n            homepage: 'https://example.com/john-doe',\n            hobbies: ['eating', 'sleeping'],\n        },\n        'def345': {\n            name: 'Jane Doe',\n            homepage: 'https://example.com/jane-doe',\n        },\n        'ghi567': {\n            name: 'Nemo',\n            hobbies: ['singing', 'dancing'],\n        },\n    }\n}\n\nget(data, 'users[0].name')  // \"John Doe\"\nget(data, 'users[-1].name') // \"Nemo\"\nget(data, 'users.*.name')   // [\"John Doe\", \"Jane Doe\", \"Nemo\"]\n\nget(data, 'users.*.homepage')\n// [\"https://example.com/john-doe\", \"https://example.com/jane-doe\", undefined]\n\n// also works with arrays\nget(array, '[1].*.value')  // [4, 5, 6]\nget(array, '[-1].*.value') // [7, 8, 9]\n```\n\n\u003c!-- TOC:ignore --\u003e\n#### Flatten results\n\n```javascript\nget(data, 'users.*.hobbies')\n// [\"eating\", \"sleeping\", undefined, \"singing\", \"dancing\"]\n```\n\n\u003c!-- TOC:ignore --\u003e\n#### Remove missing results\n\n```javascript\nget(data, 'users.*.hobbies', [])\n// [\"eating\", \"sleeping\", \"singing\", \"dancing\"]\n```\n\n\u003c!-- TOC:ignore --\u003e\n#### Raw results\n\n```javascript\nget(data, 'users.**.hobbies')\n// [[\"eating\", \"sleeping\"], undefined, [\"singing\", \"dancing\"]]\n```\n\n# DESCRIPTION\n\nThis module exports a function which can be used to extract nested properties\nfrom an object, including arrays and any other non-falsey values. This is\nsimilar to the `get` function provided by Lodash (and many other libraries),\nbut it adds the following features:\n\n  - wildcard support, e.g. `\"foo.*.bar.*.baz\"`\n  - support for negative array indices, e.g. `\"foo[-1][-2]\"`\n\nIn addition to the default [`get`](#get) implementation, get-wild exports a\nbuilder function ([`getter`](#getter)) which can be used to create a custom\n`get` with different [options](#options) baked in, as well as curried\n(data last) versions of [`get`](#get-fp) and [`getter`](#getter-fp) to\nfacilitate functional composition and reuse.\n\n## Why?\n\nI needed a small, dependency-free version of [`Lodash.get`][Lodash.get] with wildcard\nsupport, and preferably with an option to filter out/exclude missing values.\nAlthough there are a huge number of `get` implementations on NPM, I could only\nfind one or two with wildcard support and none that are\nstandalone/dependency-free.\n\n## Why not?\n\nIf you don't need support for wildcards, negative array-indices, or other\n[options](#options), there are smaller implementations, e.g.\n[dlv][].\n\n# TYPES\n\nThe following types are referenced in the descriptions below.\n\n```typescript\ntype Options = {\n    collect?: Collect;\n    default?: any;\n    flatMap?: PropertyKey | false;\n    map?: PropertyKey | false;\n    parser?: string | Parser;\n    split?: Options['parser'];\n}\n\ninterface Collect {\n    (value: {}) =\u003e Array\u003cany\u003e;\n    (value: {}, index: number) =\u003e ArrayLike\u003cany\u003e;\n}\n\ntype Parser = (path: string) =\u003e Array\u003cPropertyKey\u003e;\ntype Path = PropertyKey | Array\u003cPropertyKey\u003e;\n```\n\n# EXPORTS\n\n\u003ca name=\"get-wild-default\"\u003e\u003c/a\u003e\n## get-wild\n\n### get\n\n- **Type**: `\u003cT = any\u003e(obj: any, path: Path, $default?: any) =\u003e T`\n\n```javascript\nimport { get } from 'get-wild'\n\nget(obj, 'foo.*.bar', [])\n```\n\nTakes an object, a path and an optional default value, and returns the\nvalue(s) found in the object at the specified path, or the default value\n(which is undefined by default) if the path doesn't exist or the value is\nundefined. The path can be supplied as a dotted expression (string), symbol\nor number, or an array of strings, symbols or numbers.\n\nThe [syntax](#path-syntax) of dotted path expressions mostly matches that of\nregular JavaScript path expressions, with a few additions.\n\nIf there are no steps in the path, the object itself is returned (or the\ndefault value if the object is undefined).\n\nWildcard matching is performed by [`collect`](#collect)ing an array of values\nat the wildcard's location and recursively [`get`](#get)ting the remainder of\nthe path from each value. Wildcards can be used at any locations in a path to\nturn a single lookup into an array of lookup results for values at that\nlocation.\n\nThe values returned by wildcard matches can be customized. By default, `*`\nflattens the results (using [`flatMap`][flatMap]), while `**` uses\n[`map`][map], which returns the results verbatim, though this mapping can be\nconfigured (or disabled) via the [`map`](#map) and [`flatMap`](#flatmap)\noptions.\n\nThe `get` export is generated by a builder function, [`getter`](#getter), which\ncan be used to create a custom `get` function with different options.\n\n### getter\n\n- **Type**: `(options?: Options) =\u003e \u003cT = any\u003e(obj: any, path: Path, $default?: any) =\u003e T`\n\n```javascript\nimport { getter } from 'get-wild'\n\nconst get = getter({ split: '/' })\nconst obj = { foo: { bar: { baz: 42 } } }\n\nget(obj, 'foo/bar/baz') // 42\n```\n\n`getter` is a function which is used to build `get` functions. The default\n`get` export is generated by calling `getter` with no arguments, which uses the\nfollowing default [options](#options):\n\n```javascript\n    {\n        collect: Object.values,\n        default: undefined,\n        flatMap: '*',\n        map: '**',\n        split: defaultParser,\n    }\n```\n\nThe behavior of `get` can be configured by generating a custom version which\noverrides these defaults, e.g.:\n\n```javascript\nimport { getter } from 'get-wild'\n\nconst split = path =\u003e path.split('/')\nconst get = getter({ split })\n\nget(obj, 'foo/bar/*/quux')\n```\n\n### split\n\n- **Type**: `Parser`\n- **Aliases**: parse, parser\n\n```javascript\nimport { getter, split } from 'get-wild'\nimport memoize from '@example/memoizer'\n\nconst memoized = memoize(split)\nconst get = getter({ split: memoized })\n\nget(obj, '...')\n```\n\nThe default function used by [`get`](#get) to turn a path expression (string)\ninto an array of steps (strings, symbols or numbers).\n\nThe array is not mutated, so, e.g., the function can be memoized to avoid\nre-parsing long/frequently-used paths. Alternatively, the path can be\npre-parsed into an array (this is done automatically if the\n[curried versions](#get-wild-fp) are used).\n\n\u003ca name=\"path-syntax\"\u003e\u003c/a\u003e\n\u003c!-- TOC:ignore --\u003e\n#### Syntax\n\nThe parser supports an extended version of JavaScript's native path syntax,\ne.g. the path:\n\n```javascript\n`a[-1].b[42].-1.42[\"c.d\"].e['f g'].*.h[\"i \\\\\"j\\\\\" k\"]['']`\n```\n\nis parsed into the following steps:\n\n```javascript\n['a', -1, 'b', 42, '-1', '42', 'c.d', 'e', 'f g', '*', 'h', 'i \"j\" k', '']\n```\n\nProperties are either unquoted names (strings), bracketed integers, or\nbracketed single or double-quoted strings. Integers can be signed (`-1`, `+42`)\nor unsigned (`42`). Unquoted names can contain any characters apart from spaces\n(`\\s`), `\"`, `'`, \u003ccode\u003e\u0026#96;\u003c/code\u003e, `[`, `]`, `.` or `\\`.\n\nUnquoted property names must be preceded by a dot unless the name is at the\nstart of the path, in which case the dot must be omitted. Bracketed values\nmust not be preceded by a dot.\n\nIf the path is an empty string, an empty array is returned.\n\n\u003ca name=\"get-wild-fp\"\u003e\u003c/a\u003e\n## get-wild/fp\n\n\u003ca name=\"get-fp\"\u003e\u003c/a\u003e\n### get\n\n- **Type**: `\u003cT = any\u003e(path: Path, $default?: any) =\u003e \u003cU = T\u003e(obj: any) =\u003e U`\n\n```javascript\nimport { get } from 'get-wild/fp'\n\nconst followers = get('followers.*.name', [])\n\nfollowers(user) // get(user, [\"followers\", \"*\", \"name\"], [])\n\nconst allFollowers = users.flatMap(followers)\n```\n\nA curried version of [`get`](#get) which takes a path and an optional default\nvalue and returns a function which takes an object and returns the value(s)\nlocated at the path.\n\n\u003ca name=\"getter-fp\"\u003e\u003c/a\u003e\n### getter\n\n- **Type**: `(options?: Options) =\u003e \u003cT = any\u003e(path: Path, $default?: any) =\u003e \u003cU = T\u003e(obj: any) =\u003e U`\n\n```javascript\nimport { getter } from 'get-wild/fp'\n\nconst get = getter({ default: [], split: '.' })\nconst followers = get('followers.*.name')\n\nfollowers(user) // get(user, [\"followers\", \"*\", \"name\"], [])\n\nconst allFollowers = users.flatMap(followers)\n```\n\nA variant of [`getter`](#getter) which takes an optional [Options](#options)\nobject and returns a [curried version of `get`](#get-fp) with the options baked\nin.\n\n# OPTIONS\n\n## collect\n\n- **Type**:\n  - `(value: {}) =\u003e Array\u003cany\u003e`\n  - `(value: {}, index: number) =\u003e ArrayLike\u003cany\u003e`\n- **Default**: `Object.values`\n\n```javascript\nimport { getter } from 'get-wild'\n\nconst collect = value =\u003e {\n    return (value instanceof Map || value instanceof Set)\n        ? Array.from(value.values())\n        : Object.values(value)\n}\n\nconst map = new Map([\n    [1, { value: 'foo' }],\n    [2, { value: 'bar' }],\n    [3, { value: 'baz' }],\n    [4, { value: 'quux' }],\n])\n\nconst obj = { map }\nconst get = getter({ collect })\n\nget(obj, 'map[0].value')  // \"foo\"\nget(obj, 'map[-1].value') // \"quux\"\nget(obj, 'map.*.value')   // [\"foo\", \"bar\", \"baz\", \"quux\"]\n```\n\nThe `collect` function is used to convert a non-array value matched by a\nwildcard or indexed by an integer into an array of values. If not supplied, it\ndefaults to [`Object.values`][Object.values], which works with plain objects,\narray-likes, and other non-nullish values. It can be overridden to add support\nfor traversable values which aren't plain objects or arrays, e.g. DOM elements\nor ES6 Map and Set instances.\n\nNote that the value passed to `collect` is not falsey and not an array, as both\nare handled without calling `collect`.\n\nFor indexed access, the `collect` function is passed the index (which may be\nnegative) as its second argument and the return value can be an array-like\nrather than a full-blown array. For wildcard matches, the index is omitted and\nthe return value must be an array. This distinction can be used to customize\nthe result, e.g. to avoid constructing a large array if only a single value is\naccessed.\n\n## default\n\n- **Type**: `any`\n- **Default**: `undefined`\n\n```javascript\nconst get = getter({ default: [] })\n\nget(data, 'users.*.hobbies')\n// [\"eating\", \"sleeping\", \"singing\", \"dancing\"]\n\nget(data, 'users.*.hobbies', [])\n// [\"eating\", \"sleeping\", \"singing\", \"dancing\"]\n\nget(data, 'users.*.hobbies', undefined)\n// [\"eating\", \"sleeping\", undefined, \"singing\", \"dancing\"]\n```\n\nThis option allows the default value to be baked into a `get` function. If no\nthird argument is passed to the function, this value is returned for\nmissing/undefined properties. Otherwise, the supplied value is returned.\n\n## flatMap\n\n- **Type**: `PropertyKey | false`\n- **Default**: `\"*\"`\n\n```javascript\nimport { getter } from 'get-wild'\n\nconst get = getter({ flatMap: '**', map: '*' })\n\nget(data, 'users.**.hobbies', [])\n// [\"eating\", \"sleeping\", \"singing\", \"dancing\"]\n\nget(data, 'users.*.hobbies', [])\n// [[\"eating\", \"sleeping\"], [], [\"singing\", \"dancing\"]]\n```\n\nThe token used to match values at the specified location and flatten the results.\n\nIf set to false, wildcard matching with `flatMap` is disabled and the token is\ntreated as a regular property name.\n\n\u003c!-- TOC:ignore --\u003e\n### Usage\n\nWildcard matching with `flatMap` behaves in a similar way to directory/filename\nmatching with [globs][] (minus the pattern matching). The selected properties\n(at the end of the path) are returned as direct children of the resulting array\n(wildcard matches always return an array), either as matched results or as\ndefault values if there's no match.\n\nFor example, with the default mapping, a path such as\n`accounts.active.*.followers.*.name`, which extracts the names of all followers\nof active accounts, would return an array of account names interspersed with\ndefault values where an account doesn't have any followers (or if a follower's\nname is undefined), e.g.:\n\n```javascript\nget(data, 'accounts.active.*.followers.*.name')\n// [\"john\", \"paul\", undefined, \"george\", undefined, \"ringo\"]\n```\n\nThis can be reduced to just the names by setting the default value to an empty\narray, e.g.:\n\n```javascript\nget(data, 'accounts.active.*.followers.*.name', [])\n// [\"john\", \"paul\", \"george\", \"ringo\"]\n```\n\n\u003c!-- TOC:ignore --\u003e\n### Syntax\n\nNote that with the [default parser](#split), the token must be a\n[syntactically-valid](#path-syntax) name, e.g. this doesn't work:\n\n```javascript\nimport { getter } from 'get-wild'\n\nconst obj = { foo: [{ bar: 1 }, { bar: 2 }] }\nconst get = getter({ flatMap: '[]' })\n\nget(obj, 'foo.[].bar') // SyntaxError: Invalid step @ 3: \"foo.[].bar\"\n```\n\nIf a [custom parser](#options-parser) is supplied, any token can be used:\n\n```javascript\nconst get = getter({ flatMap: '[]', split: '.' })\n\nget(obj, 'foo.[].bar') // [1, 2]\n```\n\n## map\n\n- **Type**: `PropertyKey | false`\n- **Default**: `\"**\"`\n\n```javascript\nimport { getter } from 'get-wild'\n\nconst get = getter({ map: '*', flatMap: '**' })\n\nget(data, 'users.*.hobbies', [])\n// [[\"eating\", \"sleeping\"], [], [\"singing\", \"dancing\"]]\n\nget(data, 'users.**.hobbies', [])\n// [\"eating\", \"sleeping\", \"singing\", \"dancing\"]\n```\n\nThe token used to match values at the specified location without flattening the\nresults.\n\nMatching with `map` selects the same values as `flatMap`, but they remain\nnested inside arrays, with each enclosing `map` in the path adding another\nlayer of wrapping.\n\nIf set to false, wildcard matching with `map` is disabled and the token is\ntreated as a regular property name.\n\n\u003ca name=\"options-parser\"\u003e\u003c/a\u003e\n## split\n\n- **Type**: `string | Parser`\n- **Default**: [`split`](#split)\n- **Alias**: parser\n\n```javascript\nimport { getter } from  'get-wild'\n\nconst split = path =\u003e path.split('.')\nconst get = getter({ split })\nconst obj = { '': { '': 42 } }\n\nget(obj, '.') // 42\n```\n\nA function which takes a path expression (string) and parses it into an array\nof property names (strings, symbols or numbers). If not supplied, a\n[default parser](#split) which supports an extended version of JavaScript's\nnative path [syntax](#path-syntax) is used.\n\nAs a shortcut, if the value is a string, a function which splits the path on\nthat string is used, i.e. the following are equivalent:\n\n```javascript\nconst split = path =\u003e path.split('.')\nconst get = getter({ split })\n```\n\n```javascript\nconst get = getter({ split: '.' })\n```\n\n# DEVELOPMENT\n\n\u003cdetails\u003e\n\n\u003c!-- TOC:ignore --\u003e\n## NPM Scripts\n\nThe following NPM scripts are available:\n\n- build - compile the library for testing and save to the target directory\n- build:doc - generate the README's TOC (table of contents)\n- build:release - compile the library for release and save to the target directory\n- clean - remove the target directory and its contents\n- rebuild - clean the target directory and recompile the library\n- repl - launch a node REPL with the library loaded\n- test - recompile the library and run the test suite\n- test:run - run the test suite\n- typecheck - sanity check the library's type definitions\n\n\u003c/details\u003e\n\n# COMPATIBILITY\n\n- [Maintained Node.js versions](https://github.com/nodejs/Release#readme) and compatible browsers\n\n# SEE ALSO\n\n- [@gizt/selector](https://www.npmjs.com/package/@gizt/selector)\n- [dot-wild-tiny](https://www.npmjs.com/package/dot-wild-tiny)\n- [jsonpath](https://www.npmjs.com/package/jsonpath)\n- [object-path-wild](https://www.npmjs.com/package/object-path-wild)\n- [qim](https://www.npmjs.com/package/qim)\n- [wild-wild-path](https://www.npmjs.com/package/wild-wild-path)\n\n# VERSION\n\n3.0.2\n\n# AUTHOR\n\n[chocolateboy](https://github.com/chocolateboy)\n\n# COPYRIGHT AND LICENSE\n\nCopyright © 2020-2022 by chocolateboy.\n\nThis is free software; you can redistribute it and/or modify it under the terms\nof the [MIT license](https://opensource.org/licenses/MIT).\n\n[dlv]: https://www.npmjs.com/package/dlv\n[flat]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat\n[flatMap]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap\n[globs]: https://en.wikipedia.org/wiki/Glob_(programming)\n[jsDelivr]: https://cdn.jsdelivr.net/npm/get-wild\n[Lodash.get]: https://www.npmjs.com/package/lodash.get\n[map]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map\n[Object.values]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values\n[polyfill]: https://www.npmjs.com/package/array-flat-polyfill\n[unpkg]: https://unpkg.com/get-wild\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchocolateboy%2Fget-wild","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchocolateboy%2Fget-wild","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchocolateboy%2Fget-wild/lists"}