🀠 Object property paths with wildcards and regexps 🌡

Overview

Codecov Build Node Twitter Medium

🀠 Object property paths with wildcards and regexps. 🌡

Get/set object properties using:

Install

npm install wild-wild-path

This package is an ES module and must be loaded using an import or import() statement, not require().

API

Methods

get(target, query, options?)

target: Target
query: Query
options: Options?
Return value: any | undefined

Return the first property matching the query.

const target = { settings: { colors: ['red', 'blue'] } }

get(target, 'settings.colors.0') // 'red'
get(target, ['settings', 'colors', 0]) // 'red'

has(target, query, options?)

target: Target
query: Query
options: Options?
Return value: boolean

Return whether the query matches any property.

const target = { settings: { lastName: undefined, colors: ['red', 'blue'] } }

has(target, 'settings.firstName') // false
has(target, ['settings', 'firstName']) // false
has(target, 'settings.lastName') // true

list(target, query, options?)

target: Target
query: Query
options: Options?
Return value: any[]

Return all properties matching the query, as an array.

const target = {
  userOne: { firstName: 'John', lastName: 'Doe', age: 72 },
  userTwo: { firstName: 'Alice', colors: ['red', 'blue', 'yellow'] },
}

list(target, 'userOne.firstName userTwo.colors.0') // ['John', 'red']
list(target, [
  ['userOne', 'firstName'],
  ['userTwo', 'colors', 0],
]) // ['John', 'red']

list(target, 'userOne./Name/') // ['John', 'Doe']
list(target, ['userOne', /Name/]) // ['John', 'Doe']

list(target, 'userTwo.colors.*') // ['red', 'blue', 'yellow']
list(target, 'userTwo.colors.0:2') // ['red', 'blue']
list(target, '**.firstName') // ['John', 'Alice']
list(target, 'userOne.*', { entries: true })
// [
//   { value: 'John', path: ['userOne', 'firstName'], missing: false },
//   { value: 'Doe', path: ['userOne', 'lastName'], missing: false },
//   { value: 72, path: ['userOne', 'age'], missing: false },
// ]

iterate(target, query, options?)

target: Target
query: Query
options: Options?
Return value: Iterable<any>

Return all properties matching the query, as an iterable. This is slower than list() but uses less memory.

const target = { settings: { colors: ['red', 'blue'] } }

for (const color of iterate(target, 'settings.colors.*')) {
  console.log(color) // 'red', 'blue'
}

set(target, query, value, options?)

target: Target
query: Query
value: any
options: Options?
Return value: Target

Sets all properties matching the query. The return value is a deep clone unless the mutate option is true.

const target = { colors: ['red', 'blue'] }

set(target, 'colors.0', 'yellow') // ['yellow', 'blue']
set(target, ['colors', 0], 'yellow') // ['yellow', 'blue']
set(target, 'colors.-1', 'yellow') // ['red', 'yellow']
set(target, 'colors.-0', 'yellow') // ['red', 'blue', 'yellow']
set(target, 'colors.*', 'yellow') // ['yellow', 'yellow']
set({}, 'user.0.color', 'red') // { user: [{ color: 'red' }] }
set({}, 'user.0.color', 'red', { missing: false }) // {}

remove(target, query, options?)

target: Target
query: Query
options: Options?
Return value: Target

Delete all properties matching the query. The return value is a deep clone unless the mutate option is true.

const target = { user: { firstName: 'John', lastName: 'Doe', age: 72 } }

remove(target, 'user.lastName') // { user: { firstName: 'John', age: 72 } }
remove(target, 'user./Name/') // { user: { age: 72 } }
remove(target, ['user', /Name/]) // { user: { age: 72 } }

Functional utilities

wild-wild-utils is a separate library which provides with additional, higher-level methods: map(), merge(), push(), unshift(), find(), pick(), include(), exclude().

Target

The target value must be an object or an array.

Queries

There are two equivalent formats for queries: strings and arrays.

  • Query strings are friendlier to CLI usage, more expressive, and easier to serialize.
  • Query arrays are friendlier to programmatic usage, and faster. Also, they do not require escaping, so they should be used when the input is dynamic or user-provided to prevent injection attacks.

Query strings

⛏️ Deep properties

# Deep properties of objects or arrays.
# Dots are used for array indices, not brackets.
# Symbol properties are always ignored.
user.colors.0

πŸš‚ Unions

# Unions ("or") of queries are space-delimited.
# The string must not be empty.
colors name age

⭐ Wildcards

# Shallow wildcards target all properties/items of a single object/array
user.*

# Deep wildcards target all properties/items of 0, 1 or many objects/arrays
user.**
**.colors

πŸ—ΊοΈ Regexps

# Regexps match property names
user./name/

# Flags can be used, e.g. to make it case-insensitive
user./name/i

# ^ $ must be used to match from the beginning or until the end
user./^name$/i

🌡 Arrays indices

# Array indices are integers
user.colors.0

# Array indices can be negative.
# -1 is the last item.
# -0 is the item after it, which can be used to append.
user.colors.-1

🏜️ Array slices

# Array slices. Goes from the start (included) to the end index (excluded).
user.colors.0:2

# The start index defaults to 0, i.e. the beginning
user.colors.:2

# The end index defaults to -0, i.e. the end
user.colors.0:
user.colors.:

πŸͺ¨ Escaping

# Dots, spaces and backslashes in property names must be escaped
name\\ with\\ spaces
name\\.with\\.dots
name\\\\with\\\\backslashes

# Ambiguous property names must be escaped with a backslash at the beginning.
# This includes properties that:
#  - Are integers but are not array elements
#  - Have multiple slashes and start with one
name.\\0
name.\\/not_a_regexp/

🏨 Root and empty strings

# A leading dot can optionally be used. It is ignored.
user.colors
.user.colors

# Root value
.

# Empty string properties
user..colors

Query arrays

⛏️ Deep properties

// Deep properties of objects or arrays.
// Symbol properties are always ignored.
['user', 'colors', 0]

πŸš‚ Unions

// Unions ("or") of queries are arrays of arrays.
// There must be at least one item.
[['colors'], ['name'], ['age']]

⭐ Wildcards

// Shallow wildcards target all properties/items of a single object/array
['user', { type: 'any' }]

// Deep wildcards target all properties/items of 0, 1 or many objects/arrays
['user', { type: 'anyDeep' }]
[{ type: 'anyDeep' }, 'colors']

🀠 Regexps

// Regexps match property names
['user', /name/]

// Flags can be used, e.g. to make it case-insensitive
['user', /name/i]

// ^ $ must be used to match from the beginning or until the end
['user', /^name$/i]

🌡 Arrays indices

// Array indices are integers, not strings
['user', 'colors', 0]

// Array indices can be negative.
// -1 is the last item.
// -0 is the item after it, which can be used to append.
['user', 'colors', -1]

🏜️ Array slices

// Array slices. Goes from the start (included) to the end index (excluded).
['user', 'colors', { type: 'slice', from: 0, to: 2 }]

// The start index defaults to 0, i.e. the beginning
['user', 'colors', { type: 'slice', to: 2 }]

// The end index defaults to -0, i.e. the end
['user', 'colors', { type: 'slice', from: 0 }]
['user', 'colors', { type: 'slice' }]

πŸͺ¨ Escaping

// Escaping is not necessary with query arrays
['name with spaces']
['name.with.dots']
['name\\with\\backslashes']
['name', '0']
['name', '/not_a_regexp/']

🏨 Root and empty strings

// Root value
[]

// Empty string properties
['user', '', 'colors']

Paths

A "path" is any query using only property names and positive array indices. This excludes negative indices, slices, wildcards, regexps and unions.

Paths are returned by the entries option.

# Path string
user.colors.0
// Path array
['user', 'colors', 0]

Conversions and comparisons

wild-wild-parser can be used to convert between both formats, or to compare queries.

Undefined values

Object properties with a defined key but an undefined value are not ignored. However, object properties without any defined key are ignored. The has() method, missing option and entries option can be used to distinguish those.

const target = { name: undefined }

has(target, 'name') // true
has(target, 'colors') // false

get(target, 'name') // undefined
get(target, 'colors') // undefined
get(target, 'name', { entries: true, missing: true })
// { value: undefined, path: ['name'], missing: false }
get(target, 'colors', { entries: true, missing: true })
// { value: undefined, path: ['colors'], missing: true }

list(target, '*') // [undefined]
list(target, '*', { entries: true })
// [{ value: undefined, path: ['name'], missing: false }]

Options

Options are optional plain objects.

mutate

Methods: set(), remove()
Type: boolean
Default: false

By default, the target is deeply cloned.
When true, it is directly mutated instead, which is faster but has side effects.

const target = {}
console.log(set(target, 'name', 'Alice')) // { name: 'Alice' }
console.log(target) // {}
console.log(set(target, 'name', 'Alice', { mutate: true })) // { name: 'Alice' }
console.log(target) // { name: 'Alice' }

entries

Methods: get(), list(), iterate()
Type: boolean
Default: false

By default, properties' values are returned.
When true, objects with the following shape are returned instead:

  • value any: property's value
  • path Path: property's full path
  • missing boolean: whether the property is missing from the target
const target = { firstName: 'Alice', lastName: 'Smith' }
list(target, '*') // ['Alice', 'Smith']
list(target, '*', { entries: true })
// [
//   { value: 'Alice', path: ['firstName'], missing: false },
//   { value: 'Smith', path: ['lastName'], missing: false },
// ]

missing

Methods: all except has() and remove()
Type: boolean
Default: false with list|iterate(), true with set()

When false, properties not defined in the target are ignored.

const target = {}

set(target, 'name', 'Alice') // { name: 'Alice' }
set(target, 'name', 'Alice', { missing: false }) // {}

list(target, 'name') // []
list(target, 'name', { missing: true, entries: true })
// [{ value: undefined, path: ['name'], missing: true }]

sort

Methods: get(), list(), iterate()
Type: boolean
Default: false

When returning sibling object properties, sort them by the lexigographic order of their names (not values).

const target = { lastName: 'Doe', firstName: 'John' }
list(target, '*') // ['Doe', 'John']
list(target, '*', { sort: true }) // ['John', 'Doe']

childFirst

Methods: get(), list(), iterate()
Type: boolean
Default: false

When using unions or deep wildcards, a query might match both a property and some of its children.

This option decides whether the returned properties should be sorted from children to parents, or the reverse.

const target = { user: { name: 'Alice' } }
list(target, 'user.**') // [{ name: 'Alice' }, 'Alice']
list(target, 'user.**', { childFirst: true }) // ['Alice', { name: 'Alice' }]

leaves

Methods: all except has()
Type: boolean
Default: false

When using unions or deep wildcards, a query might match both a property and some of its children.

When true, only leaves are matched. In other words, a matching property is ignored if one of its children also matches.

const target = { user: { name: 'Alice' } }
list(target, 'user.**') // [{ name: 'Alice' }, 'Alice']
list(target, 'user.**', { leaves: true }) // ['Alice']

roots

Methods: get(), list(), iterate()
Type: boolean
Default: false

When using unions or deep wildcards, a query might match both a property and some of its children.

When true, only roots are matched. In other words, a matching property is ignored if one of its parents also matches.

const target = { user: { name: 'Alice' } }
list(target, 'user.**') // [{ name: 'Alice' }, 'Alice']
list(target, 'user.**', { roots: true }) // [{ name: 'Alice' }]

classes

Methods: all
Type: boolean
Default: false

Unless true, wildcards and regexps ignore properties of objects that are not plain objects (like class instances, errors or functions). Those can still be matched by using their property name.

const target = { user: new User({ name: 'Alice' }) }
list(target, 'user.*') // []
list(target, 'user.*', { classes: true }) // ['Alice']

inherited

Methods: all
Type: boolean
Default: false

By default, wildcards and regexps ignore properties that are either inherited or not enumerable. Those can still be matched by using their property name.

When true, inherited properties are not ignored, but not enumerable ones still are.

Related projects

Support

For any question, don't hesitate to submit an issue on GitHub.

Everyone is welcome regardless of personal background. We enforce a Code of conduct in order to promote a positive and inclusive environment.

Contributing

This project was made with ❀️ . The simplest way to give back is by starring and sharing it online.

If the documentation is unclear or has a typo, please click on the page's Edit button (pencil icon) and suggest a correction.

If you would like to help us fix a bug or add a new feature, please check our guidelines. Pull requests are welcome!

You might also like...

Smoothly interpolate between variations of SVG paths.

svg-path-morph A simple library for morphing between variations of SVG paths. Use svg-path-morph to smoothly morph between X variations of the same SV

Jan 3, 2023

A plugin that can find the paths between two notes. Not sure who will want to use it...

Obsidian Path Finder Plugin Install BRAT Install Obsidian42-BRAT plugin. Click Add new beta plugin and fill in jerrywcy/obsidian-path-finder. Activate

Dec 31, 2022

A webpack plugin to enforce case-sensitive paths when resolving module

@umijs/case-sensitive-paths-webpack-plugin A webpack plugin to enforce case-sensitive paths when resolving module, similar to the well-known case-sens

Jul 25, 2022

A jQuery plug-in to notify you of CSS, Attribute or Property changes in an element

selectWatch.js jQuery plug-in gives an opportunity to monitor changes of DOM element's CSS styles, attributes, properties, input element or select ele

Oct 28, 2022

πŸ“ƒ Typed primitives for Typescript to work with file paths

typed-file-system-path typed-file-system-path takes inspiration from Path.swift in swift-tools-support-core and provides typed primitives to work with

Dec 15, 2022

Keep the type of storage value unchanged and change array and object directly. Supports listening to the changes and setting expires.

proxy-web-storage A more convenient way to use storage through proxy. try it on codesandbox. Install npm i proxy-web-storage Features Base Keep the ty

Dec 25, 2022

Simple utils to pack arrays, objects and strings to a flat object (and back again).

packrup Simple utils to pack (and unpack) arrays and strings to a flat object. Status: In Development Please report any issues πŸ› Made possible by my

Dec 23, 2022

Serialize and deserialize any object and all of its references πŸ₯£

Super Cereal πŸ₯£ Serialize and deserialize any object and all of its references. Supports: Class (with inheritance set-up) Object Array Function Map Se

Dec 24, 2022

Serialize and deserialize any object and all of its references πŸ₯£

Super Cereal πŸ₯£ Serialize and deserialize any object and all of its references. Supports: Class (with inheritance set-up) Object Array Function Map Se

Nov 1, 2022
Comments
  • Feature request: Convert an Object into dot-delimited paths

    Feature request: Convert an Object into dot-delimited paths

    Guidelines

    • [X] Please search other issues to make sure this feature has not already been requested.

    Which problem is this feature request solving?

    Thanks for the work, very useful library!

    One thing I’d love to see added is the ability to convert an Object into dot-delimited paths.

    Describe the solution you'd like

    Example:

    dotate({
      username: 'johndoe',
      profile: { image: 'avatar.jpg', verified: true, views: 5 },
      tags: ['foo', 'bar']
    }, { keepArrays })
    

    Result with keepArrays: true:

    {
      "username": "johndoe",
      "profile.image": "avatar.jpg",
      "profile.verified": true,
      "profile.views": 5,
      "tags": ["foo", "bar"]
    }
    

    Result with keepArrays: false:

    {
      "username": "johndoe",
      "profile.image": "avatar.jpg",
      "profile.verified": true,
      "profile.views": 5,
      "tags.0": "foo",
      "tags.1": "bar"
    }
    

    Pull request (optional)

    • [ ] I can submit a pull request.
    enhancement 
    opened by maoosi 5
  • Bump decode-uri-component from 0.2.0 to 0.2.2

    Bump decode-uri-component from 0.2.0 to 0.2.2

    Bumps decode-uri-component from 0.2.0 to 0.2.2.

    Release notes

    Sourced from decode-uri-component's releases.

    v0.2.2

    • Prevent overwriting previously decoded tokens 980e0bf

    https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.1...v0.2.2

    v0.2.1

    • Switch to GitHub workflows 76abc93
    • Fix issue where decode throws - fixes #6 746ca5d
    • Update license (#1) 486d7e2
    • Tidelift tasks a650457
    • Meta tweaks 66e1c28

    https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.1

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
Releases(3.6.0)
  • 3.6.0(Dec 11, 2022)

  • 3.5.0(Nov 11, 2022)

  • 3.4.0(Nov 7, 2022)

  • 3.3.0(Oct 26, 2022)

  • 3.2.0(Oct 8, 2022)

  • 3.1.0(Aug 16, 2022)

  • 3.0.0(May 9, 2022)

  • 2.4.0(Apr 6, 2022)

    • Fix code duplication (9fb4ca9)
    • Rename file (50e7b4c)
    • Refactoring (6a09342)
    • Refactoring (1013bbf)
    • Improve performance (e796260)
    • Improve performance of list() with paths (b18114c)
    • Refactoring (d8ee2b2)
    • Improve performance (abd2397)
    • Improve comments (6f4205f)
    • Add one test (bdcc9eb)
    • Refactoring (0376af0)
    • Fix comment (0f18992)
    • Improve performance of paths (93011e8)
    • Refactoring (ad4166d)
    • Start optimized path (5522d27)
    • Split files (b0cc736)
    • Start distinguishing paths and not paths (f00d8c9)
    • Upgrade wild-wild-parser 2.2.0 -> 2.3.0 (f06d9bd)
    Source code(tar.gz)
    Source code(zip)
  • 2.3.0(Apr 6, 2022)

  • 2.2.0(Apr 5, 2022)

  • 2.1.0(Apr 5, 2022)

    • Upgrade wild-wild-parser 2.0.0 -> 2.1.0 (a98b04e)
    • Add documentation to types (b8d548f)
    • Update README (120c892)
    • Update README (72ab3fc)
    • Update README (8df0add)
    Source code(tar.gz)
    Source code(zip)
  • 2.0.0(Apr 4, 2022)

    • Upgrade wild-wild-parser 1.1.0 -> 2.0.0 (d4bdca5)
    • Improve description (9d2f50d)
    • Fix links (84414db)
    • Fix capitalization (38a37d0)
    • Add emoji (3e4fa11)
    • Add emoji (c3a10e3)
    • Add emoji (329c093)
    • Increase logo size (996fae8)
    • Add logo (68f1b2a)
    • Update README (2bb96ea)
    • Update README (cccd6cd)
    • Update README (e8a7a6a)
    • Update README (34c8f47)
    • Update README (9d22387)
    • Update README (a05a510)
    • Remove examples (aa8528a)
    • Update README (496761d)
    • Update README (8505207)
    • Allow missing with get() (c69385c)
    • Update README (3486999)
    • Update README (45e381b)
    • Update README (908e441)
    • Update README (0751d7c)
    • Update README (2045599)
    • Update README (ebad9ab)
    • Update README (181acd3)
    • Update README (ced29db)
    • Update README (67128a2)
    • Update README (e7f499d)
    • Update README (02faff1)
    • Update README (87a15fe)
    • Update README (a07f44c)
    • Update README (4b5ac09)
    • Update README (8f0c049)
    • Update README (899f659)
    • Update README (6502bf0)
    • Update README (c0f431d)
    • Update README (1df1319)
    • Update README (0ece08b)
    • Comment demo (9a9ba74)
    • Update README (eebeaf9)
    • Improve types (7316d18)
    • Add spaces (e6df892)
    • Improve README (4c5499e)
    • Improve README (dd86279)
    • Update README (177c040)
    • Add spaces (0e35f4b)
    • Improve README (00a5019)
    • Update README (e8ab2b9)
    • Update README (bf901d0)
    • Add more examples (b1f4449)
    • Start documenting (89500bf)
    Source code(tar.gz)
    Source code(zip)
  • 1.1.0(Apr 2, 2022)

    • Add more types (68aa24f)
    • Add more types (3a505d2)
    • Add more types (e36eb85)
    • Add more types (5b6f9c7)
    • Add more types (9aa46ad)
    • Add more types (5d5760f)
    • Add more types (6528165)
    • Fix name (2ff02b6)
    • Upgrade wild-wild-parser 1.0.1 -> 1.1.0 (a517304)
    Source code(tar.gz)
    Source code(zip)
  • 1.0.2(Apr 1, 2022)

  • 1.0.1(Mar 31, 2022)

    • Export isObject() (bbe21f7)
    • Fix typo (c0ae140)
    • Add more tests (f76ad4d)
    • Allow recursing over function objects (e44a1de)
    • Fix code duplication (08d8ed3)
    • Fix code duplication (56ede7c)
    • Refactor tests (30b7afb)
    • Move lines (60d34f8)
    • Refactor tests (612370c)
    • Refactor tests (f284777)
    • Refactor tests (577ce5f)
    • Refactor tests (9fb861f)
    • Refactor test helper (f02bfd3)
    • Refactor tests (68ff31d)
    • Refactor tests (c707a70)
    • Refactor tests (9031245)
    • Refactor tests (b734007)
    • Refactoring (3a09051)
    • Refactor tests (be9fb8c)
    • Refactor tests (29e04c9)
    • Refactor tests (19a4b22)
    • Fix code duplication (dcf3e30)
    • Fix code duplication (a484ea9)
    • Fix code duplication (1515245)
    • Fix code duplication (5cb4bd9)
    • Fix code duplication (3b071e0)
    • Fix linting (4f6900b)
    • Fix code duplication (3460597)
    • Fix linting (79a8ead)
    • Fix linting (297e491)
    • Refactor tests (f26ad22)
    • Refactor tests (c73d7cb)
    • Fix code duplication (557028d)
    • Simplify code (4d6ed2c)
    • Fix deletions (9f61a51)
    • Fix inherited option (c995a0a)
    • Refactoring (bce4639)
    • Add comment (9b2dafa)
    • Revert "Remove inherited for set|remove()" (279de57)
    • Simplify logic (a5cebe9)
    • Remove inherited for set|remove() (fc99f2d)
    • Add more tests (0c5a64b)
    • Add more tests (136c946)
    • Renaming (32f81b1)
    • Add more tests (7263305)
    • Improve test (720e5bf)
    • Add more tests (cc05f4f)
    • Add more tests (8d45445)
    • Fix mutation bug (c90113f)
    • Add more tests (9b57631)
    • Add more tests (3f680ce)
    • add more tests (be7b233)
    • Add more tests (694fdf7)
    • Add more tests (275fec4)
    • Add more tests (3d4f74d)
    • Add more tests (4f984bf)
    • Add more tests (c53a93b)
    • Add more tests (0ef8b73)
    • Add test (9844c3f)
    • Add test (994b90e)
    • Fix test names (31389cf)
    • Rename file (b3302e5)
    • Move file (46d6726)
    • Split file (0e44739)
    • Split file (331eafe)
    • Add tests (32967aa)
    • Split file (1dd15ab)
    • Split file (90905ed)
    • Rename file (8780cb2)
    • Split file (14ff755)
    • Split file (e908372)
    • Split file (1225ff0)
    • Split file (d9c3901)
    • Add test helper (49a0fd1)
    • Add more tests (92ec039)
    • Add more tests (3405f53)
    • Add more tests (1776516)
    • Add more tests (663f50c)
    • Fix test (9d89b13)
    • Fix test (77aaad7)
    • Add more tests (c947184)
    • Add more tests (8b5e444)
    • Add more tests (e6847db)
    • Add more tests (8e5ba37)
    • Move lines (5254a90)
    • Add comments (9798c03)
    • Add more tests (56200de)
    • Add tests (f984058)
    • Add more tests (82d32b5)
    • Fix tests (ac0d87b)
    • Add more tests (23cf518)
    • Fix slice (966d1b5)
    • Add more tests (f5a18bb)
    • Fix linting (9c90a9e)
    • Add more tests (dbb3c88)
    • Add more tests (b4267ee)
    • Fix undefined values (e4c1aaf)
    • Add more tests (a839627)
    • Add more tests (bff9252)
    • Add more tests (5d4f5a7)
    • Add more tests (da23080)
    • Add more tests (bc70862)
    • Add more tests (e7e1b04)
    • Add more tests (b9805d3)
    • Add more tests (057e4b6)
    • Add more tests (43876ae)
    • Add more tests (ffc9381)
    • Add more tests (b1e4d2f)
    • Add more tests (a11e98b)
    • Add more tests (7208e6e)
    • Add more tests (3da37ce)
    • Add more tests (e348cef)
    • Add more tests (8c9dd8c)
    • Add more tests (b7ddaa0)
    • Initial commit (5fb2c1d)
    Source code(tar.gz)
    Source code(zip)
Owner
ehmicky
Node.js back-end developer
ehmicky
Given an object and a property, replaces a property descriptor (or deletes it), and returns a thunk to restore it.

Given an object and a property, replaces a property descriptor (or deletes it), and returns a thunk to restore it.

Jordan Harband 7 Apr 20, 2022
An algorithm for fast 2D pattern-matching with wildcards.

pattern-match-2d.js An algorithm for fast 2D pattern-matching with wildcards, with a demo app inspired by MarkovJunior (by Maxim Gumin). The algorithm

null 16 Nov 5, 2022
Types generator will help user to create TS types from JSON. Just paste your single object JSON the Types generator will auto-generate the interfaces for you. You can give a name for the root object

Types generator Types generator is a utility tool that will help User to create TS Interfaces from JSON. All you have to do is paste your single objec

Vineeth.TR 16 Dec 6, 2022
To keep online organized data and be able to add listeners in certain paths by socket.io and http clients

The purpose of this project is to create a state machine server to keep organized data and be able to add listeners with socket.io in specific paths and in addition to providing a possible form of messages between socket.io clients.

Manga 3 Mar 19, 2022
Calculate the price range for property advertised on Domain and Real Estate.

Property Seeker Calculate the price range for property advertised on Domain and Real Estate. Install Chrome Firefox Edge Privacy All searches are perf

null 42 Dec 27, 2022
Convert your SVG file directly to Flutter paths and prevent all the messing with bezier curves.

svg-to-flutter-path-converter Convert your SVG file directly to Flutter paths and prevent all the messing with bezier curves. Flutter Clutter The tool

null 30 Jan 2, 2023
Explore Alveus Sanctuary with an interactive map and find out more about the different buildings on the property.

Alveus Sanctuary Interactive Map Explore Alveus Sanctuary with an interactive map and find out more about the different buildings on the property. htt

Matt Cowley 3 Aug 16, 2022
Adds a handy $parent magic property to your Alpine components.

✨ Help support the maintenance of this package by sponsoring me. Alpine $parent Access parent components using a handy $parent magic variable. This pa

Ryan Chandler 10 Aug 29, 2022
A plugin that provides utilities for animation property.

tailwindcss-animation-property A plugin that provides utilities for animation property. Not only does the plugin provide the usual animation propertie

ZXT 12 Sep 23, 2022
Generate fluid, custom property based design systems on the fly β€” entirely based on Utopia

Fluid Design Systems With Netlify On-demand Builders A proof of concept demonstrating how Netlify on-demand builders can help generate fluid, custom p

George Francis 53 Jan 5, 2023