Problem: the hexagonal refactor churns the backend tree for nine more phases; the UI delivery stack (web/ SPA, cmd/desktop Wails wrapper, compose/web image) must move to its own repo first so doc/layout rewrites land once on a backend-only tree. Change: - New repo git.hubris.network/dtoro/oikos-web (v0.33.0): web/, desktop/ (updateURL repointed to oikos-web releases), compose/, own CI (web + desktop jobs), own deploy script (CI-green gate, TOCTOU guard, version-tagged images, prune-to-3), own webhook receiver on :9798 + launchd unit, own compose project publishing the same 8091:80. - Cutover executed on mac-mini in order: oikos stack's web service stopped+removed, oikos-web project brought up on 8091; outer Caddy untouched (targets the published port) — serving + Authentik flow + /wails 404 quirk verified post-cutover. - Stripped from oikos: web/, cmd/desktop/, compose/web/, desktop CI workflow, ci.yml web job, Makefile ui/desktop/desktop-package/install targets, the compose web service, oikos-web from deploy.sh's fallback prune list; wails + go-keyring dropped from go.mod, vendor synced. - README / CONTRIBUTING / AGENTS.md / .agents dev+operations docs now point at the new repo; mbse + mascot design docs carry a path note. Risk: production SPA serving depends on the new pipeline now; rollback is versioned-image re-up of the old web service from a pre-split checkout (port 8091). Desktop builds installed before the split still check dtoro/oikos releases — one manual reinstall, noted in the oikos-web release notes. Verification: go vet, make test (race), make generate-check, golangci (no new findings; baseline down 400→365); post-cutover curls — localhost:8091 200, /wails/runtime.js 404, outer Caddy 302 Authentik.
113 lines
4.4 KiB
Markdown
113 lines
4.4 KiB
Markdown
# dequal [](https://github.com/lukeed/dequal/actions)
|
||
|
||
> A tiny (304B to 489B) utility to check for deep equality
|
||
|
||
This module supports comparison of all types, including `Function`, `RegExp`, `Date`, `Set`, `Map`, `TypedArray`s, `DataView`, `null`, `undefined`, and `NaN` values. Complex values (eg, Objects, Arrays, Sets, Maps, etc) are traversed recursively.
|
||
|
||
> **Important:**
|
||
> * key order **within Objects** does not matter
|
||
> * value order **within Arrays** _does_ matter
|
||
> * values **within Sets and Maps** use value equality
|
||
> * keys **within Maps** use value equality
|
||
|
||
|
||
## Install
|
||
|
||
```
|
||
$ npm install --save dequal
|
||
```
|
||
|
||
## Modes
|
||
|
||
There are two "versions" of `dequal` available:
|
||
|
||
#### `dequal`
|
||
> **Size (gzip):** 489 bytes<br>
|
||
> **Availability:** [CommonJS](https://unpkg.com/dequal/dist/index.js), [ES Module](https://unpkg.com/dequal/dist/index.mjs), [UMD](https://unpkg.com/dequal/dist/index.min.js)
|
||
|
||
#### `dequal/lite`
|
||
> **Size (gzip):** 304 bytes<br>
|
||
> **Availability:** [CommonJS](https://unpkg.com/dequal/lite/index.js), [ES Module](https://unpkg.com/dequal/lite/index.mjs)
|
||
|
||
| | IE9+ | Number | String | Date | RegExp | Object | Array | Class | Set | Map | ArrayBuffer | [TypedArray](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray#TypedArray_objects) | [DataView](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView) |
|
||
|-|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|
||
| `dequal` | :x: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
|
||
| `dequal/lite` | :+1: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | :x: | :x: | :x: |
|
||
|
||
> <sup>**Note:** Table scrolls horizontally!</sup>
|
||
|
||
## Usage
|
||
|
||
```js
|
||
import { dequal } from 'dequal';
|
||
|
||
dequal(1, 1); //=> true
|
||
dequal({}, {}); //=> true
|
||
dequal('foo', 'foo'); //=> true
|
||
dequal([1, 2, 3], [1, 2, 3]); //=> true
|
||
dequal(dequal, dequal); //=> true
|
||
dequal(/foo/, /foo/); //=> true
|
||
dequal(null, null); //=> true
|
||
dequal(NaN, NaN); //=> true
|
||
dequal([], []); //=> true
|
||
dequal(
|
||
[{ a:1 }, [{ b:{ c:[1] } }]],
|
||
[{ a:1 }, [{ b:{ c:[1] } }]]
|
||
); //=> true
|
||
|
||
dequal(1, '1'); //=> false
|
||
dequal(null, undefined); //=> false
|
||
dequal({ a:1, b:[2,3] }, { a:1, b:[2,5] }); //=> false
|
||
dequal(/foo/i, /bar/g); //=> false
|
||
```
|
||
|
||
## API
|
||
|
||
### dequal(foo, bar)
|
||
Returns: `Boolean`
|
||
|
||
Both `foo` and `bar` can be of any type.<br>
|
||
A `Boolean` is returned indicating if the two were deeply equal.
|
||
|
||
|
||
## Benchmarks
|
||
|
||
> Running Node v10.13.0
|
||
|
||
The benchmarks can be found in the [`/bench`](/bench) directory. They are separated into two categories:
|
||
|
||
* `basic` – compares an object comprised of `String`, `Number`, `Date`, `Array`, and `Object` values.
|
||
* `complex` – like `basic`, but adds `RegExp`, `Map`, `Set`, and `Uint8Array` values.
|
||
|
||
> **Note:** Only candidates that pass validation step(s) are listed. <br>For example, `fast-deep-equal/es6` handles `Set` and `Map` values, but uses _referential equality_ while those listed use _value equality_.
|
||
|
||
```
|
||
Load times:
|
||
assert 0.109ms
|
||
util 0.006ms
|
||
fast-deep-equal 0.479ms
|
||
lodash/isequal 22.826ms
|
||
nano-equal 0.417ms
|
||
dequal 0.396ms
|
||
dequal/lite 0.264ms
|
||
|
||
Benchmark :: basic
|
||
assert.deepStrictEqual x 325,262 ops/sec ±0.57% (94 runs sampled)
|
||
util.isDeepStrictEqual x 318,812 ops/sec ±0.87% (94 runs sampled)
|
||
fast-deep-equal x 1,332,393 ops/sec ±0.36% (93 runs sampled)
|
||
lodash.isEqual x 269,129 ops/sec ±0.59% (95 runs sampled)
|
||
nano-equal x 1,122,053 ops/sec ±0.36% (96 runs sampled)
|
||
dequal/lite x 1,700,972 ops/sec ±0.31% (94 runs sampled)
|
||
dequal x 1,698,972 ops/sec ±0.63% (97 runs sampled)
|
||
|
||
Benchmark :: complex
|
||
assert.deepStrictEqual x 124,518 ops/sec ±0.64% (96 runs sampled)
|
||
util.isDeepStrictEqual x 125,113 ops/sec ±0.24% (96 runs sampled)
|
||
lodash.isEqual x 58,677 ops/sec ±0.49% (96 runs sampled)
|
||
dequal x 345,386 ops/sec ±0.27% (96 runs sampled)
|
||
```
|
||
|
||
## License
|
||
|
||
MIT © [Luke Edwards](https://lukeed.com)
|