Files
start-os/sdk/base/lib/util/deepMerge.ts
Aiden McClelland db0695126f Refactor/actions (#2733)
* store, properties, manifest

* interfaces

* init and backups

* fix init and backups

* file models

* more versions

* dependencies

* config except dynamic types

* clean up config

* remove disabled from non-dynamic vaues

* actions

* standardize example code block formats

* wip: actions refactor

Co-authored-by: Jade <Blu-J@users.noreply.github.com>

* commit types

* fix types

* update types

* update action request type

* update apis

* add description to actionrequest

* clean up imports

* revert package json

* chore: Remove the recursive to the index

* chore: Remove the other thing I was testing

* flatten action requests

* update container runtime with new config paradigm

* new actions strategy

* seems to be working

* misc backend fixes

* fix fe bugs

* only show breakages if breakages

* only show success modal if result

* don't panic on failed removal

* hide config from actions page

* polyfill autoconfig

* use metadata strategy for actions instead of prev

* misc fixes

* chore: split the sdk into 2 libs (#2736)

* follow sideload progress (#2718)

* follow sideload progress

* small bugfix

* shareReplay with no refcount false

* don't wrap sideload progress in RPCResult

* dont present toast

---------

Co-authored-by: Aiden McClelland <me@drbonez.dev>

* chore: Add the initial of the creation of the two sdk

* chore: Add in the baseDist

* chore: Add in the baseDist

* chore: Get the web and the runtime-container running

* chore: Remove the empty file

* chore: Fix it so the container-runtime works

---------

Co-authored-by: Matt Hill <MattDHill@users.noreply.github.com>
Co-authored-by: Aiden McClelland <me@drbonez.dev>

* misc fixes

* update todos

* minor clean up

* fix link script

* update node version in CI test

* fix node version syntax in ci build

* wip: fixing callbacks

* fix sdk makefile dependencies

* add support for const outside of main

* update apis

* don't panic!

* Chore: Capture weird case on rpc, and log that

* fix procedure id issue

* pass input value for dep auto config

* handle disabled and warning for actions

* chore: Fix for link not having node_modules

* sdk fixes

* fix build

* fix build

* fix build

---------

Co-authored-by: Matt Hill <mattnine@protonmail.com>
Co-authored-by: Jade <Blu-J@users.noreply.github.com>
Co-authored-by: J H <dragondef@gmail.com>
Co-authored-by: Jade <2364004+Blu-J@users.noreply.github.com>
Co-authored-by: Matt Hill <MattDHill@users.noreply.github.com>
2024-09-25 16:12:52 -06:00

87 lines
2.2 KiB
TypeScript

export function partialDiff<T>(
prev: T,
next: T,
): { diff: Partial<T> } | undefined {
if (prev === next) {
return
} else if (Array.isArray(prev) && Array.isArray(next)) {
const res = { diff: [] as any[] }
for (let newItem of next) {
let anyEq = false
for (let oldItem of prev) {
if (!partialDiff(oldItem, newItem)) {
anyEq = true
break
}
}
if (!anyEq) {
res.diff.push(newItem)
}
}
if (res.diff.length) {
return res as any
} else {
return
}
} else if (typeof prev === "object" && typeof next === "object") {
if (prev === null) {
return { diff: next }
}
if (next === null) return
const res = { diff: {} as Record<keyof T, any> }
for (let key in next) {
const diff = partialDiff(prev[key], next[key])
if (diff) {
res.diff[key] = diff.diff
}
}
if (Object.keys(res.diff).length) {
return res
} else {
return
}
} else {
return { diff: next }
}
}
export function deepMerge(...args: unknown[]): unknown {
const lastItem = (args as any)[args.length - 1]
if (typeof lastItem !== "object" || !lastItem) return lastItem
if (Array.isArray(lastItem))
return deepMergeList(
...(args.filter((x) => Array.isArray(x)) as unknown[][]),
)
return deepMergeObject(
...(args.filter(
(x) => typeof x === "object" && x && !Array.isArray(x),
) as object[]),
)
}
function deepMergeList(...args: unknown[][]): unknown[] {
const res: unknown[] = []
for (let arg of args) {
for (let item of arg) {
if (!res.some((x) => !partialDiff(x, item))) {
res.push(item)
}
}
}
return res
}
function deepMergeObject(...args: object[]): object {
const lastItem = (args as any)[args.length - 1]
if (args.length === 0) return lastItem as any
if (args.length === 1) args.unshift({})
const allKeys = new Set(args.flatMap((x) => Object.keys(x)))
for (const key of allKeys) {
const filteredValues = args.flatMap((x) =>
key in x ? [(x as any)[key]] : [],
)
;(args as any)[0][key] = deepMerge(...filteredValues)
}
return args[0] as any
}