structured-outputs 0.1.0-beta.2 → 0.1.0-beta.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +77 -6
- package/esm/ResponseFormat.js +33 -5
- package/esm/ResponseFormat.js.map +1 -1
- package/esm/Tool.js +17 -0
- package/esm/Tool.js.map +1 -0
- package/esm/_dnt.polyfills.js +16 -0
- package/esm/_dnt.polyfills.js.map +1 -0
- package/esm/_dnt.shims.js +58 -0
- package/esm/_dnt.shims.js.map +1 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/almost_equals.js +47 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/almost_equals.js.map +1 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/array_includes.js +47 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/array_includes.js.map +1 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/assert.js +23 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/assert.js.map +1 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/assertion_error.js +31 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/assertion_error.js.map +1 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/equal.js +184 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/equal.js.map +1 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/equals.js +46 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/equals.js.map +1 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/exists.js +28 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/exists.js.map +1 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/fail.js +21 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/fail.js.map +1 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/false.js +23 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/false.js.map +1 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/greater.js +30 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/greater.js.map +1 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/greater_or_equal.js +30 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/greater_or_equal.js.map +1 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/instance_of.js +53 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/instance_of.js.map +1 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/is_error.js +54 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/is_error.js.map +1 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/less.js +29 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/less.js.map +1 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/less_or_equal.js +30 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/less_or_equal.js.map +1 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/match.js +27 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/match.js.map +1 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/mod.js +46 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/mod.js.map +1 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/not_equals.js +33 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/not_equals.js.map +1 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/not_instance_of.js +30 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/not_instance_of.js.map +1 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/not_match.js +27 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/not_match.js.map +1 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/not_strict_equals.js +33 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/not_strict_equals.js.map +1 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/object_match.js +160 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/object_match.js.map +1 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/rejects.js +54 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/rejects.js.map +1 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/strict_equals.js +58 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/strict_equals.js.map +1 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/string_includes.js +27 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/string_includes.js.map +1 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/throws.js +45 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/throws.js.map +1 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/unimplemented.js +21 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/unimplemented.js.map +1 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/unreachable.js +21 -0
- package/esm/deps/jsr.io/@std/assert/1.0.8/unreachable.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/_utils.js +19 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/_utils.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/aggregate_groups.js +51 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/aggregate_groups.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/associate_by.js +45 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/associate_by.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/associate_with.js +41 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/associate_with.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/chunk.js +51 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/chunk.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/deep_merge.js +96 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/deep_merge.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/distinct.js +28 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/distinct.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/distinct_by.js +39 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/distinct_by.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/drop_last_while.js +33 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/drop_last_while.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/drop_while.js +34 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/drop_while.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/filter_entries.js +43 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/filter_entries.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/filter_keys.js +46 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/filter_keys.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/filter_values.js +46 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/filter_values.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/find_single.js +45 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/find_single.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/first_not_nullish_of.js +42 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/first_not_nullish_of.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/includes_value.js +39 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/includes_value.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/intersect.js +36 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/intersect.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/invert.js +29 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/invert.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/invert_by.js +46 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/invert_by.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/join_to_string.js +59 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/join_to_string.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/map_entries.js +47 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/map_entries.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/map_keys.js +42 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/map_keys.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/map_not_nullish.js +43 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/map_not_nullish.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/map_values.js +13 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/map_values.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/max_by.js +15 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/max_by.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/max_of.js +17 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/max_of.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/max_with.js +41 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/max_with.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/min_by.js +15 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/min_by.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/min_of.js +17 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/min_of.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/min_with.js +37 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/min_with.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/mod.js +75 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/mod.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/omit.js +29 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/omit.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/partition.js +16 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/partition.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/partition_entries.js +54 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/partition_entries.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/permutations.js +58 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/permutations.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/pick.js +33 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/pick.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/reduce_groups.js +40 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/reduce_groups.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/running_reduce.js +32 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/running_reduce.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/sample.js +35 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/sample.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/sliding_windows.js +57 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/sliding_windows.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/sort_by.js +30 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/sort_by.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/sum_of.js +37 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/sum_of.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/take_last_while.js +34 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/take_last_while.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/take_while.js +39 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/take_while.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/union.js +34 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/union.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/unzip.js +46 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/unzip.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/without_all.js +28 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/without_all.js.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/zip.js +43 -0
- package/esm/deps/jsr.io/@std/collections/1.0.9/zip.js.map +1 -0
- package/esm/deps/jsr.io/@std/internal/1.0.5/build_message.js +111 -0
- package/esm/deps/jsr.io/@std/internal/1.0.5/build_message.js.map +1 -0
- package/esm/deps/jsr.io/@std/internal/1.0.5/diff.js +277 -0
- package/esm/deps/jsr.io/@std/internal/1.0.5/diff.js.map +1 -0
- package/esm/deps/jsr.io/@std/internal/1.0.5/diff_str.js +180 -0
- package/esm/deps/jsr.io/@std/internal/1.0.5/diff_str.js.map +1 -0
- package/esm/deps/jsr.io/@std/internal/1.0.5/format.js +38 -0
- package/esm/deps/jsr.io/@std/internal/1.0.5/format.js.map +1 -0
- package/esm/deps/jsr.io/@std/internal/1.0.5/styles.js +208 -0
- package/esm/deps/jsr.io/@std/internal/1.0.5/styles.js.map +1 -0
- package/esm/deps/jsr.io/@std/internal/1.0.5/types.js +3 -0
- package/esm/deps/jsr.io/@std/internal/1.0.5/types.js.map +1 -0
- package/esm/mod.js +3 -10
- package/esm/mod.js.map +1 -1
- package/esm/types/Ref.js +11 -0
- package/esm/types/Ref.js.map +1 -0
- package/esm/types/RootTy.js +19 -0
- package/esm/types/RootTy.js.map +1 -0
- package/esm/types/Ty.js +17 -0
- package/esm/types/Ty.js.map +1 -0
- package/esm/types/array.js +9 -0
- package/esm/types/array.js.map +1 -0
- package/esm/types/constant.js +8 -0
- package/esm/types/constant.js.map +1 -0
- package/esm/types/constantUnion.js +25 -0
- package/esm/types/constantUnion.js.map +1 -0
- package/esm/types/leaves.js +18 -0
- package/esm/types/leaves.js.map +1 -0
- package/esm/types/mod.js +11 -0
- package/esm/types/mod.js.map +1 -0
- package/esm/{object.js → types/object.js} +4 -4
- package/esm/types/object.js.map +1 -0
- package/esm/types/std/Option.js +9 -0
- package/esm/types/std/Option.js.map +1 -0
- package/esm/types/std/Wrapper.js +5 -0
- package/esm/types/std/Wrapper.js.map +1 -0
- package/esm/types/std/mod.js +3 -0
- package/esm/types/std/mod.js.map +1 -0
- package/esm/types/taggedUnion.js +20 -0
- package/esm/types/taggedUnion.js.map +1 -0
- package/esm/util/phantoms.js +4 -0
- package/esm/util/phantoms.js.map +1 -0
- package/esm/util/recombineTaggedTemplateArgs.js +4 -0
- package/esm/util/recombineTaggedTemplateArgs.js.map +1 -0
- package/package.json +10 -7
- package/src/ResponseFormat.ts +76 -25
- package/src/Tool.ts +38 -0
- package/src/_dnt.polyfills.ts +27 -0
- package/src/_dnt.shims.ts +60 -0
- package/src/deps/jsr.io/@std/assert/1.0.8/almost_equals.ts +55 -0
- package/src/deps/jsr.io/@std/assert/1.0.8/array_includes.ts +57 -0
- package/src/deps/jsr.io/@std/assert/1.0.8/assert.ts +23 -0
- package/src/deps/jsr.io/@std/assert/1.0.8/assertion_error.ts +31 -0
- package/src/deps/jsr.io/@std/assert/1.0.8/equal.ts +210 -0
- package/src/deps/jsr.io/@std/assert/1.0.8/equals.ts +52 -0
- package/src/deps/jsr.io/@std/assert/1.0.8/exists.ts +31 -0
- package/src/deps/jsr.io/@std/assert/1.0.8/fail.ts +21 -0
- package/src/deps/jsr.io/@std/assert/1.0.8/false.ts +26 -0
- package/src/deps/jsr.io/@std/assert/1.0.8/greater.ts +30 -0
- package/src/deps/jsr.io/@std/assert/1.0.8/greater_or_equal.ts +36 -0
- package/src/deps/jsr.io/@std/assert/1.0.8/instance_of.ts +64 -0
- package/src/deps/jsr.io/@std/assert/1.0.8/is_error.ts +65 -0
- package/src/deps/jsr.io/@std/assert/1.0.8/less.ts +29 -0
- package/src/deps/jsr.io/@std/assert/1.0.8/less_or_equal.ts +36 -0
- package/src/deps/jsr.io/@std/assert/1.0.8/match.ts +30 -0
- package/src/deps/jsr.io/@std/assert/1.0.8/mod.ts +47 -0
- package/src/deps/jsr.io/@std/assert/1.0.8/not_equals.ts +36 -0
- package/src/deps/jsr.io/@std/assert/1.0.8/not_instance_of.ts +33 -0
- package/src/deps/jsr.io/@std/assert/1.0.8/not_match.ts +30 -0
- package/src/deps/jsr.io/@std/assert/1.0.8/not_strict_equals.ts +42 -0
- package/src/deps/jsr.io/@std/assert/1.0.8/object_match.ts +202 -0
- package/src/deps/jsr.io/@std/assert/1.0.8/rejects.ts +123 -0
- package/src/deps/jsr.io/@std/assert/1.0.8/strict_equals.ts +67 -0
- package/src/deps/jsr.io/@std/assert/1.0.8/string_includes.ts +30 -0
- package/src/deps/jsr.io/@std/assert/1.0.8/throws.ts +111 -0
- package/src/deps/jsr.io/@std/assert/1.0.8/unimplemented.ts +21 -0
- package/src/deps/jsr.io/@std/assert/1.0.8/unreachable.ts +21 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/_utils.ts +26 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/aggregate_groups.ts +62 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/associate_by.ts +50 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/associate_with.ts +46 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/chunk.ts +56 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/deep_merge.ts +578 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/distinct.ts +29 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/distinct_by.ts +42 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/drop_last_while.ts +36 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/drop_while.ts +39 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/filter_entries.ts +48 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/filter_keys.ts +51 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/filter_values.ts +51 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/find_single.ts +48 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/first_not_nullish_of.ts +47 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/includes_value.ts +45 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/intersect.ts +35 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/invert.ts +38 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/invert_by.ts +56 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/join_to_string.ts +109 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/map_entries.ts +53 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/map_keys.ts +47 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/map_not_nullish.ts +49 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/map_values.ts +96 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/max_by.ts +153 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/max_of.ts +90 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/max_with.ts +46 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/min_by.ts +151 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/min_of.ts +90 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/min_with.ts +42 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/mod.ts +76 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/omit.ts +34 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/partition.ts +85 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/partition_entries.ts +58 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/permutations.ts +66 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/pick.ts +34 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/reduce_groups.ts +45 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/running_reduce.ts +38 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/sample.ts +36 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/sliding_windows.ts +86 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/sort_by.ts +219 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/sum_of.ts +42 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/take_last_while.ts +37 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/take_while.ts +44 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/union.ts +36 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/unzip.ts +50 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/without_all.ts +28 -0
- package/src/deps/jsr.io/@std/collections/1.0.9/zip.ts +49 -0
- package/src/deps/jsr.io/@std/internal/1.0.5/build_message.ts +134 -0
- package/src/deps/jsr.io/@std/internal/1.0.5/diff.ts +317 -0
- package/src/deps/jsr.io/@std/internal/1.0.5/diff_str.ts +204 -0
- package/src/deps/jsr.io/@std/internal/1.0.5/format.ts +39 -0
- package/src/deps/jsr.io/@std/internal/1.0.5/styles.ts +233 -0
- package/src/deps/jsr.io/@std/internal/1.0.5/types.ts +18 -0
- package/src/mod.ts +3 -18
- package/src/types/Ref.ts +16 -0
- package/src/types/RootTy.ts +40 -0
- package/src/types/Ty.ts +57 -0
- package/src/types/array.ts +9 -0
- package/src/types/constant.ts +8 -0
- package/src/types/constantUnion.ts +27 -0
- package/src/types/leaves.ts +21 -0
- package/src/types/mod.ts +10 -0
- package/src/types/object.ts +15 -0
- package/src/types/std/Option.ts +15 -0
- package/src/types/std/Wrapper.ts +8 -0
- package/src/types/std/mod.ts +2 -0
- package/src/types/taggedUnion.ts +28 -0
- package/src/util/phantoms.ts +3 -0
- package/src/util/recombineTaggedTemplateArgs.ts +6 -0
- package/types/ResponseFormat.d.ts +26 -0
- package/types/ResponseFormat.d.ts.map +1 -0
- package/types/Tool.d.ts +13 -0
- package/types/Tool.d.ts.map +1 -0
- package/types/_dnt.polyfills.d.ts +12 -0
- package/types/_dnt.polyfills.d.ts.map +1 -0
- package/types/_dnt.shims.d.ts +2 -0
- package/types/_dnt.shims.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/almost_equals.d.ts +29 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/almost_equals.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/array_includes.d.ts +24 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/array_includes.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/assert.d.ts +16 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/assert.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/assertion_error.d.ts +26 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/assertion_error.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/equal.d.ts +17 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/equal.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/equals.d.ts +22 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/equals.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/exists.d.ts +18 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/exists.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/fail.d.ts +15 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/fail.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/false.d.ts +18 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/false.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/greater.d.ts +20 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/greater.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/greater_or_equal.d.ts +20 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/greater_or_equal.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/instance_of.d.ts +23 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/instance_of.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/is_error.d.ts +25 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/is_error.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/less.d.ts +19 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/less.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/less_or_equal.d.ts +20 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/less_or_equal.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/match.d.ts +18 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/match.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/mod.d.ts +44 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/mod.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/not_equals.d.ts +21 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/not_equals.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/not_instance_of.d.ts +20 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/not_instance_of.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/not_match.d.ts +18 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/not_match.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/not_strict_equals.d.ts +23 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/not_strict_equals.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/object_match.d.ts +28 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/object_match.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/rejects.d.ts +42 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/rejects.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/strict_equals.d.ts +24 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/strict_equals.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/string_includes.d.ts +18 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/string_includes.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/throws.d.ts +45 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/throws.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/unimplemented.d.ts +15 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/unimplemented.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/unreachable.d.ts +15 -0
- package/types/deps/jsr.io/@std/assert/1.0.8/unreachable.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/_utils.d.ts +6 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/_utils.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/aggregate_groups.d.ts +41 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/aggregate_groups.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/associate_by.d.ts +37 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/associate_by.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/associate_with.d.ts +33 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/associate_with.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/chunk.d.ts +38 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/chunk.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/deep_merge.d.ts +322 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/deep_merge.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/distinct.d.ts +23 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/distinct.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/distinct_by.d.ts +26 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/distinct_by.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/drop_last_while.d.ts +26 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/drop_last_while.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/drop_while.d.ts +25 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/drop_while.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/filter_entries.d.ts +32 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/filter_entries.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/filter_keys.d.ts +36 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/filter_keys.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/filter_values.d.ts +35 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/filter_values.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/find_single.d.ts +31 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/find_single.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/first_not_nullish_of.d.ts +32 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/first_not_nullish_of.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/includes_value.d.ts +29 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/includes_value.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/intersect.d.ts +25 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/intersect.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/invert.d.ts +29 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/invert.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/invert_by.d.ts +34 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/invert_by.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/join_to_string.d.ts +75 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/join_to_string.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/map_entries.d.ts +37 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/map_entries.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/map_keys.d.ts +33 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/map_keys.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/map_not_nullish.d.ts +32 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/map_not_nullish.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/map_values.d.ts +71 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/map_values.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/max_by.d.ts +117 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/max_by.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/max_of.d.ts +61 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/max_of.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/max_with.d.ts +29 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/max_with.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/min_by.d.ts +115 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/min_by.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/min_of.d.ts +61 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/min_of.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/min_with.d.ts +25 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/min_with.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/mod.d.ts +73 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/mod.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/omit.d.ts +24 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/omit.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/partition.d.ts +60 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/partition.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/partition_entries.d.ts +39 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/partition_entries.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/permutations.d.ts +27 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/permutations.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/pick.d.ts +25 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/pick.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/reduce_groups.d.ts +35 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/reduce_groups.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/running_reduce.d.ts +27 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/running_reduce.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/sample.d.ts +24 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/sample.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/sliding_windows.d.ts +66 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/sliding_windows.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/sort_by.d.ts +161 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/sort_by.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/sum_of.d.ts +29 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/sum_of.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/take_last_while.d.ts +27 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/take_last_while.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/take_while.d.ts +30 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/take_while.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/union.d.ts +24 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/union.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/unzip.d.ts +32 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/unzip.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/without_all.d.ts +23 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/without_all.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/zip.d.ts +34 -0
- package/types/deps/jsr.io/@std/collections/1.0.9/zip.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/internal/1.0.5/build_message.d.ts +82 -0
- package/types/deps/jsr.io/@std/internal/1.0.5/build_message.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/internal/1.0.5/diff.d.ts +140 -0
- package/types/deps/jsr.io/@std/internal/1.0.5/diff.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/internal/1.0.5/diff_str.d.ts +99 -0
- package/types/deps/jsr.io/@std/internal/1.0.5/diff_str.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/internal/1.0.5/format.d.ts +2 -0
- package/types/deps/jsr.io/@std/internal/1.0.5/format.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/internal/1.0.5/styles.d.ts +159 -0
- package/types/deps/jsr.io/@std/internal/1.0.5/styles.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/internal/1.0.5/types.d.ts +16 -0
- package/types/deps/jsr.io/@std/internal/1.0.5/types.d.ts.map +1 -0
- package/types/mod.d.ts +5 -0
- package/types/mod.d.ts.map +1 -0
- package/types/types/Ref.d.ts +4 -0
- package/types/types/Ref.d.ts.map +1 -0
- package/types/types/RootTy.d.ts +8 -0
- package/types/types/RootTy.d.ts.map +1 -0
- package/types/types/Ty.d.ts +27 -0
- package/types/types/Ty.d.ts.map +1 -0
- package/types/types/array.d.ts +3 -0
- package/types/types/array.d.ts.map +1 -0
- package/types/types/constant.d.ts +3 -0
- package/types/types/constant.d.ts.map +1 -0
- package/types/types/constantUnion.d.ts +3 -0
- package/types/types/constantUnion.d.ts.map +1 -0
- package/types/types/leaves.d.ts +6 -0
- package/types/types/leaves.d.ts.map +1 -0
- package/types/types/mod.d.ts +11 -0
- package/types/types/mod.d.ts.map +1 -0
- package/types/types/object.d.ts +6 -0
- package/types/types/object.d.ts.map +1 -0
- package/types/types/std/Option.d.ts +7 -0
- package/types/types/std/Option.d.ts.map +1 -0
- package/types/types/std/Wrapper.d.ts +7 -0
- package/types/types/std/Wrapper.d.ts.map +1 -0
- package/types/types/std/mod.d.ts +3 -0
- package/types/types/std/mod.d.ts.map +1 -0
- package/types/types/taggedUnion.d.ts +8 -0
- package/types/types/taggedUnion.d.ts.map +1 -0
- package/types/util/phantoms.d.ts +2 -0
- package/types/util/phantoms.d.ts.map +1 -0
- package/types/util/recombineTaggedTemplateArgs.d.ts +2 -0
- package/types/util/recombineTaggedTemplateArgs.d.ts.map +1 -0
- package/esm/F.d.ts +0 -13
- package/esm/F.d.ts.map +0 -1
- package/esm/F.js +0 -10
- package/esm/F.js.map +0 -1
- package/esm/ResponseFormat.d.ts +0 -14
- package/esm/ResponseFormat.d.ts.map +0 -1
- package/esm/_base.d.ts +0 -13
- package/esm/_base.d.ts.map +0 -1
- package/esm/_base.js +0 -40
- package/esm/_base.js.map +0 -1
- package/esm/array.d.ts +0 -4
- package/esm/array.d.ts.map +0 -1
- package/esm/array.js +0 -9
- package/esm/array.js.map +0 -1
- package/esm/common.d.ts +0 -6
- package/esm/common.d.ts.map +0 -1
- package/esm/common.js +0 -2
- package/esm/common.js.map +0 -1
- package/esm/literal.d.ts +0 -4
- package/esm/literal.d.ts.map +0 -1
- package/esm/literal.js +0 -8
- package/esm/literal.js.map +0 -1
- package/esm/mod.d.ts +0 -16
- package/esm/mod.d.ts.map +0 -1
- package/esm/number.d.ts +0 -4
- package/esm/number.d.ts.map +0 -1
- package/esm/number.js +0 -8
- package/esm/number.js.map +0 -1
- package/esm/object.d.ts +0 -7
- package/esm/object.d.ts.map +0 -1
- package/esm/object.js.map +0 -1
- package/esm/schema.d.ts +0 -4
- package/esm/schema.d.ts.map +0 -1
- package/esm/schema.js +0 -9
- package/esm/schema.js.map +0 -1
- package/esm/string.d.ts +0 -4
- package/esm/string.d.ts.map +0 -1
- package/esm/string.js +0 -8
- package/esm/string.js.map +0 -1
- package/esm/union.d.ts +0 -6
- package/esm/union.d.ts.map +0 -1
- package/esm/union.js +0 -8
- package/esm/union.js.map +0 -1
- package/src/F.ts +0 -27
- package/src/_base.ts +0 -25
- package/src/array.ts +0 -11
- package/src/common.ts +0 -6
- package/src/literal.ts +0 -10
- package/src/number.ts +0 -10
- package/src/object.ts +0 -17
- package/src/schema.ts +0 -10
- package/src/string.ts +0 -10
- package/src/union.ts +0 -12
|
@@ -0,0 +1,578 @@
|
|
|
1
|
+
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
|
|
2
|
+
// This module is browser compatible.
|
|
3
|
+
|
|
4
|
+
import { filterInPlace } from "./_utils.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Merges the two given records, recursively merging any nested records with the
|
|
8
|
+
* second collection overriding the first in case of conflict.
|
|
9
|
+
*
|
|
10
|
+
* For arrays, maps and sets, a merging strategy can be specified to either
|
|
11
|
+
* `replace` values, or `merge` them instead.
|
|
12
|
+
*
|
|
13
|
+
* @typeParam T Type of the first record
|
|
14
|
+
*
|
|
15
|
+
* @param record First record to merge.
|
|
16
|
+
* @param other Second record to merge.
|
|
17
|
+
* @param options Merging options.
|
|
18
|
+
*
|
|
19
|
+
* @returns A new record with the merged values.
|
|
20
|
+
*
|
|
21
|
+
* @example Merge objects
|
|
22
|
+
* ```ts
|
|
23
|
+
* import { deepMerge } from "@std/collections/deep-merge";
|
|
24
|
+
* import { assertEquals } from "@std/assert";
|
|
25
|
+
*
|
|
26
|
+
* const a = { foo: true };
|
|
27
|
+
* const b = { foo: { bar: true } };
|
|
28
|
+
*
|
|
29
|
+
* const result = deepMerge(a, b);
|
|
30
|
+
*
|
|
31
|
+
* const expected = { foo: { bar: true } };
|
|
32
|
+
*
|
|
33
|
+
* assertEquals(result, expected);
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* @example Merge arrays
|
|
37
|
+
* ```ts
|
|
38
|
+
* import { deepMerge } from "@std/collections/deep-merge";
|
|
39
|
+
* import { assertEquals } from "@std/assert";
|
|
40
|
+
*
|
|
41
|
+
* const a = { foo: [1, 2] };
|
|
42
|
+
* const b = { foo: [3, 4] };
|
|
43
|
+
*
|
|
44
|
+
* const result = deepMerge(a, b);
|
|
45
|
+
*
|
|
46
|
+
* const expected = { foo: [1, 2, 3, 4] };
|
|
47
|
+
*
|
|
48
|
+
* assertEquals(result, expected);
|
|
49
|
+
* ```
|
|
50
|
+
*
|
|
51
|
+
* @example Merge maps
|
|
52
|
+
* ```ts
|
|
53
|
+
* import { deepMerge } from "@std/collections/deep-merge";
|
|
54
|
+
* import { assertEquals } from "@std/assert";
|
|
55
|
+
*
|
|
56
|
+
* const a = { foo: new Map([["a", 1]]) };
|
|
57
|
+
* const b = { foo: new Map([["b", 2]]) };
|
|
58
|
+
*
|
|
59
|
+
* const result = deepMerge(a, b);
|
|
60
|
+
*
|
|
61
|
+
* const expected = { foo: new Map([["a", 1], ["b", 2]]) };
|
|
62
|
+
*
|
|
63
|
+
* assertEquals(result, expected);
|
|
64
|
+
* ```
|
|
65
|
+
*
|
|
66
|
+
* @example Merge sets
|
|
67
|
+
* ```ts
|
|
68
|
+
* import { deepMerge } from "@std/collections/deep-merge";
|
|
69
|
+
* import { assertEquals } from "@std/assert";
|
|
70
|
+
*
|
|
71
|
+
* const a = { foo: new Set([1]) };
|
|
72
|
+
* const b = { foo: new Set([2]) };
|
|
73
|
+
*
|
|
74
|
+
* const result = deepMerge(a, b);
|
|
75
|
+
*
|
|
76
|
+
* const expected = { foo: new Set([1, 2]) };
|
|
77
|
+
*
|
|
78
|
+
* assertEquals(result, expected);
|
|
79
|
+
* ```
|
|
80
|
+
*
|
|
81
|
+
* @example Merge with custom options
|
|
82
|
+
* ```ts
|
|
83
|
+
* import { deepMerge } from "@std/collections/deep-merge";
|
|
84
|
+
* import { assertEquals } from "@std/assert";
|
|
85
|
+
*
|
|
86
|
+
* const a = { foo: [1, 2] };
|
|
87
|
+
* const b = { foo: [3, 4] };
|
|
88
|
+
*
|
|
89
|
+
* const result = deepMerge(a, b, { arrays: "replace" });
|
|
90
|
+
*
|
|
91
|
+
* const expected = { foo: [3, 4] };
|
|
92
|
+
*
|
|
93
|
+
* assertEquals(result, expected);
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
export function deepMerge<
|
|
97
|
+
T extends Record<PropertyKey, unknown>,
|
|
98
|
+
>(
|
|
99
|
+
record: Partial<Readonly<T>>,
|
|
100
|
+
other: Partial<Readonly<T>>,
|
|
101
|
+
options?: Readonly<DeepMergeOptions>,
|
|
102
|
+
): T;
|
|
103
|
+
/**
|
|
104
|
+
* Merges the two given records, recursively merging any nested records with the
|
|
105
|
+
* second collection overriding the first in case of conflict.
|
|
106
|
+
*
|
|
107
|
+
* For arrays, maps and sets, a merging strategy can be specified to either
|
|
108
|
+
* `replace` values, or `merge` them instead.
|
|
109
|
+
*
|
|
110
|
+
* @typeParam T Type of the first record
|
|
111
|
+
* @typeParam U Type of the second record
|
|
112
|
+
* @typeParam Options Merging options
|
|
113
|
+
*
|
|
114
|
+
* @param record First record to merge.
|
|
115
|
+
* @param other Second record to merge.
|
|
116
|
+
* @param options Merging options.
|
|
117
|
+
*
|
|
118
|
+
* @returns A new record with the merged values.
|
|
119
|
+
*
|
|
120
|
+
* @example Merge objects
|
|
121
|
+
* ```ts
|
|
122
|
+
* import { deepMerge } from "@std/collections/deep-merge";
|
|
123
|
+
* import { assertEquals } from "@std/assert";
|
|
124
|
+
*
|
|
125
|
+
* const a = { foo: true };
|
|
126
|
+
* const b = { foo: { bar: true } };
|
|
127
|
+
*
|
|
128
|
+
* const result = deepMerge(a, b);
|
|
129
|
+
*
|
|
130
|
+
* const expected = { foo: { bar: true } };
|
|
131
|
+
*
|
|
132
|
+
* assertEquals(result, expected);
|
|
133
|
+
* ```
|
|
134
|
+
*
|
|
135
|
+
* @example Merge arrays
|
|
136
|
+
* ```ts
|
|
137
|
+
* import { deepMerge } from "@std/collections/deep-merge";
|
|
138
|
+
* import { assertEquals } from "@std/assert";
|
|
139
|
+
*
|
|
140
|
+
* const a = { foo: [1, 2] };
|
|
141
|
+
* const b = { foo: [3, 4] };
|
|
142
|
+
*
|
|
143
|
+
* const result = deepMerge(a, b);
|
|
144
|
+
*
|
|
145
|
+
* const expected = { foo: [1, 2, 3, 4] };
|
|
146
|
+
*
|
|
147
|
+
* assertEquals(result, expected);
|
|
148
|
+
* ```
|
|
149
|
+
*
|
|
150
|
+
* @example Merge maps
|
|
151
|
+
* ```ts
|
|
152
|
+
* import { deepMerge } from "@std/collections/deep-merge";
|
|
153
|
+
* import { assertEquals } from "@std/assert";
|
|
154
|
+
*
|
|
155
|
+
* const a = { foo: new Map([["a", 1]]) };
|
|
156
|
+
* const b = { foo: new Map([["b", 2]]) };
|
|
157
|
+
*
|
|
158
|
+
* const result = deepMerge(a, b);
|
|
159
|
+
*
|
|
160
|
+
* const expected = { foo: new Map([["a", 1], ["b", 2]]) };
|
|
161
|
+
*
|
|
162
|
+
* assertEquals(result, expected);
|
|
163
|
+
* ```
|
|
164
|
+
*
|
|
165
|
+
* @example Merge sets
|
|
166
|
+
* ```ts
|
|
167
|
+
* import { deepMerge } from "@std/collections/deep-merge";
|
|
168
|
+
* import { assertEquals } from "@std/assert";
|
|
169
|
+
*
|
|
170
|
+
* const a = { foo: new Set([1]) };
|
|
171
|
+
* const b = { foo: new Set([2]) };
|
|
172
|
+
*
|
|
173
|
+
* const result = deepMerge(a, b);
|
|
174
|
+
*
|
|
175
|
+
* const expected = { foo: new Set([1, 2]) };
|
|
176
|
+
*
|
|
177
|
+
* assertEquals(result, expected);
|
|
178
|
+
* ```
|
|
179
|
+
*
|
|
180
|
+
* @example Merge with custom options
|
|
181
|
+
* ```ts
|
|
182
|
+
* import { deepMerge } from "@std/collections/deep-merge";
|
|
183
|
+
* import { assertEquals } from "@std/assert";
|
|
184
|
+
*
|
|
185
|
+
* const a = { foo: [1, 2] };
|
|
186
|
+
* const b = { foo: [3, 4] };
|
|
187
|
+
*
|
|
188
|
+
* const result = deepMerge(a, b, { arrays: "replace" });
|
|
189
|
+
*
|
|
190
|
+
* const expected = { foo: [3, 4] };
|
|
191
|
+
*
|
|
192
|
+
* assertEquals(result, expected);
|
|
193
|
+
* ```
|
|
194
|
+
*/
|
|
195
|
+
export function deepMerge<
|
|
196
|
+
T extends Record<PropertyKey, unknown>,
|
|
197
|
+
U extends Record<PropertyKey, unknown>,
|
|
198
|
+
Options extends DeepMergeOptions,
|
|
199
|
+
>(
|
|
200
|
+
record: Readonly<T>,
|
|
201
|
+
other: Readonly<U>,
|
|
202
|
+
options?: Readonly<Options>,
|
|
203
|
+
): DeepMerge<T, U, Options>;
|
|
204
|
+
export function deepMerge<
|
|
205
|
+
T extends Record<PropertyKey, unknown>,
|
|
206
|
+
U extends Record<PropertyKey, unknown>,
|
|
207
|
+
Options extends DeepMergeOptions = {
|
|
208
|
+
arrays: "merge";
|
|
209
|
+
sets: "merge";
|
|
210
|
+
maps: "merge";
|
|
211
|
+
},
|
|
212
|
+
>(
|
|
213
|
+
record: Readonly<T>,
|
|
214
|
+
other: Readonly<U>,
|
|
215
|
+
options?: Readonly<Options>,
|
|
216
|
+
): DeepMerge<T, U, Options> {
|
|
217
|
+
return deepMergeInternal(record, other, new Set(), options);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function deepMergeInternal<
|
|
221
|
+
T extends Record<PropertyKey, unknown>,
|
|
222
|
+
U extends Record<PropertyKey, unknown>,
|
|
223
|
+
Options extends DeepMergeOptions = {
|
|
224
|
+
arrays: "merge";
|
|
225
|
+
sets: "merge";
|
|
226
|
+
maps: "merge";
|
|
227
|
+
},
|
|
228
|
+
>(
|
|
229
|
+
record: Readonly<T>,
|
|
230
|
+
other: Readonly<U>,
|
|
231
|
+
seen: Set<NonNullable<unknown>>,
|
|
232
|
+
options?: Readonly<Options>,
|
|
233
|
+
) {
|
|
234
|
+
// Extract options
|
|
235
|
+
// Clone left operand to avoid performing mutations in-place
|
|
236
|
+
type Result = DeepMerge<T, U, Options>;
|
|
237
|
+
const result: Partial<Result> = {};
|
|
238
|
+
|
|
239
|
+
const keys = new Set([
|
|
240
|
+
...getKeys(record),
|
|
241
|
+
...getKeys(other),
|
|
242
|
+
]) as Set<keyof Result>;
|
|
243
|
+
|
|
244
|
+
// Iterate through each key of other object and use correct merging strategy
|
|
245
|
+
for (const key of keys) {
|
|
246
|
+
// Skip to prevent Object.prototype.__proto__ accessor property calls on non-Deno platforms
|
|
247
|
+
if (key === "__proto__") {
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
type ResultMember = Result[typeof key];
|
|
252
|
+
|
|
253
|
+
const a = record[key] as ResultMember;
|
|
254
|
+
|
|
255
|
+
if (!Object.hasOwn(other, key)) {
|
|
256
|
+
result[key] = a;
|
|
257
|
+
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
const b = other[key] as ResultMember;
|
|
262
|
+
|
|
263
|
+
if (
|
|
264
|
+
isNonNullObject(a) && isNonNullObject(b) && !seen.has(a) && !seen.has(b)
|
|
265
|
+
) {
|
|
266
|
+
seen.add(a);
|
|
267
|
+
seen.add(b);
|
|
268
|
+
result[key] = mergeObjects(a, b, seen, options) as ResultMember;
|
|
269
|
+
|
|
270
|
+
continue;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// Override value
|
|
274
|
+
result[key] = b;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
return result as Result;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
function mergeObjects(
|
|
281
|
+
left: Readonly<NonNullable<Record<string, unknown>>>,
|
|
282
|
+
right: Readonly<NonNullable<Record<string, unknown>>>,
|
|
283
|
+
seen: Set<NonNullable<unknown>>,
|
|
284
|
+
options: Readonly<DeepMergeOptions> = {
|
|
285
|
+
arrays: "merge",
|
|
286
|
+
sets: "merge",
|
|
287
|
+
maps: "merge",
|
|
288
|
+
},
|
|
289
|
+
): Readonly<NonNullable<Record<string, unknown> | Iterable<unknown>>> {
|
|
290
|
+
// Recursively merge mergeable objects
|
|
291
|
+
if (isMergeable(left) && isMergeable(right)) {
|
|
292
|
+
return deepMergeInternal(left, right, seen, options);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
if (isIterable(left) && isIterable(right)) {
|
|
296
|
+
// Handle arrays
|
|
297
|
+
if ((Array.isArray(left)) && (Array.isArray(right))) {
|
|
298
|
+
if (options.arrays === "merge") {
|
|
299
|
+
return left.concat(right);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
return right;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// Handle maps
|
|
306
|
+
if ((left instanceof Map) && (right instanceof Map)) {
|
|
307
|
+
if (options.maps === "merge") {
|
|
308
|
+
return new Map([
|
|
309
|
+
...left,
|
|
310
|
+
...right,
|
|
311
|
+
]);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
return right;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// Handle sets
|
|
318
|
+
if ((left instanceof Set) && (right instanceof Set)) {
|
|
319
|
+
if (options.sets === "merge") {
|
|
320
|
+
return new Set([
|
|
321
|
+
...left,
|
|
322
|
+
...right,
|
|
323
|
+
]);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
return right;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
return right;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* Test whether a value is mergeable or not
|
|
335
|
+
* Builtins that look like objects, null and user defined classes
|
|
336
|
+
* are not considered mergeable (it means that reference will be copied)
|
|
337
|
+
*/
|
|
338
|
+
function isMergeable(
|
|
339
|
+
value: NonNullable<unknown>,
|
|
340
|
+
): value is Record<PropertyKey, unknown> {
|
|
341
|
+
return Object.getPrototypeOf(value) === Object.prototype;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
function isIterable(
|
|
345
|
+
value: NonNullable<unknown>,
|
|
346
|
+
): value is Iterable<unknown> {
|
|
347
|
+
return typeof (value as Iterable<unknown>)[Symbol.iterator] === "function";
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
function isNonNullObject(
|
|
351
|
+
value: unknown,
|
|
352
|
+
): value is NonNullable<Record<string, unknown>> {
|
|
353
|
+
return value !== null && typeof value === "object";
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
function getKeys<T extends Record<string, unknown>>(record: T): Array<keyof T> {
|
|
357
|
+
const result = Object.getOwnPropertySymbols(record) as Array<keyof T>;
|
|
358
|
+
filterInPlace(
|
|
359
|
+
result,
|
|
360
|
+
(key) => Object.prototype.propertyIsEnumerable.call(record, key),
|
|
361
|
+
);
|
|
362
|
+
result.push(...(Object.keys(record) as Array<keyof T>));
|
|
363
|
+
|
|
364
|
+
return result;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/** Merging strategy */
|
|
368
|
+
export type MergingStrategy = "replace" | "merge";
|
|
369
|
+
|
|
370
|
+
/** Options for {@linkcode deepMerge}. */
|
|
371
|
+
export type DeepMergeOptions = {
|
|
372
|
+
/**
|
|
373
|
+
* Merging strategy for arrays
|
|
374
|
+
*
|
|
375
|
+
* @default {"merge"}
|
|
376
|
+
*/
|
|
377
|
+
arrays?: MergingStrategy;
|
|
378
|
+
/**
|
|
379
|
+
* Merging strategy for maps.
|
|
380
|
+
*
|
|
381
|
+
* @default {"merge"}
|
|
382
|
+
*/
|
|
383
|
+
maps?: MergingStrategy;
|
|
384
|
+
/**
|
|
385
|
+
* Merging strategy for sets.
|
|
386
|
+
*
|
|
387
|
+
* @default {"merge"}
|
|
388
|
+
*/
|
|
389
|
+
sets?: MergingStrategy;
|
|
390
|
+
};
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* How does recursive typing works ?
|
|
394
|
+
*
|
|
395
|
+
* Deep merging process is handled through `DeepMerge<T, U, Options>` type.
|
|
396
|
+
* If both T and U are Records, we recursively merge them,
|
|
397
|
+
* else we treat them as primitives.
|
|
398
|
+
*
|
|
399
|
+
* Merging process is handled through `Merge<T, U>` type, in which
|
|
400
|
+
* we remove all maps, sets, arrays and records so we can handle them
|
|
401
|
+
* separately depending on merging strategy:
|
|
402
|
+
*
|
|
403
|
+
* Merge<
|
|
404
|
+
* {foo: string},
|
|
405
|
+
* {bar: string, baz: Set<unknown>},
|
|
406
|
+
* > // "foo" and "bar" will be handled with `MergeRightOmitComplexes`
|
|
407
|
+
* // "baz" will be handled with `MergeAll*` type
|
|
408
|
+
*
|
|
409
|
+
* `MergeRightOmitComplexes<T, U>` will do the above: all T's
|
|
410
|
+
* exclusive keys will be kept, though common ones with U will have their
|
|
411
|
+
* typing overridden instead:
|
|
412
|
+
*
|
|
413
|
+
* MergeRightOmitComplexes<
|
|
414
|
+
* {foo: string, baz: number},
|
|
415
|
+
* {foo: boolean, bar: string}
|
|
416
|
+
* > // {baz: number, foo: boolean, bar: string}
|
|
417
|
+
* // "baz" was kept from T
|
|
418
|
+
* // "foo" was overridden by U's typing
|
|
419
|
+
* // "bar" was added from U
|
|
420
|
+
*
|
|
421
|
+
* For Maps, Arrays, Sets and Records, we use `MergeAll*<T, U>` utility
|
|
422
|
+
* types. They will extract relevant data structure from both T and U
|
|
423
|
+
* (providing that both have same data data structure, except for typing).
|
|
424
|
+
*
|
|
425
|
+
* From these, `*ValueType<T>` will extract values (and keys) types to be
|
|
426
|
+
* able to create a new data structure with an union typing from both
|
|
427
|
+
* data structure of T and U:
|
|
428
|
+
*
|
|
429
|
+
* MergeAllSets<
|
|
430
|
+
* {foo: Set<number>},
|
|
431
|
+
* {foo: Set<string>}
|
|
432
|
+
* > // `SetValueType` will extract "number" for T
|
|
433
|
+
* // `SetValueType` will extract "string" for U
|
|
434
|
+
* // `MergeAllSets` will infer type as Set<number|string>
|
|
435
|
+
* // Process is similar for Maps, Arrays, and Sets
|
|
436
|
+
*
|
|
437
|
+
* `DeepMerge<T, U, Options>` is taking a third argument to be handle to
|
|
438
|
+
* infer final typing depending on merging strategy:
|
|
439
|
+
*
|
|
440
|
+
* & (Options extends { sets: "replace" } ? PartialByType<U, Set<unknown>>
|
|
441
|
+
* : MergeAllSets<T, U>)
|
|
442
|
+
*
|
|
443
|
+
* In the above line, if "Options" have its merging strategy for Sets set to
|
|
444
|
+
* "replace", instead of performing merging of Sets type, it will take the
|
|
445
|
+
* typing from right operand (U) instead, effectively replacing the typing.
|
|
446
|
+
*
|
|
447
|
+
* An additional note, we use `ExpandRecursively<T>` utility type to expand
|
|
448
|
+
* the resulting typing and hide all the typing logic of deep merging so it is
|
|
449
|
+
* more user friendly.
|
|
450
|
+
*/
|
|
451
|
+
|
|
452
|
+
/** Force intellisense to expand the typing to hide merging typings */
|
|
453
|
+
export type ExpandRecursively<T> = T extends Record<PropertyKey, unknown>
|
|
454
|
+
? T extends infer O ? { [K in keyof O]: ExpandRecursively<O[K]> } : never
|
|
455
|
+
: T;
|
|
456
|
+
|
|
457
|
+
/** Filter of keys matching a given type */
|
|
458
|
+
export type PartialByType<T, U> = {
|
|
459
|
+
[K in keyof T as T[K] extends U ? K : never]: T[K];
|
|
460
|
+
};
|
|
461
|
+
|
|
462
|
+
/** Get set values type */
|
|
463
|
+
export type SetValueType<T> = T extends Set<infer V> ? V : never;
|
|
464
|
+
|
|
465
|
+
/** Merge all sets types definitions from keys present in both objects */
|
|
466
|
+
export type MergeAllSets<
|
|
467
|
+
T,
|
|
468
|
+
U,
|
|
469
|
+
X = PartialByType<T, Set<unknown>>,
|
|
470
|
+
Y = PartialByType<U, Set<unknown>>,
|
|
471
|
+
Z = {
|
|
472
|
+
[K in keyof X & keyof Y]: Set<SetValueType<X[K]> | SetValueType<Y[K]>>;
|
|
473
|
+
},
|
|
474
|
+
> = Z;
|
|
475
|
+
|
|
476
|
+
/** Get array values type */
|
|
477
|
+
export type ArrayValueType<T> = T extends Array<infer V> ? V : never;
|
|
478
|
+
|
|
479
|
+
/** Merge all sets types definitions from keys present in both objects */
|
|
480
|
+
export type MergeAllArrays<
|
|
481
|
+
T,
|
|
482
|
+
U,
|
|
483
|
+
X = PartialByType<T, Array<unknown>>,
|
|
484
|
+
Y = PartialByType<U, Array<unknown>>,
|
|
485
|
+
Z = {
|
|
486
|
+
[K in keyof X & keyof Y]: Array<
|
|
487
|
+
ArrayValueType<X[K]> | ArrayValueType<Y[K]>
|
|
488
|
+
>;
|
|
489
|
+
},
|
|
490
|
+
> = Z;
|
|
491
|
+
|
|
492
|
+
/** Get map values types */
|
|
493
|
+
export type MapKeyType<T> = T extends Map<infer K, unknown> ? K : never;
|
|
494
|
+
|
|
495
|
+
/** Get map values types */
|
|
496
|
+
export type MapValueType<T> = T extends Map<unknown, infer V> ? V : never;
|
|
497
|
+
|
|
498
|
+
/** Merge all sets types definitions from keys present in both objects */
|
|
499
|
+
export type MergeAllMaps<
|
|
500
|
+
T,
|
|
501
|
+
U,
|
|
502
|
+
X = PartialByType<T, Map<unknown, unknown>>,
|
|
503
|
+
Y = PartialByType<U, Map<unknown, unknown>>,
|
|
504
|
+
Z = {
|
|
505
|
+
[K in keyof X & keyof Y]: Map<
|
|
506
|
+
MapKeyType<X[K]> | MapKeyType<Y[K]>,
|
|
507
|
+
MapValueType<X[K]> | MapValueType<Y[K]>
|
|
508
|
+
>;
|
|
509
|
+
},
|
|
510
|
+
> = Z;
|
|
511
|
+
|
|
512
|
+
/** Merge all records types definitions from keys present in both objects */
|
|
513
|
+
export type MergeAllRecords<
|
|
514
|
+
T,
|
|
515
|
+
U,
|
|
516
|
+
Options,
|
|
517
|
+
X = PartialByType<T, Record<PropertyKey, unknown>>,
|
|
518
|
+
Y = PartialByType<U, Record<PropertyKey, unknown>>,
|
|
519
|
+
Z = {
|
|
520
|
+
[K in keyof X & keyof Y]: DeepMerge<X[K], Y[K], Options>;
|
|
521
|
+
},
|
|
522
|
+
> = Z;
|
|
523
|
+
|
|
524
|
+
/** Exclude map, sets and array from type */
|
|
525
|
+
export type OmitComplexes<T> = Omit<
|
|
526
|
+
T,
|
|
527
|
+
keyof PartialByType<
|
|
528
|
+
T,
|
|
529
|
+
| Map<unknown, unknown>
|
|
530
|
+
| Set<unknown>
|
|
531
|
+
| Array<unknown>
|
|
532
|
+
| Record<PropertyKey, unknown>
|
|
533
|
+
>
|
|
534
|
+
>;
|
|
535
|
+
|
|
536
|
+
/** Object with keys in either T or U but not in both */
|
|
537
|
+
export type ObjectXorKeys<
|
|
538
|
+
T,
|
|
539
|
+
U,
|
|
540
|
+
X = Omit<T, keyof U> & Omit<U, keyof T>,
|
|
541
|
+
Y = { [K in keyof X]: X[K] },
|
|
542
|
+
> = Y;
|
|
543
|
+
|
|
544
|
+
/** Merge two objects, with left precedence */
|
|
545
|
+
export type MergeRightOmitComplexes<
|
|
546
|
+
T,
|
|
547
|
+
U,
|
|
548
|
+
X = ObjectXorKeys<T, U> & OmitComplexes<{ [K in keyof U]: U[K] }>,
|
|
549
|
+
> = X;
|
|
550
|
+
|
|
551
|
+
/** Merge two objects */
|
|
552
|
+
export type Merge<
|
|
553
|
+
T,
|
|
554
|
+
U,
|
|
555
|
+
Options,
|
|
556
|
+
X =
|
|
557
|
+
& MergeRightOmitComplexes<T, U>
|
|
558
|
+
& MergeAllRecords<T, U, Options>
|
|
559
|
+
& (Options extends { sets: "replace" } ? PartialByType<U, Set<unknown>>
|
|
560
|
+
: MergeAllSets<T, U>)
|
|
561
|
+
& (Options extends { arrays: "replace" } ? PartialByType<U, Array<unknown>>
|
|
562
|
+
: MergeAllArrays<T, U>)
|
|
563
|
+
& (Options extends { maps: "replace" }
|
|
564
|
+
? PartialByType<U, Map<unknown, unknown>>
|
|
565
|
+
: MergeAllMaps<T, U>),
|
|
566
|
+
> = ExpandRecursively<X>;
|
|
567
|
+
|
|
568
|
+
/** Merge deeply two objects */
|
|
569
|
+
export type DeepMerge<
|
|
570
|
+
T,
|
|
571
|
+
U,
|
|
572
|
+
Options = Record<string, MergingStrategy>,
|
|
573
|
+
> =
|
|
574
|
+
// Handle objects
|
|
575
|
+
[T, U] extends [Record<PropertyKey, unknown>, Record<PropertyKey, unknown>]
|
|
576
|
+
? Merge<T, U, Options>
|
|
577
|
+
// Handle primitives
|
|
578
|
+
: T | U;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
|
|
2
|
+
// This module is browser compatible.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Returns all distinct elements in the given array, preserving order by first
|
|
6
|
+
* occurrence.
|
|
7
|
+
*
|
|
8
|
+
* @typeParam T The type of the elements in the input array.
|
|
9
|
+
*
|
|
10
|
+
* @param array The array to filter for distinct elements.
|
|
11
|
+
*
|
|
12
|
+
* @returns An array of distinct elements in the input array.
|
|
13
|
+
*
|
|
14
|
+
* @example Basic usage
|
|
15
|
+
* ```ts
|
|
16
|
+
* import { distinct } from "@std/collections/distinct";
|
|
17
|
+
* import { assertEquals } from "@std/assert";
|
|
18
|
+
*
|
|
19
|
+
* const numbers = [3, 2, 5, 2, 5];
|
|
20
|
+
* const distinctNumbers = distinct(numbers);
|
|
21
|
+
*
|
|
22
|
+
* assertEquals(distinctNumbers, [3, 2, 5]);
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export function distinct<T>(array: Iterable<T>): T[] {
|
|
26
|
+
const set = new Set(array);
|
|
27
|
+
|
|
28
|
+
return Array.from(set);
|
|
29
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
|
|
2
|
+
// This module is browser compatible.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Returns all elements in the given array that produce a distinct value using
|
|
6
|
+
* the given selector, preserving order by first occurrence.
|
|
7
|
+
*
|
|
8
|
+
* @typeParam T The type of the elements in the input array.
|
|
9
|
+
* @typeParam D The type of the values produced by the selector function.
|
|
10
|
+
*
|
|
11
|
+
* @param array The array to filter for distinct elements.
|
|
12
|
+
* @param selector The function to extract the value to compare for
|
|
13
|
+
* distinctness.
|
|
14
|
+
*
|
|
15
|
+
* @returns An array of distinct elements in the input array.
|
|
16
|
+
*
|
|
17
|
+
* @example Basic usage
|
|
18
|
+
* ```ts
|
|
19
|
+
* import { distinctBy } from "@std/collections/distinct-by";
|
|
20
|
+
* import { assertEquals } from "@std/assert";
|
|
21
|
+
*
|
|
22
|
+
* const names = ["Anna", "Kim", "Arnold", "Kate"];
|
|
23
|
+
* const exampleNamesByFirstLetter = distinctBy(names, (name) => name.charAt(0));
|
|
24
|
+
*
|
|
25
|
+
* assertEquals(exampleNamesByFirstLetter, ["Anna", "Kim"]);
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export function distinctBy<T, D>(
|
|
29
|
+
array: Iterable<T>,
|
|
30
|
+
selector: (el: T) => D,
|
|
31
|
+
): T[] {
|
|
32
|
+
const selectedValues = new Set<D>();
|
|
33
|
+
const result: T[] = [];
|
|
34
|
+
for (const element of array) {
|
|
35
|
+
const selected = selector(element);
|
|
36
|
+
if (!selectedValues.has(selected)) {
|
|
37
|
+
selectedValues.add(selected);
|
|
38
|
+
result.push(element);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
|
|
2
|
+
// This module is browser compatible.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Returns a new array that drops all elements in the given collection until the
|
|
6
|
+
* last element that does not match the given predicate.
|
|
7
|
+
*
|
|
8
|
+
* @typeParam T The type of the elements in the input array.
|
|
9
|
+
*
|
|
10
|
+
* @param array The array to drop elements from.
|
|
11
|
+
* @param predicate The function to test each element for a condition.
|
|
12
|
+
*
|
|
13
|
+
* @returns A new array that drops all elements until the last element that does
|
|
14
|
+
* not match the given predicate.
|
|
15
|
+
*
|
|
16
|
+
* @example Basic usage
|
|
17
|
+
* ```ts
|
|
18
|
+
* import { dropLastWhile } from "@std/collections/drop-last-while";
|
|
19
|
+
* import { assertEquals } from "@std/assert";
|
|
20
|
+
*
|
|
21
|
+
* const numbers = [11, 42, 55, 20, 33, 44];
|
|
22
|
+
*
|
|
23
|
+
* const notFortyFour = dropLastWhile(numbers, (number) => number > 30);
|
|
24
|
+
*
|
|
25
|
+
* assertEquals(notFortyFour, [11, 42, 55, 20]);
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export function dropLastWhile<T>(
|
|
29
|
+
array: readonly T[],
|
|
30
|
+
predicate: (el: T) => boolean,
|
|
31
|
+
): T[] {
|
|
32
|
+
let offset = array.length;
|
|
33
|
+
while (0 < offset && predicate(array[offset - 1] as T)) offset--;
|
|
34
|
+
|
|
35
|
+
return array.slice(0, offset);
|
|
36
|
+
}
|