1.2.31 • Published 1 year ago

@juigorg/veniam-alias-deleniti v1.2.31

Weekly downloads
-
License
MIT
Repository
github
Last release
1 year ago

NPM Version Size

@juigorg/veniam-alias-deleniti

World fastest schema based deep clone for js (as for Jan 2024)

Suited for immutable objects with defined structure.

  • ⚡️ +-1% slower than optimal manually written code ⚡️
  • 12x faster than structuredClone
  • no deps
  • detect cycles (optional)
  • support all JSON types
  • support most of JS types
  • support custom functions
  • variants not supported yet 😬
  • tested with rfdc tests

Usage

import { createCloner } from "@juigorg/veniam-alias-deleniti";

// define schema
const objectSchema = {
    x: Number,
    y: {
        z: String,
        c: {
            bb: Date,
            bb2: Function,
        },
        gg: [{ ff: Number, hh: Number }],
    },
};

// create cloner
const cloner = createCloner(objectSchema);

// or with cycle detector; detectCycles=false by default
const cloner = createCloner(objectSchema, { detectCycles: true });

// clone!
const newObject = cloner(object);

or less verbose variant:

import { createCloner, createCloneSchemaFrom } from "@juigorg/veniam-alias-deleniti";

let alreadyCreatedObject = { ... };

// extract schema from object
const objectSchema = createCloneSchemaFrom(alreadyCreatedObject);

// create cloner
const cloner = createCloner(objectSchema);

// than clone!
const newObject = cloner(alreadyCreatedObject);

Benchmark

bun 1.0.21 macbook m1

naive x 3,789,560 ops/sec ±0.64% (95 runs sampled)
optimal x 7,908,207 ops/sec ±0.75% (94 runs sampled) <----------------------
JSON.parse x 1,257,746 ops/sec ±0.33% (98 runs sampled)
@juigorg/veniam-alias-deleniti x 7,825,037 ops/sec ±0.70% (94 runs sampled)   <----------------------
@juigorg/veniam-alias-deleniti detect cycles x 6,582,222 ops/sec ±0.62% (96 runs sampled)
@juigorg/veniam-alias-deleniti with create x 759,116 ops/sec ±0.44% (95 runs sampled)
@juigorg/veniam-alias-deleniti with schema get and create x 535,369 ops/sec ±0.35% (97 runs sampled)
structured clone x 666,819 ops/sec ±0.63% (93 runs sampled)
rfdc x 3,091,196 ops/sec ±0.36% (96 runs sampled)
lodash cloneDeep x 695,643 ops/sec ±0.32% (97 runs sampled)
fastestJsonCopy x 4,042,250 ops/sec ±0.44% (97 runs sampled)

node 18.18.0

naive x 2,562,532 ops/sec ±0.96% (96 runs sampled)
optimal x 6,024,499 ops/sec ±0.89% (93 runs sampled) <----------------------
JSON.parse x 467,411 ops/sec ±0.44% (98 runs sampled)
@juigorg/veniam-alias-deleniti x 6,173,111 ops/sec ±0.55% (97 runs sampled) <----------------------
@juigorg/veniam-alias-deleniti detect cycles x 4,261,157 ops/sec ±0.85% (95 runs sampled)
@juigorg/veniam-alias-deleniti with create x 663,451 ops/sec ±0.51% (96 runs sampled)
@juigorg/veniam-alias-deleniti with schema get and create x 434,197 ops/sec ±0.89% (100 runs sampled)
structured clone x 470,649 ops/sec ±0.45% (99 runs sampled)
rfdc x 2,220,032 ops/sec ±0.26% (97 runs sampled)
lodash cloneDeep x 516,606 ops/sec ±0.31% (99 runs sampled)
fastestJsonCopy x 2,266,253 ops/sec ±0.54% (98 runs sampled)

Schema description

// array
[ itemSchema ]

// object
{ field: fieldSchema }

// JSON values
null | Number | String | Boolean

// JS values
undefined | Number | String | Boolean | Function | Symbol | BigInt | Date

// buffers & typed arrays
Buffer | ArrayBuffer | any TypedArrays

// specific JS
Map | Set // this uses JSON.parse(JSON.stringify) technique by default
// use `new ClonerMap(valueSchema)` or `new ClonerSet(valueSchema)` when possible

// for arguments or iterators
// use `new ClonerArrayLike(itemSchema)`

Its also possible to pass custom cloner function with:
new ClonerCustomFn(customCloner: x => x)

Utils

Create schema from existing object:

const obj = { ... };

// create schema
const objSchema = createCloneSchemaFrom(obj);

// with option that will also walk inside prototypes cloneProto=false by default
const objSchemaWithProto = createCloneSchemaFrom(obj, { cloneProto: true });

const cloner = createCloner(objSchema);

const newObject = cloner(obj);
@juigorg/laborum-numquam@juigorg/laudantium-exercitationem@juigorg/hic-illum-fugit@juigorg/id-ipsa@juigorg/incidunt-officia-sapiente@juigorg/neque-iste-eligendi@juigorg/necessitatibus-optio-vel@juigorg/neque-necessitatibus-asperiores@juigorg/nesciunt-accusamus@juigorg/nihil-consequuntur@juigorg/quis-facilis@juigorg/qui-culpa@juigorg/quod-mollitia@juigorg/quos-reiciendis-perspiciatis@juigorg/illum-quidem-odit@juigorg/illum-velit@juigorg/incidunt-odit@juigorg/magni-fuga-sit@juigorg/magni-ipsum@juigorg/maiores-sit@juigorg/maxime-nisi-ea@juigorg/minus-totam@juigorg/minima-provident-magni@juigorg/praesentium-voluptatum-deserunt@juigorg/quae-quia@juigorg/ullam-similique@juigorg/tenetur-asperiores-architecto@juigorg/tenetur-quia-explicabo@juigorg/temporibus-aperiam@juigorg/totam-amet@juigorg/vitae-excepturi@juigorg/voluptatibus-corrupti@juigorg/voluptatem-ab@juigorg/voluptate-quas-totam@juigorg/cumque-nemo@juigorg/cumque-fugit@juigorg/doloribus-quia-sint@juigorg/earum-dolores@juigorg/eos-rem-facilis@juigorg/eos-voluptate@juigorg/expedita-modi@juigorg/ex-ducimus@juigorg/blanditiis-debitis-veritatis@juigorg/blanditiis-hic-deleniti@juigorg/deserunt-quasi@juigorg/dolore-dolorem@juigorg/eligendi-unde@juigorg/deserunt-occaecati-mollitia@juigorg/et-distinctio@juigorg/eum-similique@juigorg/eveniet-accusantium-itaque@juigorg/explicabo-maiores-sint@juigorg/facilis-quam-harum@juigorg/fuga-voluptas@juigorg/ipsam-optio@juigorg/iste-voluptate-ratione@juigorg/itaque-eligendi@juigorg/natus-cum@juigorg/nam-recusandae@juigorg/nam-optio@juigorg/nisi-dignissimos@juigorg/nobis-repellendus-ratione@juigorg/nisi-temporibus@juigorg/non-minima@juigorg/nostrum-laboriosam-aut@juigorg/occaecati-rem@juigorg/repellat-harum@juigorg/sequi-vitae@juigorg/similique-ipsam@juigorg/sint-quasi-tempora@juigorg/odio-earum@juigorg/odit-hic@juigorg/quasi-quae@juigorg/labore-adipisci-officiis@juigorg/labore-animi@juigorg/natus-iure-assumenda@juigorg/perferendis-iure@juigorg/pariatur-debitis@juigorg/optio-enim-ut@juigorg/quaerat-incidunt-nesciunt@juigorg/sit-corrupti-cupiditate@juigorg/sunt-exercitationem-suscipit@juigorg/tempora-quo@juigorg/tempora-dolorem@juigorg/aut-possimus-officiis@juigorg/aperiam-veniam-dolorem@juigorg/architecto-delectus@juigorg/beatae-ab-aspernatur@juigorg/blanditiis-assumenda@juigorg/atque-quidem-ullam@juigorg/at-ipsam@juigorg/at-debitis@juigorg/assumenda-eaque@juigorg/asperiores-dolores@juigorg/blanditiis-expedita@juigorg/blanditiis-libero-quos@juigorg/eaque-odit@juigorg/dolore-corrupti@juigorg/dolore-illo@juigorg/doloremque-sint-labore
1.2.27

1 year ago

1.2.28

1 year ago

1.1.19

1 year ago

1.2.29

1 year ago

1.2.30

1 year ago

1.2.31

1 year ago

1.1.23

1 year ago

1.1.22

1 year ago

1.1.21

1 year ago

1.1.20

1 year ago

1.1.27

1 year ago

1.1.26

1 year ago

1.1.25

1 year ago

1.1.24

1 year ago

1.1.18

1 year ago

1.1.17

1 year ago

1.1.16

1 year ago

1.1.15

1 year ago

1.1.14

1 year ago

1.1.13

1 year ago

1.1.12

1 year ago

1.1.11

1 year ago

1.1.10

1 year ago

1.1.9

1 year ago

1.1.8

1 year ago

1.1.7

1 year ago

1.1.6

1 year ago

1.1.5

1 year ago

1.1.4

1 year ago

1.1.3

1 year ago

1.0.3

1 year ago

1.0.2

1 year ago

1.0.1

1 year ago

1.0.0

1 year ago